Clang Project

clang_source_code/test/SemaCXX/warn-zero-nullptr.cpp
1// RUN: %clang_cc1 -fsyntax-only -verify %s -isystem %S/Inputs -Wzero-as-null-pointer-constant -std=c++11
2// RUN: %clang_cc1 -fsyntax-only -verify %s -isystem %S/Inputs -DSYSTEM_WARNINGS -Wzero-as-null-pointer-constant -Wsystem-headers -std=c++11
3
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 an integer constant expression, so warn on it too:
20void* p2 = __null; // expected-warning{{zero as null pointer constant}}
21void (*fp2)() = __null; // expected-warning{{zero as null pointer constant}}
22int (S::*mp2) = __null; // expected-warning{{zero as null pointer constant}}
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_WARNINGS
85// Do not warn on *any* other macros from system headers, even if they
86// expand to/their expansion contains NULL.
87void* sys_init = SYSTEM_MACRO;
88void* sys_init2 = OTHER_SYSTEM_MACRO;
89#else
90void* 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#endif
93