// RUN: %check_clang_tidy -std=c++17 %s modernize-avoid-c-arrays %t int a[] = {1, 2}; // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead int b[1]; // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead void foo() { int c[b[0]]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C VLA arrays, use 'std::vector' instead using d = decltype(c); d e; // Semi-FIXME: we do not diagnose these last two lines separately, // because we point at typeLoc.getBeginLoc(), which is the decl before that // (int c[b[0]];), which is already diagnosed. } template class array { T d[Size]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead int e[1]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead }; array d; // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not declare C-style arrays, use 'std::array' instead using k = int[4]; // CHECK-MESSAGES: :[[@LINE-1]]:11: warning: do not declare C-style arrays, use 'std::array' instead k ak; // no diagnostic expected here since no concrete C-style array type is written here array dk; // no diagnostic expected here since no concrete C-style array type is written here array ek; // no diagnostic expected here since no concrete C-style array type is written here template class unique_ptr { T *d; int e[1]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead }; unique_ptr d2; // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: do not declare C-style arrays, use 'std::array' instead using k2 = int[]; // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: do not declare C-style arrays, use 'std::array' instead unique_ptr dk2; // Some header extern "C" { int f[] = {1, 2}; int j[1]; inline void bar() { { int j[j[0]]; } } extern "C++" { int f3[] = {1, 2}; // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead int j3[1]; // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead struct Foo { int f3[3] = {1, 2}; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead int j3[1]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead }; } struct Bar { int f[3] = {1, 2}; int j[1]; }; } const char name[] = "Some string"; // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] void takeCharArray(const char name[]); // CHECK-MESSAGES: :[[@LINE-1]]:26: warning: do not declare C-style arrays, use 'std::array' or 'std::vector' instead [modernize-avoid-c-arrays] namespace std { template struct is_same { constexpr static bool value{false}; }; template struct is_same { constexpr static bool value{true}; }; template constexpr bool is_same_v = is_same::value; template struct remove_const { typedef T type; }; template struct remove_const { typedef T type; }; template using remove_const_t = typename remove_const::type; template struct enable_if {}; template struct enable_if { typedef T type; }; template< bool B, class T = void > using enable_if_t = typename enable_if::type; } // within below template decl, no array type findings are expected within the template parameter declarations since not a single C-style array type got written explicitly template , bool = std::is_same::value, bool = std::is_same_v, int>, bool = std::is_same, int>::value, bool = std::is_same_v::type, int>, bool = std::is_same::type, int>::value, std::enable_if_t, int>) && not(std::is_same_v::type, char>), bool> = true, typename std::enable_if, int>) && not(std::is_same_v::type, char>), bool>::type = true, typename = std::enable_if_t, int>) && not(std::is_same_v::type, char>)>, typename = typename std::remove_const::type, typename = std::remove_const_t> class MyClassTemplate { public: // here, however, plenty of array type findings are expected for below template parameter declarations since C-style array types are written explicitly template , // CHECK-MESSAGES: :[[@LINE-1]]:38: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] bool = std::is_same::value, // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] std::enable_if_t, int[]>) && not(std::is_same_v::type, char[10]>), bool> = true, // CHECK-MESSAGES: :[[@LINE-1]]:73: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] // CHECK-MESSAGES: :[[@LINE-2]]:140: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] typename = typename std::remove_const::type, // CHECK-MESSAGES: :[[@LINE-1]]:51: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] typename = std::remove_const_t> // CHECK-MESSAGES: :[[@LINE-1]]:44: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] class MyInnerClassTemplate { public: MyInnerClassTemplate(const U&) {} private: U field[3]; // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] }; MyClassTemplate(const T&) {} private: T field[7]; // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] }; // an explicit instantiation template class MyClassTemplate; // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] using MyArrayType = int[3]; // CHECK-MESSAGES: :[[@LINE-1]]:21: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] // another explicit instantiation template class MyClassTemplate; // no diagnostic is expected here since no C-style array type got written here // within below template decl, no array type findings are expected within the template parameter declarations since not a single C-style array type got written explicitly template , bool = std::is_same::value, bool = std::is_same_v, int>, bool = std::is_same, int>::value, bool = std::is_same_v::type, int>, bool = std::is_same::type, int>::value, std::enable_if_t, int>) && not(std::is_same_v::type, char>), bool> = true, typename std::enable_if, int>) && not(std::is_same_v::type, char>), bool>::type = true, typename = std::enable_if_t, int>) && not(std::is_same_v::type, char>)>, typename = typename std::remove_const::type, typename = std::remove_const_t> void func(const T& param) { int array1[1]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] T array2[2]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] T value; } // here, however, plenty of array type findings are expected for below template parameter declarations since C-style array types are written explicitly template , // CHECK-MESSAGES: :[[@LINE-1]]:36: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] bool = std::is_same::value, // CHECK-MESSAGES: :[[@LINE-1]]:34: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] std::enable_if_t, int[]>) && not(std::is_same_v::type, char[10]>), bool> = true, // CHECK-MESSAGES: :[[@LINE-1]]:71: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] // CHECK-MESSAGES: :[[@LINE-2]]:138: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] typename = typename std::remove_const::type, // CHECK-MESSAGES: :[[@LINE-1]]:49: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] typename = std::remove_const_t> // CHECK-MESSAGES: :[[@LINE-1]]:42: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] void fun(const T& param) { int array3[3]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] T array4[4]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] T value; } template T some_constant{}; // explicit instantiations template int some_constant[5]; // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] template int some_constant[4]; // no diagnostic is expected here since explicit instantiations aren't represented as `TypeLoc` in the AST and we hence cannot match them as such MyArrayType mk; // no diagnostic is expected here since no C-style array type got written here // explicit specializations template<> int some_constant[7]{}; // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] // CHECK-MESSAGES: :[[@LINE-2]]:19: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] template<> int some_constant[3]{}; // CHECK-MESSAGES: :[[@LINE-1]]:1: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] void testArrayInTemplateType() { int t[10]; // CHECK-MESSAGES: :[[@LINE-1]]:3: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] func(t); fun(t); func({}); fun({}); func({}); // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] fun({}); // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] MyClassTemplate var{t}; MyClassTemplate var1{{}}; MyClassTemplate var2{{}}; // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] decltype(var1)::MyInnerClassTemplate var3{t}; decltype(var1)::MyInnerClassTemplate var4{{}}; decltype(var1)::MyInnerClassTemplate var5{{}}; // CHECK-MESSAGES: :[[@LINE-1]]:40: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] MyClassTemplate::MyInnerClassTemplate var6{t}; MyClassTemplate::MyInnerClassTemplate var7{{}}; MyClassTemplate::MyInnerClassTemplate var8{{}}; // CHECK-MESSAGES: :[[@LINE-1]]:54: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] MyClassTemplate::MyInnerClassTemplate var9{{}}; // CHECK-MESSAGES: :[[@LINE-1]]:19: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] // CHECK-MESSAGES: :[[@LINE-2]]:49: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays] }