diff options
author | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-04-12 09:26:22 +0200 |
---|---|---|
committer | Luc Van Oostenryck <luc.vanoostenryck@gmail.com> | 2020-05-21 17:27:45 +0200 |
commit | 633a390c169082646e7172c753f319568ef22695 (patch) | |
tree | 77b6196e9d4175a006684ceb0627a3fa12e5c625 | |
parent | 0b6d161ed1cc0f2226482d64c56fe9dc89bc0ebf (diff) | |
download | sparse-633a390c169082646e7172c753f319568ef22695.tar.gz |
bad-goto: reorganize testcases and add some more
Reorganize the testcases related to the 'scope' of labels
and add a few new ones.
Also, some related testcases have some unreported errors other
than the features being tested. This is a problem since such
tescases can still fail after the feature being tested is fixed
or implemented. So, fix these testcases or split them so that
they each test a unique feature.
Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@gmail.com>
18 files changed, 332 insertions, 13 deletions
diff --git a/validation/__func__-scope.c b/validation/__func__-scope.c new file mode 100644 index 00000000..508a8b91 --- /dev/null +++ b/validation/__func__-scope.c @@ -0,0 +1,8 @@ +static void foo(void) +{ + const char *name = ({ __func__; }); +} +/* + * check-name: __func__'s scope + * check-command: sparse -Wall $file + */ diff --git a/validation/asm-goto-lables.c b/validation/asm-goto-labels.c index ac2bf2ad..ac2bf2ad 100644 --- a/validation/asm-goto-lables.c +++ b/validation/asm-goto-labels.c diff --git a/validation/label-asm.c b/validation/label-asm.c index 411020ac..b58d1e52 100644 --- a/validation/label-asm.c +++ b/validation/label-asm.c @@ -3,6 +3,7 @@ static void f(void) { barrier(); + goto l; l: barrier(); } diff --git a/validation/label-attr.c b/validation/label-attr.c index a82d7bc9..81c4ac3c 100644 --- a/validation/label-attr.c +++ b/validation/label-attr.c @@ -1,6 +1,6 @@ static int foo(void) { - return 0; + goto rtattr_failure; rtattr_failure: __attribute__ ((unused)) return -1; } diff --git a/validation/label-scope-cgoto.c b/validation/label-scope-cgoto.c new file mode 100644 index 00000000..c5d278d3 --- /dev/null +++ b/validation/label-scope-cgoto.c @@ -0,0 +1,83 @@ +void foo(void) +{ + void *p = &&l; + { +l: ; + } + goto *p; // OK +} + +void bar(void) +{ + void *p = &&l; // KO: 'jump' inside + ({ +l: 1; + }); + goto *p; +} + +void baz(void) +{ + void *p = &&l; // KO: 'jump' inside + 0 ? 1 : ({ +l: 1; + }); + goto *p; +} + +void qux(void) +{ + void *p = &&l; // KO: 'jump' inside + removed + 1 ? 1 : ({ +l: 1; + }); + goto *p; +} + +void quz(void) +{ + void *p; + p = &&l; // KO: undeclared + goto *p; +} + +void qxu(void) +{ + void *p; + ({ +l: 1; + }); + p = &&l; // KO: 'jump' inside + goto *p; +} + +void qzu(void) +{ + void *p; + 1 ? 1 : ({ +l: 1; + }); + p = &&l; // KO: 'jump' inside + removed + goto *p; +} + + +/* + * check-name: label-scope-cgoto + * check-command: sparse -Wno-decl $file + * check-known-to-fail + * + * check-error-start +label-scope-cgoto.c:12:19: error: label 'l' used outside statement expression +label-scope-cgoto.c:14:1: label 'l' defined here +label-scope-cgoto.c:21:19: error: label 'l' used outside statement expression +label-scope-cgoto.c:23:1: label 'l' defined here +label-scope-cgoto.c:30:19: error: label 'l' used outside statement expression +label-scope-cgoto.c:32:1: label 'l' defined here +label-scope-cgoto.c:50:13: error: label 'l' used outside statement expression +label-scope-cgoto.c:48:1: label 'l' defined here +label-scope-cgoto.c:60:13: error: label 'l' used outside statement expression +label-scope-cgoto.c:58:1: label 'l' defined here +label-scope-cgoto.c:40:13: error: label 'l' was not declared + * check-error-end + */ diff --git a/validation/label-scope.c b/validation/label-scope.c index 7af3d916..0ffaaf4a 100644 --- a/validation/label-scope.c +++ b/validation/label-scope.c @@ -3,10 +3,7 @@ static int f(int n) __label__ n; n: return n; } -static int g(int n) -{ -n: return n; -} + /* * check-name: __label__ scope */ diff --git a/validation/label-scope1.c b/validation/label-scope1.c new file mode 100644 index 00000000..f2b1ae9b --- /dev/null +++ b/validation/label-scope1.c @@ -0,0 +1,42 @@ +static void ok_top(void) +{ + __label__ l; +l: + goto l; +} + +static void ko_undecl(void) +{ + __label__ l; + goto l; // KO: undeclared +} + +static void ok_local(void) +{ +l: + { + __label__ l; +l: + goto l; + } +goto l; +} + +static void ko_scope(void) +{ + { + __label__ l; +l: + goto l; + } +goto l; // KO: undeclared +} + +/* + * check-name: label-scope1 + * + * check-error-start +label-scope1.c:11:9: error: label 'l' was not declared +label-scope1.c:32:1: error: label 'l' was not declared + * check-error-end + */ diff --git a/validation/label-scope2.c b/validation/label-scope2.c new file mode 100644 index 00000000..8c04ac65 --- /dev/null +++ b/validation/label-scope2.c @@ -0,0 +1,32 @@ +static void ok_lvl2(void) +{ + __label__ l; + + { + l: + goto l; + } +} + +static void ko_expr2(void) +{ + { + __label__ a; + + ({ +a: + 0; + }); + goto a; + } +} + +/* + * check-name: label-scope2 + * check-known-to-fail + * + * check-error-start +label-scope2.c:20:17: error: label 'a' used outside statement expression +label-scope2.c:17:1: label 'a' defined here + * check-error-end + */ diff --git a/validation/label-stmt-expr0.c b/validation/label-stmt-expr0.c new file mode 100644 index 00000000..66a64902 --- /dev/null +++ b/validation/label-stmt-expr0.c @@ -0,0 +1,39 @@ +void aft(void) +{ + ({ +l: 1; + }); + goto l; // KO +} + +void bef(void) +{ + goto l; // KO + ({ +l: 1; + }); +} + +void lab(void) +{ + __label__ l; + ({ +l: 1; + }); + goto l; // KO +} + +/* + * check-name: label-stmt-expr0 + * check-command: sparse -Wno-decl $file + * check-known-to-fail + * + * check-error-start +label-stmt-expr0.c:6:9: error: label 'l' used outside statement expression +label-stmt-expr0.c:4:1: label 'l' defined here +label-stmt-expr0.c:11:9: error: label 'l' used outside statement expression +label-stmt-expr0.c:13:1: label 'l' defined here +label-stmt-expr0.c:23:9: error: label 'l' used outside statement expression +label-stmt-expr0.c:21:1: label 'l' defined here + * check-error-end + */ diff --git a/validation/label-stmt-expr2.c b/validation/label-stmt-expr2.c new file mode 100644 index 00000000..7a38e379 --- /dev/null +++ b/validation/label-stmt-expr2.c @@ -0,0 +1,47 @@ +static int foo(void) +{ + goto l; + ({ +l: + 0; + }); + goto l; +} + +static void bar(void) +{ + goto l; + goto l; + ({ +l: + 0; + }); +} + +static void baz(void) +{ + ({ +l: + 0; + }); + goto l; + goto l; +} + +/* + * check-name: label-stmt-expr2 + * check-known-to-fail + * + * check-error-start +label-stmt-expr2.c:3:9: error: label 'l' used outside statement expression +label-stmt-expr2.c:5:1: label 'l' defined here +label-stmt-expr2.c:8:9: error: label 'l' used outside statement expression +label-stmt-expr2.c:5:1: label 'l' defined here +label-stmt-expr2.c:13:9: error: label 'l' used outside statement expression +label-stmt-expr2.c:16:1: label 'l' defined here +label-stmt-expr2.c:27:9: error: label 'l' used outside statement expression +label-stmt-expr2.c:24:1: label 'l' defined here +label-stmt-expr2.c:28:9: error: label 'l' used outside statement expression +label-stmt-expr2.c:24:1: label 'l' defined here + * check-error-end + */ diff --git a/validation/label-unused.c b/validation/label-unused.c new file mode 100644 index 00000000..c136c7a8 --- /dev/null +++ b/validation/label-unused.c @@ -0,0 +1,24 @@ +static void foo(void) +{ +l: + return; +} + +static int bar(void) +{ + return ({ +l: + ; + 0; + }); +} + +/* + * check-name: label-unused + * check-known-to-fail + * + * check-error-start +label-unused.c:3:1: warning: unused label 'l' +label-unused.c:10:1: warning: unused label 'l' + * check-error-end + */ diff --git a/validation/linear/invalid-labels0.c b/validation/linear/goto-invalid.c index ae3bf728..569d0b0d 100644 --- a/validation/linear/invalid-labels0.c +++ b/validation/linear/goto-invalid.c @@ -9,11 +9,11 @@ void bar(void) } /* - * check-name: invalid-labels0 + * check-name: goto-invalid * check-command: test-linearize -Wno-decl $file * check-known-to-fail * + * check-error-ignore * check-output-ignore * check-output-excludes: END - * check-error-ignore */ diff --git a/validation/linear/goto-and-expr-stmt0.c b/validation/linear/goto-stmt-expr-conditional.c index 54881353..6576052b 100644 --- a/validation/linear/goto-and-expr-stmt0.c +++ b/validation/linear/goto-stmt-expr-conditional.c @@ -18,11 +18,11 @@ a: } /* - * check-name: goto-and-expr-stmt0 + * check-name: goto-stmt-expr-conditional * check-command: test-linearize -Wno-decl $file * check-known-to-fail * + * check-error-ignore * check-output-ignore * check-output-excludes: END - * check-error-ignore */ diff --git a/validation/linear/goto-stmt-expr-short-circuit.c b/validation/linear/goto-stmt-expr-short-circuit.c new file mode 100644 index 00000000..426315e6 --- /dev/null +++ b/validation/linear/goto-stmt-expr-short-circuit.c @@ -0,0 +1,32 @@ +int foo(int p) +{ + goto inside; + if (0 && ({ +inside: + return 1; + 2; + })) + return 3; + return 4; +} + +int bar(int p) +{ + if (0 && ({ +inside: + return 1; + 2; + })) + return 3; + goto inside; +} + +/* + * check-name: goto-stmt-expr-short-circuit + * check-command: test-linearize -Wno-decl $file + * check-known-to-fail + * + * check-error-ignore + * check-output-ignore + * check-output-excludes: END + */ diff --git a/validation/linear/label-scope-cgoto.c b/validation/linear/label-scope-cgoto.c new file mode 100644 index 00000000..592f1ce4 --- /dev/null +++ b/validation/linear/label-scope-cgoto.c @@ -0,0 +1,11 @@ +#include <label-scope-cgoto.c> + +/* + * check-name: linear/label-scope-cgoto + * check-command: test-linearize -Wno-decl -I. $file + * check-known-to-fail + * + * check-error-ignore + * check-output-ignore + * check-output-excludes: END + */ diff --git a/validation/discarded-label-statement.c b/validation/linear/label-stmt-dropped.c index b4e58ac6..74e0f2e6 100644 --- a/validation/discarded-label-statement.c +++ b/validation/linear/label-stmt-dropped.c @@ -11,11 +11,13 @@ start: r += a; r += b; + if (!r) + goto start; return r; } /* - * check-name: discarded-label-statement + * check-name: label-stmt-dropped * check-command: test-linearize $file * * check-output-ignore diff --git a/validation/label-expr.c b/validation/linear/label-stmt-expr0.c index e578ed00..ff3c0980 100644 --- a/validation/label-expr.c +++ b/validation/linear/label-stmt-expr0.c @@ -3,12 +3,12 @@ int foo(void) { int r; - r = ({ label: 1; }); + r = ({ goto label; label: 1; }); return r; } /* - * check-name: label-expr + * check-name: label-stmt-expr0 * check-command: test-linearize $file * check-output-ignore * diff --git a/validation/linear/unreachable-label0.c b/validation/linear/label-unreachable.c index 695e5cb0..a44e1211 100644 --- a/validation/linear/unreachable-label0.c +++ b/validation/linear/label-unreachable.c @@ -10,9 +10,10 @@ label: } /* - * check-name: unreachable-label0 + * check-name: label-unreachable * check-command: test-linearize $file * + * check-error-ignore * check-output-ignore * check-output-contains: ret\\. * check-output-excludes: END |