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