diff options
-rw-r--r-- | include/clang/Basic/DiagnosticGroups.td | 3 | ||||
-rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 4 | ||||
-rw-r--r-- | lib/Sema/SemaType.cpp | 5 | ||||
-rw-r--r-- | test/Sema/warn-vla.c | 12 | ||||
-rw-r--r-- | test/SemaCXX/c99-variable-length-array-cxx11.cpp | 2 | ||||
-rw-r--r-- | test/SemaCXX/c99-variable-length-array.cpp | 2 | ||||
-rw-r--r-- | test/SemaCXX/warn-vla.cpp | 27 |
7 files changed, 51 insertions, 4 deletions
diff --git a/include/clang/Basic/DiagnosticGroups.td b/include/clang/Basic/DiagnosticGroups.td index 7709be139b..c06bbf6e14 100644 --- a/include/clang/Basic/DiagnosticGroups.td +++ b/include/clang/Basic/DiagnosticGroups.td @@ -317,6 +317,7 @@ def VariadicMacros : DiagGroup<"variadic-macros">; def VectorConversion : DiagGroup<"vector-conversion">; // clang specific def VexingParse : DiagGroup<"vexing-parse">; def VLA : DiagGroup<"vla">; +def VLAExtension : DiagGroup<"vla-extension">; def VolatileRegisterVar : DiagGroup<"volatile-register-var">; def Visibility : DiagGroup<"visibility">; def ZeroLengthArray : DiagGroup<"zero-length-array">; @@ -473,7 +474,7 @@ def C11 : DiagGroup<"c11-extensions">; def C99 : DiagGroup<"c99-extensions">; // A warning group for warnings about GCC extensions. -def GNU : DiagGroup<"gnu", [GNUDesignator, VLA, ZeroLengthArray]>; +def GNU : DiagGroup<"gnu", [GNUDesignator, VLAExtension, ZeroLengthArray]>; // A warning group for warnings about code that clang accepts but gcc doesn't. def GccCompat : DiagGroup<"gcc-compat">; diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 2683ac0543..be6ef607ed 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -75,7 +75,9 @@ def warn_double_const_requires_fp64 : Warning< // C99 variable-length arrays def ext_vla : Extension<"variable length arrays are a C99 feature">, - InGroup<VLA>; + InGroup<VLAExtension>; +def warn_vla_used : Warning<"variable length array used">, + InGroup<VLA>, DefaultIgnore; def err_vla_non_pod : Error<"variable length array of non-POD element type %0">; def err_vla_in_sfinae : Error< "variable length array cannot be formed during template argument deduction">; diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index dbee50a4c9..f6cad26989 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -1496,6 +1496,11 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, : diag::ext_c99_array_usage) << ASM; } + if (T->isVariableArrayType()) { + // Warn about VLAs for -Wvla. + Diag(Loc, diag::warn_vla_used); + } + return T; } diff --git a/test/Sema/warn-vla.c b/test/Sema/warn-vla.c new file mode 100644 index 0000000000..01fe45173b --- /dev/null +++ b/test/Sema/warn-vla.c @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -std=c99 -fsyntax-only -verify -Wvla %s +// RUN: %clang_cc1 -std=c89 -fsyntax-only -verify -Wvla %s + +void test1(int n) { + int v[n]; // expected-warning {{variable length array used}} +} + +void test2(int n, int v[n]) { // expected-warning {{variable length array used}} +} + +void test3(int n, int v[n]); // expected-warning {{variable length array used}} + diff --git a/test/SemaCXX/c99-variable-length-array-cxx11.cpp b/test/SemaCXX/c99-variable-length-array-cxx11.cpp index b740e39775..03cf28388d 100644 --- a/test/SemaCXX/c99-variable-length-array-cxx11.cpp +++ b/test/SemaCXX/c99-variable-length-array-cxx11.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wvla %s +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wvla-extension %s struct StillPOD { StillPOD() = default; }; diff --git a/test/SemaCXX/c99-variable-length-array.cpp b/test/SemaCXX/c99-variable-length-array.cpp index 7773c0849b..de9c11e565 100644 --- a/test/SemaCXX/c99-variable-length-array.cpp +++ b/test/SemaCXX/c99-variable-length-array.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -fsyntax-only -verify -Wvla %s +// RUN: %clang_cc1 -fsyntax-only -verify -Wvla-extension %s struct NonPOD { NonPOD(); }; diff --git a/test/SemaCXX/warn-vla.cpp b/test/SemaCXX/warn-vla.cpp new file mode 100644 index 0000000000..081f1c7b21 --- /dev/null +++ b/test/SemaCXX/warn-vla.cpp @@ -0,0 +1,27 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -Wvla %s + +void test1(int n) { + int v[n]; // expected-warning {{variable length array used}} +} + +void test2(int n, int v[n]) { // expected-warning {{variable length array used}} +} + +void test3(int n, int v[n]); // expected-warning {{variable length array used}} + +template<typename T> +void test4(int n) { + int v[n]; // expected-warning {{variable length array used}} +} + +template<typename T> +void test5(int n, int v[n]) { // expected-warning {{variable length array used}} +} + +template<typename T> +void test6(int n, int v[n]); // expected-warning {{variable length array used}} + +template<typename T> +void test7(int n, T v[n]) { // expected-warning {{variable length array used}} +} + |