brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.5 KiB · 14d5300 Raw
342 lines · c
1// RUN: %clang_cc1 -triple x86_64-apple-darwin9 %s -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -Wno-error=implicit-int -verify -fblocks -Wno-unreachable-code -Wno-unused-value -Wno-strict-prototypes2 3// clang emits the following warning by default.4// With GCC, -pedantic, -Wreturn-type or -Wall are required to produce the5// following warning.6int t14(void) {7  return; // expected-warning {{non-void function 't14' should return a value}}8}9 10void t15(void) {11  return 1; // expected-warning {{void function 't15' should not return a value}}12}13 14int unknown(void);15 16void test0(void) {17}18 19int test1(void) {20} // expected-warning {{non-void function does not return a value}}21 22int test2(void) {23  a: goto a;24}25 26int test3(void) {27  goto a;28  a: ;29} // expected-warning {{non-void function does not return a value}}30 31 32void halt(void) {33  a: goto a;34}35 36void halt2(void) __attribute__((noreturn));37 38int test4(void) {39  halt2();40}41 42int test5(void) {43  halt2(), (void)1;44}45 46int test6(void) {47  1, halt2();48}49 50int j;51int unknown_nohalt(void) {52  return j;53}54 55int test7(void) {56  unknown();57} // expected-warning {{non-void function does not return a value}}58 59int test8(void) {60  (void)(1 + unknown());61} // expected-warning {{non-void function does not return a value}}62 63int halt3(void) __attribute__((noreturn));64 65int test9(void) {66  (void)(halt3() + unknown());67}68 69int test10(void) {70  (void)(unknown() || halt3());71} // expected-warning {{non-void function does not return a value in all control paths}}72 73int test11(void) {74  (void)(unknown() && halt3());75} // expected-warning {{non-void function does not return a value in all control paths}}76 77int test12(void) {78  (void)(halt3() || unknown());79}80 81int test13(void) {82  (void)(halt3() && unknown());83}84 85int test14(void) {86  (void)(1 || unknown());87} // expected-warning {{non-void function does not return a value}}88 89int test15(void) {90  (void)(0 || unknown());91} // expected-warning {{non-void function does not return a value}}92 93int test16(void) {94  (void)(0 && unknown());95} // expected-warning {{non-void function does not return a value}}96 97int test17(void) {98  (void)(1 && unknown());99} // expected-warning {{non-void function does not return a value}}100 101int test18(void) {102  (void)(unknown_nohalt() && halt3());103} // expected-warning {{non-void function does not return a value in all control paths}}104 105int test19(void) {106  (void)(unknown_nohalt() && unknown());107} // expected-warning {{non-void function does not return a value}}108 109int test20(void) {110  int i;111  if (i)112    return 0;113  else if (0)114    return 2;115} // expected-warning {{non-void function does not return a value in all control paths}}116 117int test21(void) {118  int i;119  if (i)120    return 0;121  else if (1)122    return 2;123}124 125int test22(void) {126  int i;127  switch (i) default: ;128} // expected-warning {{non-void function does not return a value}}129 130int test23(void) {131  int i;132  switch (i) {133  case 0:134    return 0;135  case 2:136    return 2;137  }138} // expected-warning {{non-void function does not return a value in all control paths}}139 140int test24(void) {141  int i;142  switch (i) {143    case 0:144    return 0;145  case 2:146    return 2;147  default:148    return -1;149  }150}151 152int test25(void) {153  1 ? halt3() : unknown();154}155 156int test26(void) {157  0 ? halt3() : unknown();158} // expected-warning {{non-void function does not return a value}}159 160int j;161void (*fptr)(void) __attribute__((noreturn));162int test27(void) {163  switch (j) {164  case 1:165    do { } while (1);166    break;167  case 2:168    for (;;) ;169    break;170  case 3:171    for (;1;) ;172    for (;0;) {173      goto done;174    }175    return 1;176  case 4:177    while (0) { goto done; }178    return 1;179  case 5:180    while (1) { return 1; }181    break;182  case 6:183    fptr();184    break;185  default:186    return 1;187  }188  done: ;189}190 191// PR4624192void test28() __attribute__((noreturn));193void test28(x) { while (1) { } } // expected-warning {{parameter 'x' was not declared, defaults to 'int'; ISO C99 and later do not support implicit int}}194 195void exit(int);196int test29(void) {197  exit(1);198}199 200// Include these declarations here explicitly so we don't depend on system headers.201typedef struct __jmp_buf_tag{} jmp_buf[1];202 203extern void longjmp (struct __jmp_buf_tag __env[1], int __val) __attribute__ ((noreturn));204extern void _longjmp (struct __jmp_buf_tag __env[1], int __val) __attribute__ ((noreturn));205 206jmp_buf test30_j;207 208int test30(void) {209  if (j)210    longjmp(test30_j, 1);211  else212#if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)213    longjmp(test30_j, 2);214#else215    _longjmp(test30_j, 1);216#endif217}218 219typedef void test31_t(int status);220void test31(test31_t *callback __attribute__((noreturn)));221 222void test32(void) {223  ^ (void) { while (1) { } }();224  ^ (void) { if (j) while (1) { } }();225  while (1) { }226}227 228void test33(void) {229  if (j) while (1) { }230}231 232// Test that 'static inline' functions are only analyzed for CFG-based warnings233// when they are used.234static inline int si_has_missing_return(void) {} // expected-warning{{non-void function does not return a value}}235static inline int si_has_missing_return_2(void) {}; // expected-warning{{non-void function does not return a value}}236static inline int si_forward(void);237static inline int si_has_missing_return_3(int x) {238  if (x)239   return si_has_missing_return_3(x+1);240} // expected-warning{{non-void function does not return a value in all control paths}}241 242int test_static_inline(int x) {243  si_forward();244  return x ? si_has_missing_return_2() : si_has_missing_return_3(x);245}246static inline int si_forward(void) {} // expected-warning{{non-void function does not return a value}}247 248// Test warnings on ignored qualifiers on return types.249const int ignored_c_quals(void); // expected-warning{{'const' type qualifier on return type has no effect}}250const volatile int ignored_cv_quals(void); // expected-warning{{'const volatile' type qualifiers on return type have no effect}}251char* const volatile restrict ignored_cvr_quals(void); // expected-warning{{'const volatile restrict' type qualifiers on return type have no effect}}252 253typedef const int CI;254CI ignored_quals_typedef(void);255 256const CI ignored_quals_typedef_2(void); // expected-warning{{'const' type qualifier}}257 258// Test that for switch(enum) that if the switch statement covers all the cases259// that we don't consider that for -Wreturn-type.260enum Cases { C1, C2, C3, C4 };261int test_enum_cases(enum Cases C) {262  switch (C) {263  case C1: return 1;264  case C2: return 2;265  case C4: return 3;266  case C3: return 4;267  }268} // no-warning269 270// PR12318 - Don't give a may reach end of non-void function warning.271int test34(int x) {272  if (x == 1) {273    return 3;274  } else if ( x == 2 || 1) {275    return 5;276  }277}278 279// PR18999280int test35(void) {281lbl:282  if (1)283    goto lbl;284}285 286int test36a(int b) {287  if (b)288    return 43;289  __builtin_unreachable();290}291 292int test36b(int b) {293  if (b)294    return 43;295  __builtin_assume(0);296}297 298// PR19074.299void abort(void) __attribute__((noreturn));300#define av_assert0(cond) do {\301    if (!(cond)) {\302      abort();\303    }\304  } while (0)305 306int PR19074(int x) {307  switch(x) {308  case 0:309    return 0;310  default:311    av_assert0(0);312  } // no-warning313}314 315int PR19074_positive(int x) {316  switch(x) {317  case 0:318    return 0;319  default:320    break;321  }322} // expected-warning {{non-void function does not return a value in all control paths}}323 324// sizeof(long) test.325int sizeof_long(void) {326  if (sizeof(long) == 4)327    return 1;328  if (sizeof(long) == 8)329    return 2;330} // no-warning331 332int return_statement_expression(void) {333  if (unknown())334    return ({335      while (0)336        ;337      0;338    });339  else340    return 0;341} // no-warning (used to be "non-void function does not return a value in all control paths")342