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