xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/avoid-c-arrays.cpp (revision 89a1d03e2b379e325daa5249411e414bbd995b5e)
1*89a1d03eSRichard // RUN: %check_clang_tidy %s modernize-avoid-c-arrays %t
2*89a1d03eSRichard 
3*89a1d03eSRichard int a[] = {1, 2};
4*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use std::array<> instead
5*89a1d03eSRichard 
6*89a1d03eSRichard int b[1];
7*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use std::array<> instead
8*89a1d03eSRichard 
9*89a1d03eSRichard void foo() {
10*89a1d03eSRichard   int c[b[0]];
11*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C VLA arrays, use std::vector<> instead
12*89a1d03eSRichard 
13*89a1d03eSRichard   using d = decltype(c);
14*89a1d03eSRichard   d e;
15*89a1d03eSRichard   // Semi-FIXME: we do not diagnose these last two lines separately,
16*89a1d03eSRichard   // because we point at typeLoc.getBeginLoc(), which is the decl before that
17*89a1d03eSRichard   // (int c[b[0]];), which is already diagnosed.
18*89a1d03eSRichard }
19*89a1d03eSRichard 
20*89a1d03eSRichard template <typename T, int Size>
21*89a1d03eSRichard class array {
22*89a1d03eSRichard   T d[Size];
23*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use std::array<> instead
24*89a1d03eSRichard 
25*89a1d03eSRichard   int e[1];
26*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use std::array<> instead
27*89a1d03eSRichard };
28*89a1d03eSRichard 
29*89a1d03eSRichard array<int[4], 2> d;
30*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not declare C-style arrays, use std::array<> instead
31*89a1d03eSRichard 
32*89a1d03eSRichard using k = int[4];
33*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not declare C-style arrays, use std::array<> instead
34*89a1d03eSRichard 
35*89a1d03eSRichard array<k, 2> dk;
36*89a1d03eSRichard 
37*89a1d03eSRichard template <typename T>
38*89a1d03eSRichard class unique_ptr {
39*89a1d03eSRichard   T *d;
40*89a1d03eSRichard 
41*89a1d03eSRichard   int e[1];
42*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use std::array<> instead
43*89a1d03eSRichard };
44*89a1d03eSRichard 
45*89a1d03eSRichard unique_ptr<int[]> d2;
46*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: do not declare C-style arrays, use std::array<> instead
47*89a1d03eSRichard 
48*89a1d03eSRichard using k2 = int[];
49*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: do not declare C-style arrays, use std::array<> instead
50*89a1d03eSRichard 
51*89a1d03eSRichard unique_ptr<k2> dk2;
52*89a1d03eSRichard 
53*89a1d03eSRichard // Some header
54*89a1d03eSRichard extern "C" {
55*89a1d03eSRichard 
56*89a1d03eSRichard int f[] = {1, 2};
57*89a1d03eSRichard 
58*89a1d03eSRichard int j[1];
59*89a1d03eSRichard 
60*89a1d03eSRichard inline void bar() {
61*89a1d03eSRichard   {
62*89a1d03eSRichard     int j[j[0]];
63*89a1d03eSRichard   }
64*89a1d03eSRichard }
65*89a1d03eSRichard 
66*89a1d03eSRichard extern "C++" {
67*89a1d03eSRichard int f3[] = {1, 2};
68*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use std::array<> instead
69*89a1d03eSRichard 
70*89a1d03eSRichard int j3[1];
71*89a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use std::array<> instead
72*89a1d03eSRichard 
73*89a1d03eSRichard struct Foo {
74*89a1d03eSRichard   int f3[3] = {1, 2};
75*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use std::array<> instead
76*89a1d03eSRichard 
77*89a1d03eSRichard   int j3[1];
78*89a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use std::array<> instead
79*89a1d03eSRichard };
80*89a1d03eSRichard }
81*89a1d03eSRichard 
82*89a1d03eSRichard struct Bar {
83*89a1d03eSRichard 
84*89a1d03eSRichard   int f[3] = {1, 2};
85*89a1d03eSRichard 
86*89a1d03eSRichard   int j[1];
87*89a1d03eSRichard };
88*89a1d03eSRichard }
89