xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/misc/misplaced-const.c (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s misc-misplaced-const %t
2*89a1d03eSRichard 
3*89a1d03eSRichard typedef int plain_i;
4*89a1d03eSRichard typedef int *ip;
5*89a1d03eSRichard typedef const int *cip;
6*89a1d03eSRichard 
7*89a1d03eSRichard typedef void (*func_ptr)(void);
8*89a1d03eSRichard 
func(void)9*89a1d03eSRichard void func(void) {
10*89a1d03eSRichard   // ok
11*89a1d03eSRichard   const int *i0 = 0;
12*89a1d03eSRichard   const plain_i *i1 = 0;
13*89a1d03eSRichard   const cip i2 = 0; // const applies to both pointer and pointee.
14*89a1d03eSRichard 
15*89a1d03eSRichard   // Not ok
16*89a1d03eSRichard   const ip i3 = 0;
17*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: 'i3' declared with a const-qualified typedef; results in the type being 'int *const' instead of 'const int *'
18*89a1d03eSRichard 
19*89a1d03eSRichard   ip const i4 = 0;
20*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: 'i4' declared with a const-qualified typedef; results in the type being 'int *const' instead of 'const int *'
21*89a1d03eSRichard 
22*89a1d03eSRichard   const volatile ip i5 = 0;
23*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: 'i5' declared with a const-qualified typedef; results in the type being 'int *const volatile' instead of 'const int *volatile'
24*89a1d03eSRichard }
25*89a1d03eSRichard 
func2(const plain_i * i1,const cip i2,const ip i3,const int * i4)26*89a1d03eSRichard void func2(const plain_i *i1,
27*89a1d03eSRichard            const cip i2,
28*89a1d03eSRichard            const ip i3,
29*89a1d03eSRichard            // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: 'i3' declared with a const-qualified
30*89a1d03eSRichard            const int *i4) {
31*89a1d03eSRichard }
32*89a1d03eSRichard 
33*89a1d03eSRichard struct S {
34*89a1d03eSRichard   const int *i0;
35*89a1d03eSRichard   const plain_i *i1;
36*89a1d03eSRichard   const cip i2;
37*89a1d03eSRichard   const ip i3;
38*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: 'i3' declared with a const-qualified
39*89a1d03eSRichard };
40*89a1d03eSRichard 
41*89a1d03eSRichard // Function pointers should not be diagnosed because a function
42*89a1d03eSRichard // pointer type can never be const.
func3(const func_ptr fp)43*89a1d03eSRichard void func3(const func_ptr fp) {
44*89a1d03eSRichard   const func_ptr fp2 = fp;
45*89a1d03eSRichard }
46