In this case the phi-node created for the return value ends up with a missing operand, violating the semantic of the phi-node: map one value with each predecessor. Add testcases for these missing returns. Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> --- validation/linear/missing-return0.c | 11 +++++++++++ validation/linear/missing-return1.c | 16 ++++++++++++++++ validation/linear/missing-return2.c | 12 ++++++++++++ validation/linear/missing-return3.c | 19 +++++++++++++++++++ validation/linear/missing-return4.c | 15 +++++++++++++++ validation/linear/missing-return5.c | 24 ++++++++++++++++++++++++ 6 files changed, 97 insertions(+) create mode 100644 validation/linear/missing-return0.c create mode 100644 validation/linear/missing-return1.c create mode 100644 validation/linear/missing-return2.c create mode 100644 validation/linear/missing-return3.c create mode 100644 validation/linear/missing-return4.c create mode 100644 validation/linear/missing-return5.c diff --git a/validation/linear/missing-return0.c b/validation/linear/missing-return0.c new file mode 100644 index 000000000..d6019941c --- /dev/null +++ b/validation/linear/missing-return0.c @@ -0,0 +1,11 @@ +static int foo(int a) +{ + if (a) + return 1; +} + +/* + * check-name: missing-return0 + * check-command: sparse -vir -flinearize=last $file + * check-known-to-fail + */ diff --git a/validation/linear/missing-return1.c b/validation/linear/missing-return1.c new file mode 100644 index 000000000..c13135ada --- /dev/null +++ b/validation/linear/missing-return1.c @@ -0,0 +1,16 @@ +static inline int fun(int a) +{ + if (a) + return 1; +} + +static int foo(int a) +{ + return fun(a); +} + +/* + * check-name: missing-return1 + * check-command: sparse -vir -flinearize=last $file + * check-known-to-fail + */ diff --git a/validation/linear/missing-return2.c b/validation/linear/missing-return2.c new file mode 100644 index 000000000..c1959b6f3 --- /dev/null +++ b/validation/linear/missing-return2.c @@ -0,0 +1,12 @@ +static int foo(int a) +{ + switch (a) + case 3: + return 4; +} + +/* + * check-name: missing-return2 + * check-command: sparse -vir -flinearize=last $file + * check-known-to-fail + */ diff --git a/validation/linear/missing-return3.c b/validation/linear/missing-return3.c new file mode 100644 index 000000000..57a03a737 --- /dev/null +++ b/validation/linear/missing-return3.c @@ -0,0 +1,19 @@ +static int foo(int a) +{ + if (a) + return; +} + +static void ref(void) +{ +} + +/* + * check-name: missing-return3 + * check-command: sparse -vir -flinearize=last $file + * check-known-to-fail + * + * check-error-start +linear/missing-return3.c:4:17: error: return with no return value + * check-error-end + */ diff --git a/validation/linear/missing-return4.c b/validation/linear/missing-return4.c new file mode 100644 index 000000000..dd30988b0 --- /dev/null +++ b/validation/linear/missing-return4.c @@ -0,0 +1,15 @@ +static int foo(int a) +{ + int r = a; + r; +} + +/* + * check-name: missing-return4 + * check-command: test-linearize -Wno-decl $file + * check-known-to-fail + * + * check-error-ignore + * check-output-ignore + * check-output-contains: ret\\..*UNDEF + */ diff --git a/validation/linear/missing-return5.c b/validation/linear/missing-return5.c new file mode 100644 index 000000000..bcabd16a1 --- /dev/null +++ b/validation/linear/missing-return5.c @@ -0,0 +1,24 @@ +int foo(int p) +{ + if (p) + return 0; +} + +int bar(int p) +{ + if (p) + return 0; + p++; +} + +/* + * check-name: missing/undef return + * check-command: test-linearize -Wno-decl -fdump-ir=linearize $file + * check-known-to-fail + * + * check-output-ignore + * check-output-pattern(2): phi\\..*,.* + * check-output-pattern(2): phisrc\\..*\\$0 + * check-output-pattern(2): phisrc\\..*UNDEF + * check-output-excludes: ret\\..*\\$0 + */ -- 2.18.0