1*803cbcbcSBjörn Svensson // RUN: %check_clang_tidy %s modernize-use-nullptr %t -- -- -std=c23
2*803cbcbcSBjörn Svensson
3*803cbcbcSBjörn Svensson #define NULL 0
4*803cbcbcSBjörn Svensson
test_assignment()5*803cbcbcSBjörn Svensson void test_assignment() {
6*803cbcbcSBjörn Svensson int *p1 = 0;
7*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr [modernize-use-nullptr]
8*803cbcbcSBjörn Svensson // CHECK-FIXES: int *p1 = nullptr;
9*803cbcbcSBjörn Svensson p1 = 0;
10*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use nullptr
11*803cbcbcSBjörn Svensson // CHECK-FIXES: p1 = nullptr;
12*803cbcbcSBjörn Svensson
13*803cbcbcSBjörn Svensson int *p2 = NULL;
14*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
15*803cbcbcSBjörn Svensson // CHECK-FIXES: int *p2 = nullptr;
16*803cbcbcSBjörn Svensson
17*803cbcbcSBjörn Svensson p2 = p1;
18*803cbcbcSBjörn Svensson // CHECK-FIXES: p2 = p1;
19*803cbcbcSBjörn Svensson
20*803cbcbcSBjörn Svensson const int null = 0;
21*803cbcbcSBjörn Svensson int *p3 = &null;
22*803cbcbcSBjörn Svensson
23*803cbcbcSBjörn Svensson p3 = NULL;
24*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: use nullptr
25*803cbcbcSBjörn Svensson // CHECK-FIXES: p3 = nullptr;
26*803cbcbcSBjörn Svensson
27*803cbcbcSBjörn Svensson int *p4 = p3;
28*803cbcbcSBjörn Svensson
29*803cbcbcSBjörn Svensson int i1 = 0;
30*803cbcbcSBjörn Svensson
31*803cbcbcSBjörn Svensson int i2 = NULL;
32*803cbcbcSBjörn Svensson
33*803cbcbcSBjörn Svensson int i3 = null;
34*803cbcbcSBjörn Svensson
35*803cbcbcSBjörn Svensson int *p5, *p6, *p7;
36*803cbcbcSBjörn Svensson p5 = p6 = p7 = NULL;
37*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:18: warning: use nullptr
38*803cbcbcSBjörn Svensson // CHECK-FIXES: p5 = p6 = p7 = nullptr;
39*803cbcbcSBjörn Svensson }
40*803cbcbcSBjörn Svensson
test_function(int * p)41*803cbcbcSBjörn Svensson void test_function(int *p) {}
42*803cbcbcSBjörn Svensson
test_function_no_ptr_param(int i)43*803cbcbcSBjörn Svensson void test_function_no_ptr_param(int i) {}
44*803cbcbcSBjörn Svensson
test_function_call()45*803cbcbcSBjörn Svensson void test_function_call() {
46*803cbcbcSBjörn Svensson test_function(0);
47*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use nullptr
48*803cbcbcSBjörn Svensson // CHECK-FIXES: test_function(nullptr);
49*803cbcbcSBjörn Svensson
50*803cbcbcSBjörn Svensson test_function(NULL);
51*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:17: warning: use nullptr
52*803cbcbcSBjörn Svensson // CHECK-FIXES: test_function(nullptr);
53*803cbcbcSBjörn Svensson
54*803cbcbcSBjörn Svensson test_function_no_ptr_param(0);
55*803cbcbcSBjörn Svensson }
56*803cbcbcSBjörn Svensson
test_function_return1()57*803cbcbcSBjörn Svensson char *test_function_return1() {
58*803cbcbcSBjörn Svensson return 0;
59*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
60*803cbcbcSBjörn Svensson // CHECK-FIXES: return nullptr;
61*803cbcbcSBjörn Svensson }
62*803cbcbcSBjörn Svensson
test_function_return2()63*803cbcbcSBjörn Svensson void *test_function_return2() {
64*803cbcbcSBjörn Svensson return NULL;
65*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
66*803cbcbcSBjörn Svensson // CHECK-FIXES: return nullptr;
67*803cbcbcSBjörn Svensson }
68*803cbcbcSBjörn Svensson
test_function_return4()69*803cbcbcSBjörn Svensson int test_function_return4() {
70*803cbcbcSBjörn Svensson return 0;
71*803cbcbcSBjörn Svensson }
72*803cbcbcSBjörn Svensson
test_function_return5()73*803cbcbcSBjörn Svensson int test_function_return5() {
74*803cbcbcSBjörn Svensson return NULL;
75*803cbcbcSBjörn Svensson }
76*803cbcbcSBjörn Svensson
test_function_return_cast1()77*803cbcbcSBjörn Svensson int *test_function_return_cast1() {
78*803cbcbcSBjörn Svensson return(int)0;
79*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:9: warning: use nullptr
80*803cbcbcSBjörn Svensson // CHECK-FIXES: return nullptr;
81*803cbcbcSBjörn Svensson }
82*803cbcbcSBjörn Svensson
test_function_return_cast2()83*803cbcbcSBjörn Svensson int *test_function_return_cast2() {
84*803cbcbcSBjörn Svensson #define RET return
85*803cbcbcSBjörn Svensson RET(int)0;
86*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:6: warning: use nullptr
87*803cbcbcSBjörn Svensson // CHECK-FIXES: RET nullptr;
88*803cbcbcSBjörn Svensson #undef RET
89*803cbcbcSBjörn Svensson }
90*803cbcbcSBjörn Svensson
91*803cbcbcSBjörn Svensson // Test parentheses expressions resulting in a nullptr.
test_parentheses_expression1()92*803cbcbcSBjörn Svensson int *test_parentheses_expression1() {
93*803cbcbcSBjörn Svensson return(0);
94*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
95*803cbcbcSBjörn Svensson // CHECK-FIXES: return(nullptr);
96*803cbcbcSBjörn Svensson }
97*803cbcbcSBjörn Svensson
test_parentheses_expression2()98*803cbcbcSBjörn Svensson int *test_parentheses_expression2() {
99*803cbcbcSBjörn Svensson return((int)(0.0f));
100*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: use nullptr
101*803cbcbcSBjörn Svensson // CHECK-FIXES: return(nullptr);
102*803cbcbcSBjörn Svensson }
103*803cbcbcSBjörn Svensson
test_nested_parentheses_expression()104*803cbcbcSBjörn Svensson int *test_nested_parentheses_expression() {
105*803cbcbcSBjörn Svensson return((((0))));
106*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:13: warning: use nullptr
107*803cbcbcSBjörn Svensson // CHECK-FIXES: return((((nullptr))));
108*803cbcbcSBjörn Svensson }
109*803cbcbcSBjörn Svensson
test_const_pointers()110*803cbcbcSBjörn Svensson void test_const_pointers() {
111*803cbcbcSBjörn Svensson const int *const_p1 = 0;
112*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
113*803cbcbcSBjörn Svensson // CHECK-FIXES: const int *const_p1 = nullptr;
114*803cbcbcSBjörn Svensson const int *const_p2 = NULL;
115*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
116*803cbcbcSBjörn Svensson // CHECK-FIXES: const int *const_p2 = nullptr;
117*803cbcbcSBjörn Svensson const int *const_p3 = (int)0;
118*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
119*803cbcbcSBjörn Svensson // CHECK-FIXES: const int *const_p3 = nullptr;
120*803cbcbcSBjörn Svensson const int *const_p4 = (int)0.0f;
121*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:25: warning: use nullptr
122*803cbcbcSBjörn Svensson // CHECK-FIXES: const int *const_p4 = nullptr;
123*803cbcbcSBjörn Svensson }
124*803cbcbcSBjörn Svensson
test_nested_implicit_cast_expr()125*803cbcbcSBjörn Svensson void test_nested_implicit_cast_expr() {
126*803cbcbcSBjörn Svensson int func0(void*, void*);
127*803cbcbcSBjörn Svensson int func1(int, void*, void*);
128*803cbcbcSBjörn Svensson
129*803cbcbcSBjörn Svensson (double)func1(0, 0, 0);
130*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:20: warning: use nullptr
131*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-2]]:23: warning: use nullptr
132*803cbcbcSBjörn Svensson // CHECK-FIXES: (double)func1(0, nullptr, nullptr);
133*803cbcbcSBjörn Svensson (double)func1(func0(0, 0), 0, 0);
134*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: use nullptr
135*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-2]]:26: warning: use nullptr
136*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-3]]:30: warning: use nullptr
137*803cbcbcSBjörn Svensson // CHECK-MESSAGES: :[[@LINE-4]]:33: warning: use nullptr
138*803cbcbcSBjörn Svensson // CHECK-FIXES: (double)func1(func0(nullptr, nullptr), nullptr, nullptr);
139*803cbcbcSBjörn Svensson }
140