xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/avoid-c-arrays.cpp (revision 5fa742eeed0821baf864d23f237ff1b481e1ae11)
1785624b2SCongcong Cai // RUN: %check_clang_tidy -std=c++17 %s modernize-avoid-c-arrays %t
289a1d03eSRichard 
389a1d03eSRichard int a[] = {1, 2};
4*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead
589a1d03eSRichard 
689a1d03eSRichard int b[1];
7*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead
889a1d03eSRichard 
989a1d03eSRichard void foo() {
1089a1d03eSRichard   int c[b[0]];
11*5fa742eeSCongcong Cai   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C VLA arrays, use 'std::vector' instead
1289a1d03eSRichard 
1389a1d03eSRichard   using d = decltype(c);
1489a1d03eSRichard   d e;
1589a1d03eSRichard   // Semi-FIXME: we do not diagnose these last two lines separately,
1689a1d03eSRichard   // because we point at typeLoc.getBeginLoc(), which is the decl before that
1789a1d03eSRichard   // (int c[b[0]];), which is already diagnosed.
1889a1d03eSRichard }
1989a1d03eSRichard 
2089a1d03eSRichard template <typename T, int Size>
2189a1d03eSRichard class array {
2289a1d03eSRichard   T d[Size];
23*5fa742eeSCongcong Cai   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead
2489a1d03eSRichard 
2589a1d03eSRichard   int e[1];
26*5fa742eeSCongcong Cai   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead
2789a1d03eSRichard };
2889a1d03eSRichard 
2989a1d03eSRichard array<int[4], 2> d;
30*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not declare C-style arrays, use 'std::array' instead
3189a1d03eSRichard 
3289a1d03eSRichard using k = int[4];
33*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not declare C-style arrays, use 'std::array' instead
3489a1d03eSRichard 
3589a1d03eSRichard array<k, 2> dk;
3689a1d03eSRichard 
3789a1d03eSRichard template <typename T>
3889a1d03eSRichard class unique_ptr {
3989a1d03eSRichard   T *d;
4089a1d03eSRichard 
4189a1d03eSRichard   int e[1];
42*5fa742eeSCongcong Cai   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead
4389a1d03eSRichard };
4489a1d03eSRichard 
4589a1d03eSRichard unique_ptr<int[]> d2;
46*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: do not declare C-style arrays, use 'std::array' instead
4789a1d03eSRichard 
4889a1d03eSRichard using k2 = int[];
49*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: do not declare C-style arrays, use 'std::array' instead
5089a1d03eSRichard 
5189a1d03eSRichard unique_ptr<k2> dk2;
5289a1d03eSRichard 
5389a1d03eSRichard // Some header
5489a1d03eSRichard extern "C" {
5589a1d03eSRichard 
5689a1d03eSRichard int f[] = {1, 2};
5789a1d03eSRichard 
5889a1d03eSRichard int j[1];
5989a1d03eSRichard 
6089a1d03eSRichard inline void bar() {
6189a1d03eSRichard   {
6289a1d03eSRichard     int j[j[0]];
6389a1d03eSRichard   }
6489a1d03eSRichard }
6589a1d03eSRichard 
6689a1d03eSRichard extern "C++" {
6789a1d03eSRichard int f3[] = {1, 2};
68*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead
6989a1d03eSRichard 
7089a1d03eSRichard int j3[1];
71*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead
7289a1d03eSRichard 
7389a1d03eSRichard struct Foo {
7489a1d03eSRichard   int f3[3] = {1, 2};
75*5fa742eeSCongcong Cai   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead
7689a1d03eSRichard 
7789a1d03eSRichard   int j3[1];
78*5fa742eeSCongcong Cai   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead
7989a1d03eSRichard };
8089a1d03eSRichard }
8189a1d03eSRichard 
8289a1d03eSRichard struct Bar {
8389a1d03eSRichard 
8489a1d03eSRichard   int f[3] = {1, 2};
8589a1d03eSRichard 
8689a1d03eSRichard   int j[1];
8789a1d03eSRichard };
8889a1d03eSRichard }
89b777bb78SPiotr Zegar 
90b777bb78SPiotr Zegar const char name[] = "Some string";
91*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays]
92b777bb78SPiotr Zegar 
93b777bb78SPiotr Zegar void takeCharArray(const char name[]);
94*5fa742eeSCongcong Cai // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: do not declare C-style arrays, use 'std::array' or 'std::vector' instead [modernize-avoid-c-arrays]
95