From 538fccb44c521f5f26e7aa4cebf6a55284e28b3d Mon Sep 17 00:00:00 2001 From: Matt Beaumont-Gay Date: Fri, 21 Jun 2013 18:58:32 +0000 Subject: [PATCH] Propagate the invalid bit from bases to derived template classes. Fixes PR16292. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@184581 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaTemplateInstantiate.cpp | 4 ++++ test/SemaTemplate/derived.cpp | 9 +++++++++ 2 files changed, 13 insertions(+) diff --git a/lib/Sema/SemaTemplateInstantiate.cpp b/lib/Sema/SemaTemplateInstantiate.cpp index 5e3ced47f4..9babafedc9 100644 --- a/lib/Sema/SemaTemplateInstantiate.cpp +++ b/lib/Sema/SemaTemplateInstantiate.cpp @@ -1754,6 +1754,10 @@ Sema::SubstBaseSpecifiers(CXXRecordDecl *Instantiation, Base = Pattern->bases_begin(), BaseEnd = Pattern->bases_end(); Base != BaseEnd; ++Base) { if (!Base->getType()->isDependentType()) { + if (const CXXRecordDecl *RD = Base->getType()->getAsCXXRecordDecl()) { + if (RD->isInvalidDecl()) + Instantiation->setInvalidDecl(); + } InstantiatedBases.push_back(new (Context) CXXBaseSpecifier(*Base)); continue; } diff --git a/test/SemaTemplate/derived.cpp b/test/SemaTemplate/derived.cpp index 7b91f9a3ed..a76b34fda2 100644 --- a/test/SemaTemplate/derived.cpp +++ b/test/SemaTemplate/derived.cpp @@ -28,3 +28,12 @@ namespace rdar13267210 { } }; } + +namespace PR16292 { + class IncompleteClass; // expected-note{{forward declaration}} + class BaseClass { + IncompleteClass Foo; // expected-error{{field has incomplete type}} + }; + template class DerivedClass : public BaseClass {}; + void* p = new DerivedClass; +} -- 2.50.1