93 lines · cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s -isystem %S/Inputs -Wzero-as-null-pointer-constant -std=c++112// RUN: %clang_cc1 -fsyntax-only -verify %s -isystem %S/Inputs -DSYSTEM_WARNINGS -Wzero-as-null-pointer-constant -Wsystem-headers -std=c++113 4#include <warn-zero-nullptr.h>5 6#define MACRO (0)7#define MCRO(x) (x)8 9struct S {};10 11int (S::*mp0) = nullptr;12void (*fp0)() = nullptr;13void* p0 = nullptr;14 15int (S::*mp1) = 0; // expected-warning{{zero as null pointer constant}}16void (*fp1)() = 0; // expected-warning{{zero as null pointer constant}}17void* p1 = 0; // expected-warning{{zero as null pointer constant}}18 19// __null is not treated as an integer constant expression for GCC compatibility20void* p2 = __null;21void (*fp2)() = __null;22int (S::*mp2) = __null;23 24void f0(void* v = MACRO); // expected-warning{{zero as null pointer constant}}25void f1(void* v = NULL); // expected-warning{{zero as null pointer constant}}26void f2(void* v = MCRO(0)); // expected-warning{{zero as null pointer constant}}27void f3(void* v = MCRO(NULL)); // expected-warning{{zero as null pointer constant}}28void f4(void* v = 0); // expected-warning{{zero as null pointer constant}}29void f5(void* v);30 31void g() {32 f1(0); // expected-warning{{zero as null pointer constant}}33}34 35// Warn on these too. Matches gcc and arguably makes sense.36void* pp = (decltype(nullptr))0; // expected-warning{{zero as null pointer constant}}37void* pp2 = static_cast<decltype(nullptr)>(0); // expected-warning{{zero as null pointer constant}}38 39// Shouldn't warn.40namespace pr34362 {41struct A { operator int*() { return nullptr; } };42void func() { if (nullptr == A()) {} }43void func2() { if ((nullptr) == A()) {} }44}45 46template <typename T> void TmplFunc0(T var) {}47void Func0Test() {48 TmplFunc0<int>(0);49 TmplFunc0<int*>(0); // expected-warning {{zero as null pointer constant}}50 TmplFunc0<void*>(0); // expected-warning {{zero as null pointer constant}}51}52 53// FIXME: this one probably should not warn.54template <typename T> void TmplFunc1(int a, T default_value = 0) {} // expected-warning{{zero as null pointer constant}} expected-warning{{zero as null pointer constant}}55void FuncTest() {56 TmplFunc1<int>(0);57 TmplFunc1<int*>(0); // expected-note {{in instantiation of default function argument expression for 'TmplFunc1<int *>' required here}}58 TmplFunc1<void*>(0); // expected-note {{in instantiation of default function argument expression for 'TmplFunc1<void *>' required here}}59}60 61template<typename T>62class TemplateClass0 {63 public:64 explicit TemplateClass0(T var) {}65};66void TemplateClass0Test() {67 TemplateClass0<int> a(0);68 TemplateClass0<int*> b(0); // expected-warning {{zero as null pointer constant}}69 TemplateClass0<void*> c(0); // expected-warning {{zero as null pointer constant}}70}71 72template<typename T>73class TemplateClass1 {74 public:75// FIXME: this one should *NOT* warn.76 explicit TemplateClass1(int a, T default_value = 0) {} // expected-warning{{zero as null pointer constant}} expected-warning{{zero as null pointer constant}}77};78void IgnoreSubstTemplateType1() {79 TemplateClass1<int> a(1);80 TemplateClass1<int*> b(1); // expected-note {{in instantiation of default function argument expression for 'TemplateClass1<int *>' required here}}81 TemplateClass1<void*> c(1); // expected-note {{in instantiation of default function argument expression for 'TemplateClass1<void *>' required here}}82}83 84#ifndef SYSTEM_WARNINGS85// Do not warn on *any* other macros from system headers, even if they86// expand to/their expansion contains NULL.87void* sys_init = SYSTEM_MACRO;88void* sys_init2 = OTHER_SYSTEM_MACRO;89#else90void* sys_init = SYSTEM_MACRO; // expected-warning {{zero as null pointer constant}}91void* sys_init2 = OTHER_SYSTEM_MACRO; // expected-warning {{zero as null pointer constant}}92#endif93