// RUN: %check_clang_tidy %s cppcoreguidelines-pro-bounds-array-to-pointer-decay %t #include namespace gsl { template class array_view { public: template array_view(U (&arr)[N]); }; } void pointerfun(int *p); void arrayfun(int p[]); void arrayviewfun(gsl::array_view &p); size_t s(); void f() { int a[5]; pointerfun(a); // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: do not implicitly decay an array into a pointer; consider using gsl::array_view or an explicit cast instead [cppcoreguidelines-pro-bounds-array-to-pointer-decay] pointerfun((int *)a); // OK, explicit cast arrayfun(a); // CHECK-MESSAGES: :[[@LINE-1]]:12: warning: do not implicitly decay an array into a pointer pointerfun(a + s() - 10); // Convert to &a[g() - 10]; // CHECK-MESSAGES: :[[@LINE-1]]:14: warning: do not implicitly decay an array into a pointer gsl::array_view av(a); arrayviewfun(av); // OK int i = a[0]; // OK int j = a[(1 + 2)];// OK pointerfun(&a[0]); // OK for (auto &e : a) // OK, iteration internally decays array to pointer e = 1; } const char *g() { return "clang"; // OK, decay string literal to pointer } const char *g2() { return ("clang"); // OK, ParenExpr hides the literal-pointer decay } void f2(void *const *); void bug25362() { void *a[2]; f2(static_cast(a)); // OK, explicit cast }