1*89a1d03eSRichard // RUN: %check_clang_tidy -std=c++98 %s modernize-use-nullptr %t -- -- -Wno-non-literal-null-conversion
2*89a1d03eSRichard //
3*89a1d03eSRichard // Some parts of the test (e.g. assignment of `const int` to `int *`) fail in
4*89a1d03eSRichard // C++11, so we need to run the test in C++98 mode.
5*89a1d03eSRichard //
6*89a1d03eSRichard // FIXME: Make the test work in all language modes.
7*89a1d03eSRichard
8*89a1d03eSRichard const unsigned int g_null = 0;
9*89a1d03eSRichard #define NULL 0
10*89a1d03eSRichard
test_assignment()11*89a1d03eSRichard void test_assignment() {
12*89a1d03eSRichard int *p1 = 0;
13*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr [modernize-use-nullptr]
14*89a1d03eSRichard // CHECK-FIXES: int *p1 = nullptr;
15*89a1d03eSRichard p1 = 0;
16*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use nullptr
17*89a1d03eSRichard // CHECK-FIXES: p1 = nullptr;
18*89a1d03eSRichard
19*89a1d03eSRichard int *p2 = NULL;
20*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
21*89a1d03eSRichard // CHECK-FIXES: int *p2 = nullptr;
22*89a1d03eSRichard
23*89a1d03eSRichard p2 = p1;
24*89a1d03eSRichard // CHECK-FIXES: p2 = p1;
25*89a1d03eSRichard
26*89a1d03eSRichard const int null = 0;
27*89a1d03eSRichard int *p3 = null;
28*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
29*89a1d03eSRichard // CHECK-FIXES: int *p3 = nullptr;
30*89a1d03eSRichard
31*89a1d03eSRichard p3 = NULL;
32*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use nullptr
33*89a1d03eSRichard // CHECK-FIXES: p3 = nullptr;
34*89a1d03eSRichard
35*89a1d03eSRichard int *p4 = p3;
36*89a1d03eSRichard // CHECK-FIXES: int *p4 = p3;
37*89a1d03eSRichard
38*89a1d03eSRichard p4 = null;
39*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use nullptr
40*89a1d03eSRichard // CHECK-FIXES: p4 = nullptr;
41*89a1d03eSRichard
42*89a1d03eSRichard int i1 = 0;
43*89a1d03eSRichard
44*89a1d03eSRichard int i2 = NULL;
45*89a1d03eSRichard
46*89a1d03eSRichard int i3 = null;
47*89a1d03eSRichard
48*89a1d03eSRichard int *p5, *p6, *p7;
49*89a1d03eSRichard p5 = p6 = p7 = NULL;
50*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use nullptr
51*89a1d03eSRichard // CHECK-FIXES: p5 = p6 = p7 = nullptr;
52*89a1d03eSRichard }
53*89a1d03eSRichard
54*89a1d03eSRichard struct Foo {
FooFoo55*89a1d03eSRichard Foo(int *p = NULL) : m_p1(p) {}
56*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:16: warning: use nullptr
57*89a1d03eSRichard // CHECK-FIXES: Foo(int *p = nullptr) : m_p1(p) {}
58*89a1d03eSRichard
barFoo59*89a1d03eSRichard void bar(int *p = 0) {}
60*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: use nullptr
61*89a1d03eSRichard // CHECK-FIXES: void bar(int *p = nullptr) {}
62*89a1d03eSRichard
bazFoo63*89a1d03eSRichard void baz(int i = 0) {}
64*89a1d03eSRichard
65*89a1d03eSRichard int *m_p1;
66*89a1d03eSRichard static int *m_p2;
67*89a1d03eSRichard };
68*89a1d03eSRichard
69*89a1d03eSRichard int *Foo::m_p2 = NULL;
70*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use nullptr
71*89a1d03eSRichard // CHECK-FIXES: int *Foo::m_p2 = nullptr;
72*89a1d03eSRichard
73*89a1d03eSRichard template <typename T>
74*89a1d03eSRichard struct Bar {
BarBar75*89a1d03eSRichard Bar(T *p) : m_p(p) {
76*89a1d03eSRichard m_p = static_cast<T*>(NULL);
77*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
78*89a1d03eSRichard // CHECK-FIXES: m_p = static_cast<T*>(nullptr);
79*89a1d03eSRichard
80*89a1d03eSRichard m_p = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
81*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:27: warning: use nullptr
82*89a1d03eSRichard // CHECK-FIXES: m_p = static_cast<T*>(nullptr);
83*89a1d03eSRichard
84*89a1d03eSRichard m_p = static_cast<T*>(p ? p : static_cast<void*>(g_null));
85*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:54: warning: use nullptr
86*89a1d03eSRichard // CHECK-FIXES: m_p = static_cast<T*>(p ? p : static_cast<void*>(nullptr));
87*89a1d03eSRichard
88*89a1d03eSRichard T *p2 = static_cast<T*>(reinterpret_cast<int*>((void*)NULL));
89*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
90*89a1d03eSRichard // CHECK-FIXES: T *p2 = static_cast<T*>(nullptr);
91*89a1d03eSRichard
92*89a1d03eSRichard m_p = NULL;
93*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: use nullptr
94*89a1d03eSRichard // CHECK-FIXES: m_p = nullptr;
95*89a1d03eSRichard
96*89a1d03eSRichard int i = static_cast<int>(0.f);
97*89a1d03eSRichard T *i2 = static_cast<int>(0.f);
98*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
99*89a1d03eSRichard // CHECK-FIXES: T *i2 = nullptr;
100*89a1d03eSRichard }
101*89a1d03eSRichard
102*89a1d03eSRichard T *m_p;
103*89a1d03eSRichard };
104*89a1d03eSRichard
105*89a1d03eSRichard struct Baz {
BazBaz106*89a1d03eSRichard Baz() : i(0) {}
107*89a1d03eSRichard int i;
108*89a1d03eSRichard };
109*89a1d03eSRichard
test_cxx_cases()110*89a1d03eSRichard void test_cxx_cases() {
111*89a1d03eSRichard Foo f(g_null);
112*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use nullptr
113*89a1d03eSRichard // CHECK-FIXES: Foo f(nullptr);
114*89a1d03eSRichard
115*89a1d03eSRichard f.bar(NULL);
116*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use nullptr
117*89a1d03eSRichard // CHECK-FIXES: f.bar(nullptr);
118*89a1d03eSRichard
119*89a1d03eSRichard f.baz(g_null);
120*89a1d03eSRichard
121*89a1d03eSRichard f.m_p1 = 0;
122*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use nullptr
123*89a1d03eSRichard // CHECK-FIXES: f.m_p1 = nullptr;
124*89a1d03eSRichard
125*89a1d03eSRichard Bar<int> b(g_null);
126*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: use nullptr
127*89a1d03eSRichard // CHECK-FIXES: Bar<int> b(nullptr);
128*89a1d03eSRichard
129*89a1d03eSRichard Baz b2;
130*89a1d03eSRichard int Baz::*memptr(0);
131*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use nullptr
132*89a1d03eSRichard // CHECK-FIXES: int Baz::*memptr(nullptr);
133*89a1d03eSRichard
134*89a1d03eSRichard memptr = 0;
135*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: use nullptr
136*89a1d03eSRichard // CHECK-FIXES: memptr = nullptr;
137*89a1d03eSRichard }
138*89a1d03eSRichard
139*89a1d03eSRichard void test_function_default_param1(void *p = 0);
140*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: use nullptr
141*89a1d03eSRichard // CHECK-FIXES: void test_function_default_param1(void *p = nullptr);
142*89a1d03eSRichard
143*89a1d03eSRichard void test_function_default_param2(void *p = NULL);
144*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: use nullptr
145*89a1d03eSRichard // CHECK-FIXES: void test_function_default_param2(void *p = nullptr);
146*89a1d03eSRichard
147*89a1d03eSRichard void test_function_default_param3(void *p = g_null);
148*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:45: warning: use nullptr
149*89a1d03eSRichard // CHECK-FIXES: void test_function_default_param3(void *p = nullptr);
150*89a1d03eSRichard
test_function(int * p)151*89a1d03eSRichard void test_function(int *p) {}
152*89a1d03eSRichard
test_function_no_ptr_param(int i)153*89a1d03eSRichard void test_function_no_ptr_param(int i) {}
154*89a1d03eSRichard
test_function_call()155*89a1d03eSRichard void test_function_call() {
156*89a1d03eSRichard test_function(0);
157*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use nullptr
158*89a1d03eSRichard // CHECK-FIXES: test_function(nullptr);
159*89a1d03eSRichard
160*89a1d03eSRichard test_function(NULL);
161*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use nullptr
162*89a1d03eSRichard // CHECK-FIXES: test_function(nullptr);
163*89a1d03eSRichard
164*89a1d03eSRichard test_function(g_null);
165*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use nullptr
166*89a1d03eSRichard // CHECK-FIXES: test_function(nullptr);
167*89a1d03eSRichard
168*89a1d03eSRichard test_function_no_ptr_param(0);
169*89a1d03eSRichard }
170*89a1d03eSRichard
test_function_return1()171*89a1d03eSRichard char *test_function_return1() {
172*89a1d03eSRichard return 0;
173*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
174*89a1d03eSRichard // CHECK-FIXES: return nullptr;
175*89a1d03eSRichard }
176*89a1d03eSRichard
test_function_return2()177*89a1d03eSRichard void *test_function_return2() {
178*89a1d03eSRichard return NULL;
179*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
180*89a1d03eSRichard // CHECK-FIXES: return nullptr;
181*89a1d03eSRichard }
182*89a1d03eSRichard
test_function_return3()183*89a1d03eSRichard long *test_function_return3() {
184*89a1d03eSRichard return g_null;
185*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
186*89a1d03eSRichard // CHECK-FIXES: return nullptr;
187*89a1d03eSRichard }
188*89a1d03eSRichard
test_function_return4()189*89a1d03eSRichard int test_function_return4() {
190*89a1d03eSRichard return 0;
191*89a1d03eSRichard }
192*89a1d03eSRichard
test_function_return5()193*89a1d03eSRichard int test_function_return5() {
194*89a1d03eSRichard return NULL;
195*89a1d03eSRichard }
196*89a1d03eSRichard
test_function_return6()197*89a1d03eSRichard int test_function_return6() {
198*89a1d03eSRichard return g_null;
199*89a1d03eSRichard }
200*89a1d03eSRichard
test_function_return_cast1()201*89a1d03eSRichard int *test_function_return_cast1() {
202*89a1d03eSRichard return(int)0;
203*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use nullptr
204*89a1d03eSRichard // CHECK-FIXES: return nullptr;
205*89a1d03eSRichard }
206*89a1d03eSRichard
test_function_return_cast2()207*89a1d03eSRichard int *test_function_return_cast2() {
208*89a1d03eSRichard #define RET return
209*89a1d03eSRichard RET(int)0;
210*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use nullptr
211*89a1d03eSRichard // CHECK-FIXES: RET nullptr;
212*89a1d03eSRichard #undef RET
213*89a1d03eSRichard }
214*89a1d03eSRichard
215*89a1d03eSRichard // Test parentheses expressions resulting in a nullptr.
test_parentheses_expression1()216*89a1d03eSRichard int *test_parentheses_expression1() {
217*89a1d03eSRichard return(0);
218*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
219*89a1d03eSRichard // CHECK-FIXES: return(nullptr);
220*89a1d03eSRichard }
221*89a1d03eSRichard
test_parentheses_expression2()222*89a1d03eSRichard int *test_parentheses_expression2() {
223*89a1d03eSRichard return(int(0.f));
224*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
225*89a1d03eSRichard // CHECK-FIXES: return(nullptr);
226*89a1d03eSRichard }
227*89a1d03eSRichard
test_nested_parentheses_expression()228*89a1d03eSRichard int *test_nested_parentheses_expression() {
229*89a1d03eSRichard return((((0))));
230*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
231*89a1d03eSRichard // CHECK-FIXES: return((((nullptr))));
232*89a1d03eSRichard }
233*89a1d03eSRichard
test_parentheses_explicit_cast()234*89a1d03eSRichard void *test_parentheses_explicit_cast() {
235*89a1d03eSRichard return(static_cast<void*>(0));
236*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
237*89a1d03eSRichard // CHECK-FIXES: return(static_cast<void*>(nullptr));
238*89a1d03eSRichard }
239*89a1d03eSRichard
test_parentheses_explicit_cast_sequence1()240*89a1d03eSRichard void *test_parentheses_explicit_cast_sequence1() {
241*89a1d03eSRichard return(static_cast<void*>(static_cast<int*>((void*)NULL)));
242*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
243*89a1d03eSRichard // CHECK-FIXES: return(static_cast<void*>(nullptr));
244*89a1d03eSRichard }
245*89a1d03eSRichard
test_parentheses_explicit_cast_sequence2()246*89a1d03eSRichard void *test_parentheses_explicit_cast_sequence2() {
247*89a1d03eSRichard return(static_cast<void*>(reinterpret_cast<int*>((float*)int(0.f))));
248*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:29: warning: use nullptr
249*89a1d03eSRichard // CHECK-FIXES: return(static_cast<void*>(nullptr));
250*89a1d03eSRichard }
251*89a1d03eSRichard
252*89a1d03eSRichard // Test explicit cast expressions resulting in nullptr.
253*89a1d03eSRichard struct Bam {
BamBam254*89a1d03eSRichard Bam(int *a) {}
BamBam255*89a1d03eSRichard Bam(float *a) {}
operator =Bam256*89a1d03eSRichard Bam operator=(int *a) { return Bam(a); }
operator =Bam257*89a1d03eSRichard Bam operator=(float *a) { return Bam(a); }
258*89a1d03eSRichard };
259*89a1d03eSRichard
ambiguous_function(int * a)260*89a1d03eSRichard void ambiguous_function(int *a) {}
ambiguous_function(float * a)261*89a1d03eSRichard void ambiguous_function(float *a) {}
const_ambiguous_function(const int * p)262*89a1d03eSRichard void const_ambiguous_function(const int *p) {}
const_ambiguous_function(const float * p)263*89a1d03eSRichard void const_ambiguous_function(const float *p) {}
264*89a1d03eSRichard
test_explicit_cast_ambiguous1()265*89a1d03eSRichard void test_explicit_cast_ambiguous1() {
266*89a1d03eSRichard ambiguous_function((int*)0);
267*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use nullptr
268*89a1d03eSRichard // CHECK-FIXES: ambiguous_function((int*)nullptr);
269*89a1d03eSRichard }
270*89a1d03eSRichard
test_explicit_cast_ambiguous2()271*89a1d03eSRichard void test_explicit_cast_ambiguous2() {
272*89a1d03eSRichard ambiguous_function((int*)(0));
273*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:28: warning: use nullptr
274*89a1d03eSRichard // CHECK-FIXES: ambiguous_function((int*)nullptr);
275*89a1d03eSRichard }
276*89a1d03eSRichard
test_explicit_cast_ambiguous3()277*89a1d03eSRichard void test_explicit_cast_ambiguous3() {
278*89a1d03eSRichard ambiguous_function(static_cast<int*>(reinterpret_cast<int*>((float*)0)));
279*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: use nullptr
280*89a1d03eSRichard // CHECK-FIXES: ambiguous_function(static_cast<int*>(nullptr));
281*89a1d03eSRichard }
282*89a1d03eSRichard
test_explicit_cast_ambiguous4()283*89a1d03eSRichard Bam test_explicit_cast_ambiguous4() {
284*89a1d03eSRichard return(((int*)(0)));
285*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use nullptr
286*89a1d03eSRichard // CHECK-FIXES: return(((int*)nullptr));
287*89a1d03eSRichard }
288*89a1d03eSRichard
test_explicit_cast_ambiguous5()289*89a1d03eSRichard void test_explicit_cast_ambiguous5() {
290*89a1d03eSRichard // Test for ambiguous overloaded constructors.
291*89a1d03eSRichard Bam k((int*)(0));
292*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:15: warning: use nullptr
293*89a1d03eSRichard // CHECK-FIXES: Bam k((int*)nullptr);
294*89a1d03eSRichard
295*89a1d03eSRichard // Test for ambiguous overloaded operators.
296*89a1d03eSRichard k = (int*)0;
297*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
298*89a1d03eSRichard // CHECK-FIXES: k = (int*)nullptr;
299*89a1d03eSRichard }
300*89a1d03eSRichard
test_const_pointers_abiguous()301*89a1d03eSRichard void test_const_pointers_abiguous() {
302*89a1d03eSRichard const_ambiguous_function((int*)0);
303*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: use nullptr
304*89a1d03eSRichard // CHECK-FIXES: const_ambiguous_function((int*)nullptr);
305*89a1d03eSRichard }
306*89a1d03eSRichard
307*89a1d03eSRichard // Test where the implicit cast to null is surrounded by another implicit cast
308*89a1d03eSRichard // with possible explicit casts in-between.
test_const_pointers()309*89a1d03eSRichard void test_const_pointers() {
310*89a1d03eSRichard const int *const_p1 = 0;
311*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
312*89a1d03eSRichard // CHECK-FIXES: const int *const_p1 = nullptr;
313*89a1d03eSRichard const int *const_p2 = NULL;
314*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
315*89a1d03eSRichard // CHECK-FIXES: const int *const_p2 = nullptr;
316*89a1d03eSRichard const int *const_p3 = (int)0;
317*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
318*89a1d03eSRichard // CHECK-FIXES: const int *const_p3 = nullptr;
319*89a1d03eSRichard const int *const_p4 = (int)0.0f;
320*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
321*89a1d03eSRichard // CHECK-FIXES: const int *const_p4 = nullptr;
322*89a1d03eSRichard const int *const_p5 = (int*)0;
323*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:31: warning: use nullptr
324*89a1d03eSRichard // CHECK-FIXES: const int *const_p5 = (int*)nullptr;
325*89a1d03eSRichard int *t;
326*89a1d03eSRichard const int *const_p6 = static_cast<int*>(t ? t : static_cast<int*>(0));
327*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:69: warning: use nullptr
328*89a1d03eSRichard // CHECK-FIXES: const int *const_p6 = static_cast<int*>(t ? t : static_cast<int*>(nullptr));
329*89a1d03eSRichard }
330*89a1d03eSRichard
test_nested_implicit_cast_expr()331*89a1d03eSRichard void test_nested_implicit_cast_expr() {
332*89a1d03eSRichard int func0(void*, void*);
333*89a1d03eSRichard int func1(int, void*, void*);
334*89a1d03eSRichard
335*89a1d03eSRichard (double)func1(0, 0, 0);
336*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use nullptr
337*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:23: warning: use nullptr
338*89a1d03eSRichard // CHECK-FIXES: (double)func1(0, nullptr, nullptr);
339*89a1d03eSRichard (double)func1(func0(0, 0), 0, 0);
340*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: use nullptr
341*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-2]]:26: warning: use nullptr
342*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-3]]:30: warning: use nullptr
343*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-4]]:33: warning: use nullptr
344*89a1d03eSRichard // CHECK-FIXES: (double)func1(func0(nullptr, nullptr), nullptr, nullptr);
345*89a1d03eSRichard }
346*89a1d03eSRichard
347*89a1d03eSRichard // FIXME: currently, the check doesn't work as it should with templates.
348*89a1d03eSRichard template<typename T>
349*89a1d03eSRichard class A {
350*89a1d03eSRichard public:
A(T * p=NULL)351*89a1d03eSRichard A(T *p = NULL) {}
352*89a1d03eSRichard
f()353*89a1d03eSRichard void f() {
354*89a1d03eSRichard Ptr = NULL;
355*89a1d03eSRichard }
356*89a1d03eSRichard T *Ptr;
357*89a1d03eSRichard };
358*89a1d03eSRichard
359*89a1d03eSRichard template<typename T>
f2(T * a=NULL)360*89a1d03eSRichard T *f2(T *a = NULL) {
361*89a1d03eSRichard return a ? a : NULL;
362*89a1d03eSRichard }
363