xref: /aosp_15_r20/external/clang/test/SemaObjC/warn-unreachable.m (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li// RUN: %clang %s -fsyntax-only -Xclang -verify -fblocks -Wunreachable-code-aggressive -Wno-unused-value -Wno-covered-switch-default
2*67e74705SXin Li
3*67e74705SXin Li// This previously triggered a warning from -Wunreachable-code because of
4*67e74705SXin Li// a busted CFG.
5*67e74705SXin Litypedef signed char BOOL;
6*67e74705SXin LiBOOL radar10989084() {
7*67e74705SXin Li  @autoreleasepool {  // no-warning
8*67e74705SXin Li    return __objc_yes;
9*67e74705SXin Li  }
10*67e74705SXin Li}
11*67e74705SXin Li
12*67e74705SXin Li// Test the warning works.
13*67e74705SXin Livoid test_unreachable() {
14*67e74705SXin Li  return;
15*67e74705SXin Li  return; // expected-warning {{will never be executed}}
16*67e74705SXin Li}
17*67e74705SXin Li
18*67e74705SXin Li#define NO __objc_no
19*67e74705SXin Li#define YES __objc_yes
20*67e74705SXin Li#define CONFIG NO
21*67e74705SXin Li
22*67e74705SXin Li// Test that 'NO' and 'YES' are not treated as configuration macros.
23*67e74705SXin Liint test_NO() {
24*67e74705SXin Li  if (NO)
25*67e74705SXin Li    return 1; // expected-warning {{will never be executed}}
26*67e74705SXin Li  else
27*67e74705SXin Li    return 0;
28*67e74705SXin Li}
29*67e74705SXin Li
30*67e74705SXin Liint test_YES() {
31*67e74705SXin Li  if (YES)
32*67e74705SXin Li    return 1;
33*67e74705SXin Li  else
34*67e74705SXin Li    return 0; // expected-warning {{will never be executed}}
35*67e74705SXin Li}
36*67e74705SXin Li
37*67e74705SXin Liint test_CONFIG() {
38*67e74705SXin Li  if (CONFIG)
39*67e74705SXin Li    return 1;
40*67e74705SXin Li  else
41*67e74705SXin Li    return 0;
42*67e74705SXin Li}
43*67e74705SXin Li
44*67e74705SXin Li// FIXME: This should at some point report a warning
45*67e74705SXin Li// that the loop increment is unreachable.
46*67e74705SXin Livoid test_loop_increment(id container) {
47*67e74705SXin Li  for (id x in container) { // no-warning
48*67e74705SXin Li    break;
49*67e74705SXin Li  }
50*67e74705SXin Li}
51*67e74705SXin Li
52*67e74705SXin Livoid calledFun() {}
53*67e74705SXin Li
54*67e74705SXin Li// Test "silencing" with parentheses.
55*67e74705SXin Livoid test_with_paren_silencing(int x) {
56*67e74705SXin Li  if (NO) calledFun(); // expected-warning {{will never be executed}} expected-note {{silence by adding parentheses to mark code as explicitly dead}}
57*67e74705SXin Li  if ((NO)) calledFun(); // no-warning
58*67e74705SXin Li
59*67e74705SXin Li  if (YES) // expected-note {{silence by adding parentheses to mark code as explicitly dead}}
60*67e74705SXin Li    calledFun();
61*67e74705SXin Li  else
62*67e74705SXin Li    calledFun(); // expected-warning {{will never be executed}}
63*67e74705SXin Li
64*67e74705SXin Li  if ((YES))
65*67e74705SXin Li    calledFun();
66*67e74705SXin Li  else
67*67e74705SXin Li    calledFun(); // no-warning
68*67e74705SXin Li
69*67e74705SXin Li  if (!YES) // expected-note {{silence by adding parentheses to mark code as explicitly dead}}
70*67e74705SXin Li    calledFun(); // expected-warning {{code will never be executed}}
71*67e74705SXin Li  else
72*67e74705SXin Li    calledFun();
73*67e74705SXin Li
74*67e74705SXin Li  if ((!YES))
75*67e74705SXin Li    calledFun(); // no-warning
76*67e74705SXin Li  else
77*67e74705SXin Li    calledFun();
78*67e74705SXin Li
79*67e74705SXin Li  if (!(YES))
80*67e74705SXin Li    calledFun(); // no-warning
81*67e74705SXin Li  else
82*67e74705SXin Li    calledFun();
83*67e74705SXin Li}
84*67e74705SXin Li
85