1 | // RUN: %clang_cc1 -triple x86_64-apple-darwin -fsyntax-only -verify %s |
2 | // rdar://18716393 |
3 | |
4 | extern int a[] __attribute__((weak)); |
5 | int b[] = {8,13,21}; |
6 | struct { |
7 | int x[10]; |
8 | } c; |
9 | const char str[] = "text"; |
10 | |
11 | void ignore() { |
12 | if (!a) {} |
13 | } |
14 | void test() { |
15 | if (!b) {} // expected-warning {{address of array 'b' will always evaluate to 'true'}} |
16 | if (b == 0) {} // expected-warning {{comparison of array 'b' equal to a null pointer is always false}} |
17 | if (!c.x) {} // expected-warning {{address of array 'c.x' will always evaluate to 'true'}} |
18 | if (c.x == 0) {} // expected-warning {{comparison of array 'c.x' equal to a null pointer is always false}} |
19 | if (!str) {} // expected-warning {{address of array 'str' will always evaluate to 'true'}} |
20 | if (0 == str) {} // expected-warning {{comparison of array 'str' equal to a null pointer is always false}} |
21 | } |
22 | |
23 | int array[2]; |
24 | int test1() |
25 | { |
26 | if (!array) { // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
27 | return array[0]; |
28 | } else if (array != 0) { // expected-warning {{comparison of array 'array' not equal to a null pointer is always true}} |
29 | return array[1]; |
30 | } |
31 | if (array == 0) // expected-warning {{comparison of array 'array' equal to a null pointer is always false}} |
32 | return 1; |
33 | return 0; |
34 | } |
35 | |
36 | #define NULL (void*)0 |
37 | |
38 | int test2(int* pointer, char ch, void * pv) { |
39 | if (!&pointer) { // expected-warning {{address of 'pointer' will always evaluate to 'true'}} |
40 | return 0; |
41 | } |
42 | |
43 | if (&pointer) { // expected-warning {{address of 'pointer' will always evaluate to 'true'}} |
44 | return 0; |
45 | } |
46 | |
47 | if (&pointer == NULL) {} // expected-warning {{comparison of address of 'pointer' equal to a null pointer is always false}} |
48 | |
49 | if (&pointer != NULL) {} // expected-warning {{comparison of address of 'pointer' not equal to a null pointer is always true}} |
50 | |
51 | return 1; |
52 | } |
53 | |
54 | void test3() { |
55 | if (array) { } // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
56 | if (array != 0) {} // expected-warning {{comparison of array 'array' not equal to a null pointer is always true}} |
57 | if (!array) { } // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
58 | if (array == 0) {} // expected-warning {{comparison of array 'array' equal to a null pointer is always false}} |
59 | |
60 | if (array[0] && |
61 | array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
62 | |
63 | if (array[0] || |
64 | array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
65 | |
66 | if (array[0] && |
67 | !array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
68 | if (array[0] || |
69 | !array) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
70 | |
71 | if (array && // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
72 | array[0]) {} |
73 | if (!array || // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
74 | array[0]) {} |
75 | |
76 | if (array || // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
77 | (!array && array[0])) {} // expected-warning {{address of array 'array' will always evaluate to 'true'}} |
78 | } |
79 | |
80 | // rdar://19256338 |
81 | #define SAVE_READ(PTR) if( (PTR) && (&result) ) *result=*PTR; |
82 | void _HTTPClientErrorHandler(int me) |
83 | { |
84 | int *result; |
85 | SAVE_READ(&me); |
86 | } |
87 | |
88 | void test_conditional_operator() { |
89 | int x; |
90 | x = b ? 1 : 0; // expected-warning {{address of array}} |
91 | x = c.x ? 1 : 0; // expected-warning {{address of array}} |
92 | x = str ? 1 : 0; // expected-warning {{address of array}} |
93 | x = array ? 1 : 0; // expected-warning {{address of array}} |
94 | x = &x ? 1 : 0; // expected-warning {{address of 'x'}} |
95 | } |
96 | |