| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- // RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -verify -fblocks -Wno-unreachable-code -Wno-unused-value
- // clang emits the following warning by default.
- // With GCC, -pedantic, -Wreturn-type or -Wall are required to produce the
- // following warning.
- int t14() {
- return; // expected-warning {{non-void function 't14' should return a value}}
- }
- void t15() {
- return 1; // expected-warning {{void function 't15' should not return a value}}
- }
- int unknown();
- void test0() {
- }
- int test1() {
- } // expected-warning {{control reaches end of non-void function}}
- int test2() {
- a: goto a;
- }
- int test3() {
- goto a;
- a: ;
- } // expected-warning {{control reaches end of non-void function}}
- void halt() {
- a: goto a;
- }
- void halt2() __attribute__((noreturn));
- int test4() {
- halt2();
- }
- int test5() {
- halt2(), (void)1;
- }
- int test6() {
- 1, halt2();
- }
- int j;
- int unknown_nohalt() {
- return j;
- }
- int test7() {
- unknown();
- } // expected-warning {{control reaches end of non-void function}}
- int test8() {
- (void)(1 + unknown());
- } // expected-warning {{control reaches end of non-void function}}
- int halt3() __attribute__((noreturn));
- int test9() {
- (void)(halt3() + unknown());
- }
- int test10() {
- (void)(unknown() || halt3());
- } // expected-warning {{control may reach end of non-void function}}
- int test11() {
- (void)(unknown() && halt3());
- } // expected-warning {{control may reach end of non-void function}}
- int test12() {
- (void)(halt3() || unknown());
- }
- int test13() {
- (void)(halt3() && unknown());
- }
- int test14() {
- (void)(1 || unknown());
- } // expected-warning {{control reaches end of non-void function}}
- int test15() {
- (void)(0 || unknown());
- } // expected-warning {{control reaches end of non-void function}}
- int test16() {
- (void)(0 && unknown());
- } // expected-warning {{control reaches end of non-void function}}
- int test17() {
- (void)(1 && unknown());
- } // expected-warning {{control reaches end of non-void function}}
- int test18() {
- (void)(unknown_nohalt() && halt3());
- } // expected-warning {{control may reach end of non-void function}}
- int test19() {
- (void)(unknown_nohalt() && unknown());
- } // expected-warning {{control reaches end of non-void function}}
- int test20() {
- int i;
- if (i)
- return 0;
- else if (0)
- return 2;
- } // expected-warning {{control may reach end of non-void function}}
- int test21() {
- int i;
- if (i)
- return 0;
- else if (1)
- return 2;
- }
- int test22() {
- int i;
- switch (i) default: ;
- } // expected-warning {{control reaches end of non-void function}}
- int test23() {
- int i;
- switch (i) {
- case 0:
- return 0;
- case 2:
- return 2;
- }
- } // expected-warning {{control may reach end of non-void function}}
- int test24() {
- int i;
- switch (i) {
- case 0:
- return 0;
- case 2:
- return 2;
- default:
- return -1;
- }
- }
- int test25() {
- 1 ? halt3() : unknown();
- }
- int test26() {
- 0 ? halt3() : unknown();
- } // expected-warning {{control reaches end of non-void function}}
- int j;
- void (*fptr)() __attribute__((noreturn));
- int test27() {
- switch (j) {
- case 1:
- do { } while (1);
- break;
- case 2:
- for (;;) ;
- break;
- case 3:
- for (;1;) ;
- for (;0;) {
- goto done;
- }
- return 1;
- case 4:
- while (0) { goto done; }
- return 1;
- case 5:
- while (1) { return 1; }
- break;
- case 6:
- fptr();
- break;
- default:
- return 1;
- }
- done: ;
- }
- // PR4624
- void test28() __attribute__((noreturn));
- void test28(x) { while (1) { } }
- void exit(int);
- int test29() {
- exit(1);
- }
- // Include these declarations here explicitly so we don't depend on system headers.
- typedef struct __jmp_buf_tag{} jmp_buf[1];
- extern void longjmp (struct __jmp_buf_tag __env[1], int __val) __attribute__ ((noreturn));
- extern void _longjmp (struct __jmp_buf_tag __env[1], int __val) __attribute__ ((noreturn));
- jmp_buf test30_j;
- int test30() {
- if (j)
- longjmp(test30_j, 1);
- else
- #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
- longjmp(test30_j, 2);
- #else
- _longjmp(test30_j, 1);
- #endif
- }
- typedef void test31_t(int status);
- void test31(test31_t *callback __attribute__((noreturn)));
- void test32() {
- ^ (void) { while (1) { } }();
- ^ (void) { if (j) while (1) { } }();
- while (1) { }
- }
- void test33() {
- if (j) while (1) { }
- }
- // Test that 'static inline' functions are only analyzed for CFG-based warnings
- // when they are used.
- static inline int si_has_missing_return() {} // expected-warning{{control reaches end of non-void function}}
- static inline int si_has_missing_return_2() {}; // expected-warning{{control reaches end of non-void function}}
- static inline int si_forward();
- static inline int si_has_missing_return_3(int x) {
- if (x)
- return si_has_missing_return_3(x+1);
- } // expected-warning{{control may reach end of non-void function}}
- int test_static_inline(int x) {
- si_forward();
- return x ? si_has_missing_return_2() : si_has_missing_return_3(x);
- }
- static inline int si_forward() {} // expected-warning{{control reaches end of non-void function}}
- // Test warnings on ignored qualifiers on return types.
- const int ignored_c_quals(); // expected-warning{{'const' type qualifier on return type has no effect}}
- const volatile int ignored_cv_quals(); // expected-warning{{'const volatile' type qualifiers on return type have no effect}}
- char* const volatile restrict ignored_cvr_quals(); // expected-warning{{'const volatile restrict' type qualifiers on return type have no effect}}
- typedef const int CI;
- CI ignored_quals_typedef();
- const CI ignored_quals_typedef_2(); // expected-warning{{'const' type qualifier}}
- // Test that for switch(enum) that if the switch statement covers all the cases
- // that we don't consider that for -Wreturn-type.
- enum Cases { C1, C2, C3, C4 };
- int test_enum_cases(enum Cases C) {
- switch (C) {
- case C1: return 1;
- case C2: return 2;
- case C4: return 3;
- case C3: return 4;
- }
- } // no-warning
- // PR12318 - Don't give a may reach end of non-void function warning.
- int test34(int x) {
- if (x == 1) {
- return 3;
- } else if ( x == 2 || 1) {
- return 5;
- }
- }
- // PR18999
- int test35() {
- lbl:
- if (1)
- goto lbl;
- }
- // PR19074.
- void abort(void) __attribute__((noreturn));
- #define av_assert0(cond) do {\
- if (!(cond)) {\
- abort();\
- }\
- } while (0)
- int PR19074(int x) {
- switch(x) {
- case 0:
- return 0;
- default:
- av_assert0(0);
- } // no-warning
- }
- int PR19074_positive(int x) {
- switch(x) {
- case 0:
- return 0;
- default:
- break;
- }
- } // expected-warning {{control may reach end of non-void function}}
- // sizeof(long) test.
- int sizeof_long() {
- if (sizeof(long) == 4)
- return 1;
- if (sizeof(long) == 8)
- return 2;
- } // no-warning
|