| // RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -verify %s |
| // rdar://18716393 |
| |
| extern int a[] __attribute__((weak)); |
| int b[] = {8,13,21}; |
| struct { |
| int x[10]; |
| } c; |
| const char str[] = "text"; |
| |
| void ignore() { |
| if (!a) {} |
| } |
| void test() { |
| if (!b) {} // expected-warning {{address of array 'b' will always evaluate to 'true'}} |
| if (b == 0) {} // expected-warning {{comparison of array 'b' equal to a null pointer is always false}} |
| if (!c.x) {} // expected-warning {{address of array 'c.x' will always evaluate to 'true'}} |
| if (c.x == 0) {} // expected-warning {{comparison of array 'c.x' equal to a null pointer is always false}} |
| if (!str) {} // expected-warning {{address of array 'str' will always evaluate to 'true'}} |
| if (0 == str) {} // expected-warning {{comparison of array 'str' equal to a null pointer is always false}} |
| } |
| |
| int array[2]; |
| int test1() |
| { |
| if (!array) { // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| return array[0]; |
| } else if (array != 0) { // expected-warning {{comparison of array 'array' not equal to a null pointer is always true}} |
| return array[1]; |
| } |
| if (array == 0) // expected-warning {{comparison of array 'array' equal to a null pointer is always false}} |
| return 1; |
| return 0; |
| } |
| |
| #define NULL (void*)0 |
| |
| int test2(int* pointer, char ch, void * pv) { |
| if (!&pointer) { // expected-warning {{address of 'pointer' will always evaluate to 'true'}} |
| return 0; |
| } |
| |
| if (&pointer) { // expected-warning {{address of 'pointer' will always evaluate to 'true'}} |
| return 0; |
| } |
| |
| if (&pointer == NULL) {} // expected-warning {{comparison of address of 'pointer' equal to a null pointer is always false}} |
| |
| if (&pointer != NULL) {} // expected-warning {{comparison of address of 'pointer' not equal to a null pointer is always true}} |
| |
| return 1; |
| } |
| |
| void test3() { |
| if (array) { } // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| if (array != 0) {} // expected-warning {{comparison of array 'array' not equal to a null pointer is always true}} |
| if (!array) { } // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| if (array == 0) {} // expected-warning {{comparison of array 'array' equal to a null pointer is always false}} |
| |
| if (array[0] && |
| array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| |
| if (array[0] || |
| array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| |
| if (array[0] && |
| !array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| if (array[0] || |
| !array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| |
| if (array && // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| array[0]) {} |
| if (!array || // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| array[0]) {} |
| |
| if (array || // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| (!array && array[0])) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
| } |
| |
| // rdar://19256338 |
| #define SAVE_READ(PTR) if( (PTR) && (&result) ) *result=*PTR; |
| void _HTTPClientErrorHandler(int me) |
| { |
| int *result; |
| SAVE_READ(&me); |
| } |
| |
| void test_conditional_operator() { |
| int x; |
| x = b ? 1 : 0; // expected-warning {{address of array}} |
| x = c.x ? 1 : 0; // expected-warning {{address of array}} |
| x = str ? 1 : 0; // expected-warning {{address of array}} |
| x = array ? 1 : 0; // expected-warning {{address of array}} |
| x = &x ? 1 : 0; // expected-warning {{address of 'x'}} |
| } |