[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