1 // RUN: %clang_cc1 -triple x86_64-unknown-unknown -fsyntax-only -fblocks -Wnull-arithmetic -verify -Wno-string-plus-int -Wno-tautological-pointer-compare %s
14 a
= 0 ? NULL
+ a
: a
+ NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
15 a
= 0 ? NULL
- a
: a
- NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
16 a
= 0 ? NULL
/ a
: a
/ NULL
; // expected-warning 2{{use of NULL in arithmetic operation}} \
17 // expected-warning {{division by zero is undefined}}
18 a
= 0 ? NULL
* a
: a
* NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
19 a
= 0 ? NULL
>> a
: a
>> NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
20 a
= 0 ? NULL
<< a
: a
<< NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
21 a
= 0 ? NULL
% a
: a
% NULL
; // expected-warning 2{{use of NULL in arithmetic operation}} \
22 expected
-warning
{{remainder by zero is undefined
}}
23 a
= 0 ? NULL
& a
: a
& NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
24 a
= 0 ? NULL
| a
: a
| NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
25 a
= 0 ? NULL
^ a
: a
^ NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
27 // Check for warnings or errors when doing arithmetic on pointers and other
29 v
= 0 ? NULL
+ &a
: &a
+ NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
30 v
= 0 ? NULL
+ c
: c
+ NULL
; // \
31 expected
-error
{{invalid operands to binary
expression ('long' and 'void (^)()')}} \
32 expected
-error
{{invalid operands to binary
expression ('void (^)()' and 'long')}}
33 v
= 0 ? NULL
+ d
: d
+ NULL
; // \
34 expected
-error
{{invalid operands to binary
expression ('long' and 'void (X::*)()')}} \
35 expected
-error
{{invalid operands to binary
expression ('void (X::*)()' and 'long')}}
36 v
= 0 ? NULL
+ e
: e
+ NULL
; // expected-error 2{{arithmetic on a pointer to the function type 'void ()'}}
37 v
= 0 ? NULL
+ f
: f
+ NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
38 v
= 0 ? NULL
+ "f" : "f" + NULL
; // expected-warning 2{{use of NULL in arithmetic operation}}
40 // Using two NULLs should only give one error instead of two.
41 a
= NULL
+ NULL
; // expected-warning{{use of NULL in arithmetic operation}}
42 a
= NULL
- NULL
; // expected-warning{{use of NULL in arithmetic operation}}
43 a
= NULL
/ NULL
; // expected-warning{{use of NULL in arithmetic operation}} \
44 // expected-warning{{division by zero is undefined}}
45 a
= NULL
* NULL
; // expected-warning{{use of NULL in arithmetic operation}}
46 a
= NULL
>> NULL
; // expected-warning{{use of NULL in arithmetic operation}}
47 a
= NULL
<< NULL
; // expected-warning{{use of NULL in arithmetic operation}}
48 a
= NULL
% NULL
; // expected-warning{{use of NULL in arithmetic operation}} \
49 // expected-warning{{remainder by zero is undefined}}
50 a
= NULL
& NULL
; // expected-warning{{use of NULL in arithmetic operation}}
51 a
= NULL
| NULL
; // expected-warning{{use of NULL in arithmetic operation}}
52 a
= NULL
^ NULL
; // expected-warning{{use of NULL in arithmetic operation}}
54 a
+= NULL
; // expected-warning{{use of NULL in arithmetic operation}}
55 a
-= NULL
; // expected-warning{{use of NULL in arithmetic operation}}
56 a
/= NULL
; // expected-warning{{use of NULL in arithmetic operation}} \
57 // expected-warning{{division by zero is undefined}}
58 a
*= NULL
; // expected-warning{{use of NULL in arithmetic operation}}
59 a
>>= NULL
; // expected-warning{{use of NULL in arithmetic operation}}
60 a
<<= NULL
; // expected-warning{{use of NULL in arithmetic operation}}
61 a
%= NULL
; // expected-warning{{use of NULL in arithmetic operation}} \
62 // expected-warning{{remainder by zero is undefined}}
63 a
&= NULL
; // expected-warning{{use of NULL in arithmetic operation}}
64 a
|= NULL
; // expected-warning{{use of NULL in arithmetic operation}}
65 a
^= NULL
; // expected-warning{{use of NULL in arithmetic operation}}
67 b
= a
< NULL
|| a
> NULL
; // expected-warning 2{{comparison between NULL and non-pointer ('int' and NULL)}}
68 b
= NULL
< a
|| NULL
> a
; // expected-warning 2{{comparison between NULL and non-pointer (NULL and 'int')}}
69 b
= a
<= NULL
|| a
>= NULL
; // expected-warning 2{{comparison between NULL and non-pointer ('int' and NULL)}}
70 b
= NULL
<= a
|| NULL
>= a
; // expected-warning 2{{comparison between NULL and non-pointer (NULL and 'int')}}
71 b
= a
== NULL
|| a
!= NULL
; // expected-warning 2{{comparison between NULL and non-pointer ('int' and NULL)}}
72 b
= NULL
== a
|| NULL
!= a
; // expected-warning 2{{comparison between NULL and non-pointer (NULL and 'int')}}
74 b
= &a
< NULL
|| NULL
< &a
|| &a
> NULL
|| NULL
> &a
; // expected-error 4{{ordered comparison between pointer and zero}}
75 b
= &a
<= NULL
|| NULL
<= &a
|| &a
>= NULL
|| NULL
>= &a
; // expected-error 4{{ordered comparison between pointer and zero}}
76 b
= &a
== NULL
|| NULL
== &a
|| &a
!= NULL
|| NULL
!= &a
;
81 b
= NULL
< NULL
|| NULL
> NULL
;
82 b
= NULL
<= NULL
|| NULL
>= NULL
;
83 b
= NULL
== NULL
|| NULL
!= NULL
;
85 b
= ((NULL
)) != a
; // expected-warning{{comparison between NULL and non-pointer (NULL and 'int')}}
87 // Check that even non-standard pointers don't warn.
88 b
= c
== NULL
|| NULL
== c
|| c
!= NULL
|| NULL
!= c
;
89 b
= d
== NULL
|| NULL
== d
|| d
!= NULL
|| NULL
!= d
;
90 b
= e
== NULL
|| NULL
== e
|| e
!= NULL
|| NULL
!= e
;
91 b
= f
== NULL
|| NULL
== f
|| f
!= NULL
|| NULL
!= f
;
92 b
= "f" == NULL
|| NULL
== "f" || "f" != NULL
|| NULL
!= "f";
94 return NULL
; // expected-error{{void function 'f' should not return a value}}