diff --git a/lib/Sema/SemaType.cpp b/lib/Sema/SemaType.cpp index 1bdd7c3b398aee6940173f1d64546fef10a8960c..ad704685e58685d89bd07cb7b8c7490de09d2c2b 100644 --- a/lib/Sema/SemaType.cpp +++ b/lib/Sema/SemaType.cpp @@ -1269,6 +1269,12 @@ static bool isArraySizeVLA(Sema &S, Expr *ArraySize, llvm::APSInt &SizeVal) { S.LangOpts.GNUMode).isInvalid(); } +/// \brief Determine whether the given type is a POD or standard-layout type, +/// as appropriate for the C++ language options. +static bool isPODType(QualType T, ASTContext &Context) { + return Context.getLangOpts().CPlusPlus11? T.isCXX11PODType(Context) + : T.isCXX98PODType(Context); +} /// \brief Build an array type. /// @@ -1442,8 +1448,8 @@ QualType Sema::BuildArrayType(QualType T, ArrayType::ArraySizeModifier ASM, // Prohibit the use of non-POD types in VLAs. QualType BaseT = Context.getBaseElementType(T); if (!T->isDependentType() && - !BaseT.isPODType(Context) && - !BaseT->isObjCLifetimeType()) { + !BaseT->isObjCLifetimeType() && + !isPODType(BaseT, Context)) { Diag(Loc, diag::err_vla_non_pod) << BaseT; return QualType(); diff --git a/test/SemaCXX/c99-variable-length-array-cxx11.cpp b/test/SemaCXX/c99-variable-length-array-cxx11.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b740e3977591dbf5ffc580e1bc173362fe602fce --- /dev/null +++ b/test/SemaCXX/c99-variable-length-array-cxx11.cpp @@ -0,0 +1,26 @@ +// RUN: %clang_cc1 -fsyntax-only -verify -std=c++11 -Wvla %s +struct StillPOD { + StillPOD() = default; +}; + +struct StillPOD2 { + StillPOD np; +}; + +struct NonPOD { + NonPOD(int) {} +}; + +struct POD { + int x; + int y; +}; + +// We allow VLAs of POD types, only. +void vla(int N) { + int array1[N]; // expected-warning{{variable length arrays are a C99 feature}} + POD array2[N]; // expected-warning{{variable length arrays are a C99 feature}} + StillPOD array3[N]; // expected-warning{{variable length arrays are a C99 feature}} + StillPOD2 array4[N][3]; // expected-warning{{variable length arrays are a C99 feature}} + NonPOD array5[N]; // expected-error{{variable length array of non-POD element type 'NonPOD'}} +}