diff options
Diffstat (limited to 'clang/test/Sema/warn-unreachable.c')
-rw-r--r-- | clang/test/Sema/warn-unreachable.c | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/clang/test/Sema/warn-unreachable.c b/clang/test/Sema/warn-unreachable.c new file mode 100644 index 0000000..636513f --- /dev/null +++ b/clang/test/Sema/warn-unreachable.c @@ -0,0 +1,134 @@ +// RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code -Wno-unused-value -Wno-covered-switch-default + +int halt() __attribute__((noreturn)); +int live(); +int dead(); + +void test1() { + goto c; + d: + goto e; // expected-warning {{will never be executed}} + c: ; + int i; + return; + goto b; // expected-warning {{will never be executed}} + goto a; // expected-warning {{will never be executed}} + b: + i = 1; + a: + i = 2; + goto f; + e: + goto d; + f: ; +} + +void test2() { + int i; + switch (live()) { + case 1: + halt(), + dead(); // expected-warning {{will never be executed}} + + case 2: + live(), halt(), + dead(); // expected-warning {{will never be executed}} + + case 3: + live() + + // expected-warning {{will never be executed}} + halt(); + dead(); + + case 4: + a4: + live(), + halt(); + goto a4; // expected-warning {{will never be executed}} + + case 5: + goto a5; + c5: + dead(); // expected-warning {{will never be executed}} + goto b5; + a5: + live(), + halt(); + b5: + goto c5; + + case 6: + if (live()) + goto e6; + live(), + halt(); + d6: + dead(); // expected-warning {{will never be executed}} + goto b6; + c6: + dead(); + goto b6; + e6: + live(), + halt(); + b6: + goto c6; + case 7: + halt() + + + dead(); // expected-warning {{will never be executed}} + - // expected-warning {{will never be executed}} + halt(); + case 8: + i // expected-warning {{will never be executed}} + += + halt(); + case 9: + halt() + ? // expected-warning {{will never be executed}} + dead() : dead(); + case 10: + ( // expected-warning {{will never be executed}} + float)halt(); + case 11: { + int a[5]; + live(), + a[halt() // expected-warning {{will never be executed}} + ]; + } + } +} + +enum Cases { C1, C2, C3 }; +int test_enum_cases(enum Cases C) { + switch (C) { + case C1: + case C2: + case C3: + return 1; + default: { + int i = 0; // expected-warning{{will never be executed}} + ++i; + return i; + } + } +} + +// Handle unreachable code triggered by macro expansions. +void __myassert_rtn(const char *, const char *, int, const char *) __attribute__((__noreturn__)); + +#define myassert(e) \ + (__builtin_expect(!(e), 0) ? __myassert_rtn(__func__, __FILE__, __LINE__, #e) : (void)0) + +void test_assert() { + myassert(0 && "unreachable"); + return; // no-warning +} + +// Test case for PR 9774. Tests that dead code in macros aren't warned about. +#define MY_MAX(a,b) ((a) >= (b) ? (a) : (b)) +void PR9774(int *s) { + for (int i = 0; i < MY_MAX(2, 3); i++) // no-warning + s[i] = 0; +} + |