Home | History | Annotate | Download | only in Sema
      1 // RUN: %clang %s -fsyntax-only -Wignored-qualifiers -Wno-error=return-type -Xclang -verify -fblocks -Wno-unreachable-code -Wno-unused-value
      2 
      3 // clang emits the following warning by default.
      4 // With GCC, -pedantic, -Wreturn-type or -Wall are required to produce the
      5 // following warning.
      6 int t14() {
      7   return; // expected-warning {{non-void function 't14' should return a value}}
      8 }
      9 
     10 void t15() {
     11   return 1; // expected-warning {{void function 't15' should not return a value}}
     12 }
     13 
     14 int unknown();
     15 
     16 void test0() {
     17 }
     18 
     19 int test1() {
     20 } // expected-warning {{control reaches end of non-void function}}
     21 
     22 int test2() {
     23   a: goto a;
     24 }
     25 
     26 int test3() {
     27   goto a;
     28   a: ;
     29 } // expected-warning {{control reaches end of non-void function}}
     30 
     31 
     32 void halt() {
     33   a: goto a;
     34 }
     35 
     36 void halt2() __attribute__((noreturn));
     37 
     38 int test4() {
     39   halt2();
     40 }
     41 
     42 int test5() {
     43   halt2(), (void)1;
     44 }
     45 
     46 int test6() {
     47   1, halt2();
     48 }
     49 
     50 int j;
     51 int unknown_nohalt() {
     52   return j;
     53 }
     54 
     55 int test7() {
     56   unknown();
     57 } // expected-warning {{control reaches end of non-void function}}
     58 
     59 int test8() {
     60   (void)(1 + unknown());
     61 } // expected-warning {{control reaches end of non-void function}}
     62 
     63 int halt3() __attribute__((noreturn));
     64 
     65 int test9() {
     66   (void)(halt3() + unknown());
     67 }
     68 
     69 int test10() {
     70   (void)(unknown() || halt3());
     71 } // expected-warning {{control may reach end of non-void function}}
     72 
     73 int test11() {
     74   (void)(unknown() && halt3());
     75 } // expected-warning {{control may reach end of non-void function}}
     76 
     77 int test12() {
     78   (void)(halt3() || unknown());
     79 }
     80 
     81 int test13() {
     82   (void)(halt3() && unknown());
     83 }
     84 
     85 int test14() {
     86   (void)(1 || unknown());
     87 } // expected-warning {{control reaches end of non-void function}}
     88 
     89 int test15() {
     90   (void)(0 || unknown());
     91 } // expected-warning {{control reaches end of non-void function}}
     92 
     93 int test16() {
     94   (void)(0 && unknown());
     95 } // expected-warning {{control reaches end of non-void function}}
     96 
     97 int test17() {
     98   (void)(1 && unknown());
     99 } // expected-warning {{control reaches end of non-void function}}
    100 
    101 int test18() {
    102   (void)(unknown_nohalt() && halt3());
    103 } // expected-warning {{control may reach end of non-void function}}
    104 
    105 int test19() {
    106   (void)(unknown_nohalt() && unknown());
    107 } // expected-warning {{control reaches end of non-void function}}
    108 
    109 int test20() {
    110   int i;
    111   if (i)
    112     return 0;
    113   else if (0)
    114     return 2;
    115 } // expected-warning {{control may reach end of non-void function}}
    116 
    117 int test21() {
    118   int i;
    119   if (i)
    120     return 0;
    121   else if (1)
    122     return 2;
    123 }
    124 
    125 int test22() {
    126   int i;
    127   switch (i) default: ;
    128 } // expected-warning {{control reaches end of non-void function}}
    129 
    130 int test23() {
    131   int i;
    132   switch (i) {
    133   case 0:
    134     return 0;
    135   case 2:
    136     return 2;
    137   }
    138 } // expected-warning {{control may reach end of non-void function}}
    139 
    140 int test24() {
    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 
    152 int test25() {
    153   1 ? halt3() : unknown();
    154 }
    155 
    156 int test26() {
    157   0 ? halt3() : unknown();
    158 } // expected-warning {{control reaches end of non-void function}}
    159 
    160 int j;
    161 void (*fptr)() __attribute__((noreturn));
    162 int test27() {
    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 // PR4624
    192 void test28() __attribute__((noreturn));
    193 void test28(x) { while (1) { } }
    194 
    195 void exit(int);
    196 int test29() {
    197   exit(1);
    198 }
    199 
    200 // Include these declarations here explicitly so we don't depend on system headers.
    201 typedef struct __jmp_buf_tag{} jmp_buf[1];
    202 
    203 extern void longjmp (struct __jmp_buf_tag __env[1], int __val) __attribute__ ((noreturn));
    204 extern void _longjmp (struct __jmp_buf_tag __env[1], int __val) __attribute__ ((noreturn));
    205 
    206 jmp_buf test30_j;
    207 
    208 int test30() {
    209   if (j)
    210     longjmp(test30_j, 1);
    211   else
    212 #if defined(_WIN32) || defined(_WIN64) || defined(__CYGWIN__)
    213     longjmp(test30_j, 2);
    214 #else
    215     _longjmp(test30_j, 1);
    216 #endif
    217 }
    218 
    219 typedef void test31_t(int status);
    220 void test31(test31_t *callback __attribute__((noreturn)));
    221 
    222 void test32() {
    223   ^ (void) { while (1) { } }();
    224   ^ (void) { if (j) while (1) { } }();
    225   while (1) { }
    226 }
    227 
    228 void test33() {
    229   if (j) while (1) { }
    230 }
    231 
    232 // Test that 'static inline' functions are only analyzed for CFG-based warnings
    233 // when they are used.
    234 static inline int si_has_missing_return() {} // expected-warning{{control reaches end of non-void function}}
    235 static inline int si_has_missing_return_2() {}; // expected-warning{{control reaches end of non-void function}}
    236 static inline int si_forward();
    237 static inline int si_has_missing_return_3(int x) {
    238   if (x)
    239    return si_has_missing_return_3(x+1);
    240 } // expected-warning{{control may reach end of non-void function}}
    241 
    242 int test_static_inline(int x) {
    243   si_forward();
    244   return x ? si_has_missing_return_2() : si_has_missing_return_3(x);
    245 }
    246 static inline int si_forward() {} // expected-warning{{control reaches end of non-void function}}
    247 
    248 // Test warnings on ignored qualifiers on return types.
    249 const int ignored_c_quals(); // expected-warning{{'const' type qualifier on return type has no effect}}
    250 const volatile int ignored_cv_quals(); // expected-warning{{'const volatile' type qualifiers on return type have no effect}}
    251 char* const volatile restrict ignored_cvr_quals(); // expected-warning{{'const volatile restrict' type qualifiers on return type have no effect}}
    252 
    253 typedef const int CI;
    254 CI ignored_quals_typedef();
    255 
    256 const CI ignored_quals_typedef_2(); // expected-warning{{'const' type qualifier}}
    257 
    258 // Test that for switch(enum) that if the switch statement covers all the cases
    259 // that we don't consider that for -Wreturn-type.
    260 enum Cases { C1, C2, C3, C4 };
    261 int 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-warning
    269 
    270 // PR12318 - Don't give a may reach end of non-void function warning.
    271 int test34(int x) {
    272   if (x == 1) {
    273     return 3;
    274   } else if ( x == 2 || 1) {
    275     return 5;
    276   }
    277 }
    278