From 04d6d2f2af6de891688ee107b672aa2fb612204a Mon Sep 17 00:00:00 2001 From: Richard Smith Date: Sat, 8 Feb 2014 02:30:49 +0000 Subject: [PATCH] PR18581: Attempt to complete the type in a VLA declaration before checking whether it's POD. llvm-svn: 201018 --- clang/lib/Sema/SemaType.cpp | 1 + clang/test/SemaCXX/vla.cpp | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index c2ff2238d5fd..f9f6cee994ec 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -1590,6 +1590,7 @@ 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() && + !RequireCompleteType(Loc, BaseT, 0) && !BaseT.isPODType(Context) && !BaseT->isObjCLifetimeType()) { Diag(Loc, diag::err_vla_non_pod) diff --git a/clang/test/SemaCXX/vla.cpp b/clang/test/SemaCXX/vla.cpp index d63b6335f453..dae6450553aa 100644 --- a/clang/test/SemaCXX/vla.cpp +++ b/clang/test/SemaCXX/vla.cpp @@ -3,3 +3,17 @@ // PR11925 int n; int (&f())[n]; // expected-error {{function declaration cannot have variably modified type}} + +namespace PR18581 { + template struct pod {}; + template struct error { + typename T::error e; // expected-error {{cannot be used prior to '::'}} + }; + struct incomplete; // expected-note {{forward declaration}} + + void f(int n) { + pod a[n]; + error b[n]; // expected-note {{instantiation}} + incomplete c[n]; // expected-error {{incomplete}} + } +} -- GitLab