2010-01-24 04:12:18 +08:00
|
|
|
// RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wno-unreachable-code
|
2009-05-01 00:01:26 +08:00
|
|
|
|
|
|
|
// 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}}
|
|
|
|
}
|
|
|
|
|
2009-05-01 01:53:16 +08:00
|
|
|
void t15() {
|
|
|
|
return 1; // expected-warning {{void function 't15' should not return a value}}
|
|
|
|
}
|
2009-07-23 07:56:57 +08:00
|
|
|
|
|
|
|
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;
|
2009-07-26 05:26:53 +08:00
|
|
|
void (*fptr)() __attribute__((noreturn));
|
2009-07-23 07:56:57 +08:00
|
|
|
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;
|
2009-07-26 05:26:53 +08:00
|
|
|
case 6:
|
|
|
|
fptr();
|
|
|
|
break;
|
2009-07-23 07:56:57 +08:00
|
|
|
default:
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
done: ;
|
|
|
|
}
|
2009-07-27 08:44:23 +08:00
|
|
|
|
2009-07-27 12:49:58 +08:00
|
|
|
// PR4624
|
2009-07-27 08:44:23 +08:00
|
|
|
void test28() __attribute__((noreturn));
|
|
|
|
void test28(x) { while (1) { } }
|
2009-07-28 03:14:18 +08:00
|
|
|
|
|
|
|
void exit(int);
|
|
|
|
int test29() {
|
|
|
|
exit(1);
|
|
|
|
}
|
2009-07-28 05:33:40 +08:00
|
|
|
|
|
|
|
#include <setjmp.h>
|
|
|
|
jmp_buf test30_j;
|
|
|
|
int test30() {
|
2009-07-28 05:45:16 +08:00
|
|
|
if (j)
|
|
|
|
longjmp(test30_j, 1);
|
|
|
|
else
|
2009-10-29 08:10:42 +08:00
|
|
|
#if defined(_WIN32) || defined(_WIN64)
|
|
|
|
longjmp(test30_j, 2);
|
|
|
|
#else
|
2009-07-28 05:45:16 +08:00
|
|
|
_longjmp(test30_j, 1);
|
2009-10-29 08:10:42 +08:00
|
|
|
#endif
|
2009-07-28 05:33:40 +08:00
|
|
|
}
|
2009-07-28 06:25:19 +08:00
|
|
|
|
|
|
|
typedef void test31_t(int status);
|
|
|
|
void test31(test31_t *callback __attribute__((noreturn)));
|
2009-07-29 07:11:12 +08:00
|
|
|
|
|
|
|
void test32() {
|
|
|
|
^ (void) { while (1) { } }();
|
|
|
|
^ (void) { if (j) while (1) { } }();
|
|
|
|
while (1) { }
|
|
|
|
}
|
|
|
|
|
|
|
|
void test33() {
|
|
|
|
if (j) while (1) { }
|
|
|
|
}
|