[cfe-commits] r171783 - in /cfe/trunk: lib/Sema/SemaType.cpp test/SemaCXX/c99-variable-length-array-cxx11.cpp

Douglas Gregor dgregor at apple.com
Mon Jan 7 12:03:16 PST 2013


Author: dgregor
Date: Mon Jan  7 14:03:16 2013
New Revision: 171783

URL: http://llvm.org/viewvc/llvm-project?rev=171783&view=rev
Log:
Use the C++11 POD definition in C++11 mode to determine whether one
can create a VLA of class type. Fixes <rdar://problem/12151822>.

Added:
    cfe/trunk/test/SemaCXX/c99-variable-length-array-cxx11.cpp
Modified:
    cfe/trunk/lib/Sema/SemaType.cpp

Modified: cfe/trunk/lib/Sema/SemaType.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaType.cpp?rev=171783&r1=171782&r2=171783&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaType.cpp (original)
+++ cfe/trunk/lib/Sema/SemaType.cpp Mon Jan  7 14:03:16 2013
@@ -1269,6 +1269,12 @@
                                            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 @@
       // 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();

Added: cfe/trunk/test/SemaCXX/c99-variable-length-array-cxx11.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/c99-variable-length-array-cxx11.cpp?rev=171783&view=auto
==============================================================================
--- cfe/trunk/test/SemaCXX/c99-variable-length-array-cxx11.cpp (added)
+++ cfe/trunk/test/SemaCXX/c99-variable-length-array-cxx11.cpp Mon Jan  7 14:03:16 2013
@@ -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'}}
+}





More information about the cfe-commits mailing list