19cb00b9eSJamie Schmeiser // RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wextra -std=c++11 -isystem %S/Inputs
29cb00b9eSJamie Schmeiser // RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wnull-pointer-subtraction -std=c++11 -isystem %S/Inputs
39cb00b9eSJamie Schmeiser // RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wextra -std=c++11 -isystem %S/Inputs -Wsystem-headers -DSYSTEM_WARNINGS
49cb00b9eSJamie Schmeiser // RUN: %clang_cc1 %s -fsyntax-only -verify -pedantic -Wnull-pointer-subtraction -std=c++11 -isystem %S/Inputs -Wsystem-headers -DSYSTEM_WARNINGS
59cb00b9eSJamie Schmeiser
69cb00b9eSJamie Schmeiser #include <pointer-subtraction.h>
79cb00b9eSJamie Schmeiser
a()89cb00b9eSJamie Schmeiser void a() {
99cb00b9eSJamie Schmeiser char *f = (char *)0;
109cb00b9eSJamie Schmeiser f = (char *)((char *)0 - f); // expected-warning {{performing pointer subtraction with a null pointer may have undefined behavior}}
119cb00b9eSJamie Schmeiser f = (char *)(f - (char *)0); // expected-warning {{performing pointer subtraction with a null pointer may have undefined behavior}}
129cb00b9eSJamie Schmeiser f = (char *)((char *)0 - (char *)0); // valid in C++
139cb00b9eSJamie Schmeiser
14*efbf0136SJamie Schmeiser if (1)
15*efbf0136SJamie Schmeiser f = (char *)((char *)0 - f); // expected-warning {{performing pointer subtraction with a null pointer may have undefined behavior}}
16*efbf0136SJamie Schmeiser else
17*efbf0136SJamie Schmeiser f = (char *)((char *)0 - f);
18*efbf0136SJamie Schmeiser
19*efbf0136SJamie Schmeiser if (0)
20*efbf0136SJamie Schmeiser f = (char *)((char *)0 - f);
21*efbf0136SJamie Schmeiser else
22*efbf0136SJamie Schmeiser f = (char *)((char *)0 - f); // expected-warning {{performing pointer subtraction with a null pointer may have undefined behavior}}
23*efbf0136SJamie Schmeiser
249cb00b9eSJamie Schmeiser #ifndef SYSTEM_WARNINGS
259cb00b9eSJamie Schmeiser SYSTEM_MACRO(f);
269cb00b9eSJamie Schmeiser #else
279cb00b9eSJamie Schmeiser SYSTEM_MACRO(f); // expected-warning {{performing pointer subtraction with a null pointer may have undefined behavior}}
289cb00b9eSJamie Schmeiser #endif
299cb00b9eSJamie Schmeiser }
30