xref: /llvm-project/clang-tools-extra/test/clang-tidy/checkers/modernize/avoid-c-arrays.cpp (revision 785624b28237bb75d4fa3b8e4219a5448b90eaac)
1*785624b2SCongcong Cai // RUN: %check_clang_tidy -std=c++17 %s modernize-avoid-c-arrays %t
289a1d03eSRichard 
389a1d03eSRichard int a[] = {1, 2};
489a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use std::array<> instead
589a1d03eSRichard 
689a1d03eSRichard int b[1];
789a1d03eSRichard // 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]];
1189a1d03eSRichard   // 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];
2389a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use std::array<> instead
2489a1d03eSRichard 
2589a1d03eSRichard   int e[1];
2689a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use std::array<> instead
2789a1d03eSRichard };
2889a1d03eSRichard 
2989a1d03eSRichard array<int[4], 2> d;
3089a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not declare C-style arrays, use std::array<> instead
3189a1d03eSRichard 
3289a1d03eSRichard using k = int[4];
3389a1d03eSRichard // 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];
4289a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use std::array<> instead
4389a1d03eSRichard };
4489a1d03eSRichard 
4589a1d03eSRichard unique_ptr<int[]> d2;
4689a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: do not declare C-style arrays, use std::array<> instead
4789a1d03eSRichard 
4889a1d03eSRichard using k2 = int[];
4989a1d03eSRichard // 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};
6889a1d03eSRichard // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use std::array<> instead
6989a1d03eSRichard 
7089a1d03eSRichard int j3[1];
7189a1d03eSRichard // 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};
7589a1d03eSRichard   // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use std::array<> instead
7689a1d03eSRichard 
7789a1d03eSRichard   int j3[1];
7889a1d03eSRichard   // 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";
91b777bb78SPiotr Zegar // 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*785624b2SCongcong 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