diff options
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 20 | ||||
-rw-r--r-- | test/CodeGenCXX/template-anonymous-union-member-initializer.cpp | 10 |
2 files changed, 21 insertions, 9 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 285cc62012..807115eb67 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -242,17 +242,19 @@ Decl *TemplateDeclInstantiator::VisitFieldDecl(FieldDecl *D) { D->getTypeSpecStartLoc(), D->getAccess(), 0); - if (Field) { - if (Invalid) - Field->setInvalidDecl(); - - if (!Field->getDeclName()) { - // Keep track of where this decl came from. - SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D); - } + if (!Field) + return 0; + + if (Invalid) + Field->setInvalidDecl(); - Owner->addDecl(Field); + if (!Field->getDeclName()) { + // Keep track of where this decl came from. + SemaRef.Context.setInstantiatedFromUnnamedFieldDecl(Field, D); } + + Field->setImplicit(D->isImplicit()); + Owner->addDecl(Field); return Field; } diff --git a/test/CodeGenCXX/template-anonymous-union-member-initializer.cpp b/test/CodeGenCXX/template-anonymous-union-member-initializer.cpp new file mode 100644 index 0000000000..f8454282ba --- /dev/null +++ b/test/CodeGenCXX/template-anonymous-union-member-initializer.cpp @@ -0,0 +1,10 @@ +// RUN: clang-cc -emit-llvm -o %t %s +template <typename T> +class A +{ + union { void *d; }; + + A() : d(0) { } +}; + +A<int> a0; |