1d7a95971bd91b21922e5e878ba05bbe42b585cc9Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
2d7a95971bd91b21922e5e878ba05bbe42b585cc9Douglas Gregor
3651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace BooleanFalse {
42fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieuint* j = false; // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
5d7a95971bd91b21922e5e878ba05bbe42b585cc9Douglas Gregor
62fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieuvoid foo(int* i, int *j=(false)) // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
7d7a95971bd91b21922e5e878ba05bbe42b585cc9Douglas Gregor{
82fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu  foo(false); // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
988f0aed95d2a0faf3cad66af2dc54596495a7d41Chandler Carruth  foo((int*)false); // no-warning: explicit cast
1088f0aed95d2a0faf3cad66af2dc54596495a7d41Chandler Carruth  foo(0); // no-warning: not a bool, even though its convertible to bool
1188f0aed95d2a0faf3cad66af2dc54596495a7d41Chandler Carruth
122fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu  foo(false == true); // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
132fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu  foo((42 + 24) < 32); // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
1488f0aed95d2a0faf3cad66af2dc54596495a7d41Chandler Carruth
1588f0aed95d2a0faf3cad66af2dc54596495a7d41Chandler Carruth  const bool kFlag = false;
162fe9b7fb07dff15dd15dd8755a9a9e6de0fe46fcRichard Trieu  foo(kFlag); // expected-warning{{initialization of pointer of type 'int *' to null from a constant boolean expression}}
17d7a95971bd91b21922e5e878ba05bbe42b585cc9Douglas Gregor}
18d7a95971bd91b21922e5e878ba05bbe42b585cc9Douglas Gregor
19e34e3f16580c586b032035e2612d12ae4569f21eChandler Carruthchar f(struct Undefined*);
20e34e3f16580c586b032035e2612d12ae4569f21eChandler Carruthdouble f(...);
21e34e3f16580c586b032035e2612d12ae4569f21eChandler Carruth
22e34e3f16580c586b032035e2612d12ae4569f21eChandler Carruth// Ensure that when using false in metaprogramming machinery its conversion
23e34e3f16580c586b032035e2612d12ae4569f21eChandler Carruth// isn't flagged.
24e34e3f16580c586b032035e2612d12ae4569f21eChandler Carruthtemplate <int N> struct S {};
25e34e3f16580c586b032035e2612d12ae4569f21eChandler CarruthS<sizeof(f(false))> s;
26651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
27651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
28651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
29651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace Function {
30651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid f1();
31651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
32651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct S {
33651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static void f2();
34651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
36651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesextern void f3() __attribute__((weak_import));
37651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstruct S2 {
39651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static void f4() __attribute__((weak_import));
40651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines};
41651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
42651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool f5();
43651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesbool f6(int);
44651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
45651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesvoid bar() {
46651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  bool b;
47651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
48651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  b = f1; // expected-warning {{address of function 'f1' will always evaluate to 'true'}} \
49651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             expected-note {{prefix with the address-of operator to silence this warning}}
50651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (f1) {} // expected-warning {{address of function 'f1' will always evaluate to 'true'}} \
51651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                expected-note {{prefix with the address-of operator to silence this warning}}
52651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  b = S::f2; // expected-warning {{address of function 'S::f2' will always evaluate to 'true'}} \
53651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                expected-note {{prefix with the address-of operator to silence this warning}}
54651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (S::f2) {} // expected-warning {{address of function 'S::f2' will always evaluate to 'true'}} \
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines                   expected-note {{prefix with the address-of operator to silence this warning}}
56651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  b = f5; // expected-warning {{address of function 'f5' will always evaluate to 'true'}} \
57651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             expected-note {{prefix with the address-of operator to silence this warning}} \
58651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             expected-note {{suffix with parentheses to turn this into a function call}}
59651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  b = f6; // expected-warning {{address of function 'f6' will always evaluate to 'true'}} \
60651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines             expected-note {{prefix with the address-of operator to silence this warning}}
61651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
62651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  // implicit casts of weakly imported symbols are ok:
63651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  b = f3;
64651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (f3) {}
65651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  b = S2::f4;
66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  if (S2::f4) {}
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace Array {
71651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  #define GetValue(ptr)  ((ptr) ? ptr[0] : 0)
72651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern int a[] __attribute__((weak));
73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int b[] = {8,13,21};
74651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  struct {
75651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int x[10];
76651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  } c;
77651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  const char str[] = "text";
78651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void ignore() {
79651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (a) {}
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (a) {}
81651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    (void)GetValue(b);
82651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
83651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void test() {
84651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (b) {}
85651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-warning@-1{{address of array 'b' will always evaluate to 'true'}}
86651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (b) {}
87651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-warning@-1{{address of array 'b' will always evaluate to 'true'}}
88651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (c.x) {}
89651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-warning@-1{{address of array 'c.x' will always evaluate to 'true'}}
90651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (str) {}
91651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-warning@-1{{address of array 'str' will always evaluate to 'true'}}
92651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
93651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
94651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines
95651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesnamespace Pointer {
96651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  extern int a __attribute__((weak));
97651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  int b;
98651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  static int c;
99651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  class S {
100651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  public:
101651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    static int a;
102651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    int b;
103651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  };
104651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void ignored() {
105651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (&a) {}
106651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
107651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void test() {
108651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    S s;
109651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (&b) {}
110651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-warning@-1{{address of 'b' will always evaluate to 'true'}}
111651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (&c) {}
112651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-warning@-1{{address of 'c' will always evaluate to 'true'}}
113651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (&s.a) {}
114651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-warning@-1{{address of 's.a' will always evaluate to 'true'}}
115651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (&s.b) {}
116651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-warning@-1{{address of 's.b' will always evaluate to 'true'}}
117651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    if (&S::a) {}
118651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    // expected-warning@-1{{address of 'S::a' will always evaluate to 'true'}}
119651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  }
120651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines}
121