| // RUN: %clang_cc1 -x c++ -verify -fsyntax-only %s |
| |
| void f1(); |
| |
| struct S { |
| static void f2(); |
| }; |
| |
| extern void f3() __attribute__((weak_import)); |
| |
| struct S2 { |
| static void f4() __attribute__((weak_import)); |
| }; |
| |
| bool f5(); |
| bool f6(int); |
| |
| void bar() { |
| bool b; |
| |
| b = f1; // expected-warning {{address of function 'f1' will always evaluate to 'true'}} \ |
| expected-note {{prefix with the address-of operator to silence this warning}} |
| if (f1) {} // expected-warning {{address of function 'f1' will always evaluate to 'true'}} \ |
| expected-note {{prefix with the address-of operator to silence this warning}} |
| b = S::f2; // expected-warning {{address of function 'S::f2' will always evaluate to 'true'}} \ |
| expected-note {{prefix with the address-of operator to silence this warning}} |
| if (S::f2) {} // expected-warning {{address of function 'S::f2' will always evaluate to 'true'}} \ |
| expected-note {{prefix with the address-of operator to silence this warning}} |
| b = f5; // expected-warning {{address of function 'f5' will always evaluate to 'true'}} \ |
| expected-note {{prefix with the address-of operator to silence this warning}} \ |
| expected-note {{suffix with parentheses to turn this into a function call}} |
| b = f6; // expected-warning {{address of function 'f6' will always evaluate to 'true'}} \ |
| expected-note {{prefix with the address-of operator to silence this warning}} |
| |
| // implicit casts of weakly imported symbols are ok: |
| b = f3; |
| if (f3) {} |
| b = S2::f4; |
| if (S2::f4) {} |
| } |