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 
ignore()11 void ignore() {
12   if (!a) {}
13 }
test()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];
test1()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 
test2(int * pointer,char ch,void * pv)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 
test3()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;
_HTTPClientErrorHandler(int me)82 void _HTTPClientErrorHandler(int me)
83 {
84   int *result;
85   SAVE_READ(&me);
86 }
87 
test_conditional_operator()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