blob: 95e04d53eb6acd72f9c033e4ad9c927265330873 [file] [log] [blame]
// 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 <typename T, int Size>
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<int[4], 2> 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<k, 2> dk;
// no diagnostic expected here since no concrete C-style array type is written here
array<decltype(ak), 3> ek;
// no diagnostic expected here since no concrete C-style array type is written here
template <typename T>
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<int[]> 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<k2> 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<class T, class U>
struct is_same { constexpr static bool value{false}; };
template<class T>
struct is_same<T, T> { constexpr static bool value{true}; };
template<class T, class U>
constexpr bool is_same_v = is_same<T, U>::value;
template<class T> struct remove_const { typedef T type; };
template<class T> struct remove_const<const T> { typedef T type; };
template<class T>
using remove_const_t = typename remove_const<T>::type;
template<bool B, class T = void> struct enable_if {};
template<class T> struct enable_if<true, T> { typedef T type; };
template< bool B, class T = void >
using enable_if_t = typename enable_if<B, T>::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 <typename T,
bool = std::is_same_v<T, int>,
bool = std::is_same<T, int>::value,
bool = std::is_same_v<std::remove_const_t<T>, int>,
bool = std::is_same<std::remove_const_t<T>, int>::value,
bool = std::is_same_v<typename std::remove_const<T>::type, int>,
bool = std::is_same<typename std::remove_const<T>::type, int>::value,
std::enable_if_t<not(std::is_same_v<std::remove_const_t<T>, int>) && not(std::is_same_v<typename std::remove_const<T>::type, char>), bool> = true,
typename std::enable_if<not(std::is_same_v<std::remove_const_t<T>, int>) && not(std::is_same_v<typename std::remove_const<T>::type, char>), bool>::type = true,
typename = std::enable_if_t<not(std::is_same_v<std::remove_const_t<T>, int>) && not(std::is_same_v<typename std::remove_const<T>::type, char>)>,
typename = typename std::remove_const<T>::type,
typename = std::remove_const_t<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 <typename U = T,
bool = std::is_same_v<U, int[]>,
// CHECK-MESSAGES: :[[@LINE-1]]:38: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays]
bool = std::is_same<U, int[10]>::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<not(std::is_same_v<std::remove_const_t<U>, int[]>) && not(std::is_same_v<typename std::remove_const<U>::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<int[10]>::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<int[]>>
// 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<int[2]>;
// 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<MyArrayType>;
// 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 <typename T,
bool = std::is_same_v<T, int>,
bool = std::is_same<T, int>::value,
bool = std::is_same_v<std::remove_const_t<T>, int>,
bool = std::is_same<std::remove_const_t<T>, int>::value,
bool = std::is_same_v<typename std::remove_const<T>::type, int>,
bool = std::is_same<typename std::remove_const<T>::type, int>::value,
std::enable_if_t<not(std::is_same_v<std::remove_const_t<T>, int>) && not(std::is_same_v<typename std::remove_const<T>::type, char>), bool> = true,
typename std::enable_if<not(std::is_same_v<std::remove_const_t<T>, int>) && not(std::is_same_v<typename std::remove_const<T>::type, char>), bool>::type = true,
typename = std::enable_if_t<not(std::is_same_v<std::remove_const_t<T>, int>) && not(std::is_same_v<typename std::remove_const<T>::type, char>)>,
typename = typename std::remove_const<T>::type,
typename = std::remove_const_t<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 <typename T = int[],
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays]
bool = std::is_same_v<T, int[]>,
// CHECK-MESSAGES: :[[@LINE-1]]:36: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays]
bool = std::is_same<T, int[10]>::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<not(std::is_same_v<std::remove_const_t<T>, int[]>) && not(std::is_same_v<typename std::remove_const<T>::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<int[10]>::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<int[]>>
// 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<typename T>
T some_constant{};
// explicit instantiations
template
int some_constant<int[5]>[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<decltype(ak)>[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<int[7]>[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<decltype(mk)>[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<decltype(t)>({});
fun<decltype(t)>({});
func<int[1]>({});
// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays]
fun<int[1]>({});
// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays]
MyClassTemplate var{t};
MyClassTemplate<decltype(t)> var1{{}};
MyClassTemplate<int[2]> 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<decltype(t)> var4{{}};
decltype(var1)::MyInnerClassTemplate<char[5]> var5{{}};
// CHECK-MESSAGES: :[[@LINE-1]]:40: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays]
MyClassTemplate<decltype(t)>::MyInnerClassTemplate var6{t};
MyClassTemplate<decltype(t)>::MyInnerClassTemplate<decltype(t)> var7{{}};
MyClassTemplate<decltype(t)>::MyInnerClassTemplate<char[8]> var8{{}};
// CHECK-MESSAGES: :[[@LINE-1]]:54: warning: do not declare C-style arrays, use 'std::array' instead [modernize-avoid-c-arrays]
MyClassTemplate<int[9]>::MyInnerClassTemplate<char[9]> 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]
}