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.
///
// 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();
--- /dev/null
+// 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'}}
+}