From: Douglas Gregor Date: Fri, 14 Jan 2011 17:12:22 +0000 (+0000) Subject: When we're instantiating a direct variable initializer that has a pack X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=07a77b4b1d1fa95930129541eff8b79558f5d80d;p=clang When we're instantiating a direct variable initializer that has a pack expansion in it, we may end up instantiating to an empty expression-list. In this case, the variable is uninitialized; tweak the instantiation logic to handle this case. Fixes PR8977. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123449 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 6b5713a2fa..bd431a1138 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -314,19 +314,19 @@ Decl *TemplateDeclInstantiator::VisitVarDecl(VarDecl *D) { ASTOwningVector InitArgs(SemaRef); if (!InstantiateInitializer(SemaRef, D->getInit(), TemplateArgs, LParenLoc, InitArgs, RParenLoc)) { - // Attach the initializer to the declaration. - if (D->hasCXXDirectInitializer()) { + // Attach the initializer to the declaration, if we have one. + if (InitArgs.size() == 0) + SemaRef.ActOnUninitializedDecl(Var, false); + else if (D->hasCXXDirectInitializer()) { // Add the direct initializer to the declaration. SemaRef.AddCXXDirectInitializerToDecl(Var, LParenLoc, move_arg(InitArgs), RParenLoc); - } else if (InitArgs.size() == 1) { + } else { + assert(InitArgs.size() == 1); Expr *Init = InitArgs.take()[0]; SemaRef.AddInitializerToDecl(Var, Init, false); - } else { - assert(InitArgs.size() == 0); - SemaRef.ActOnUninitializedDecl(Var, false); } } else { // FIXME: Not too happy about invalidating the declaration diff --git a/test/CXX/temp/temp.decls/temp.variadic/p4.cpp b/test/CXX/temp/temp.decls/temp.variadic/p4.cpp index b865d51411..e2fa122937 100644 --- a/test/CXX/temp/temp.decls/temp.variadic/p4.cpp +++ b/test/CXX/temp/temp.decls/temp.variadic/p4.cpp @@ -34,6 +34,15 @@ void initializer_list_expansion() { template void initializer_list_expansion<1, 2, 3, 4, 5>(); template void initializer_list_expansion<1, 2, 3, 4, 5, 6>(); // expected-note{{in instantiation of function template specialization 'initializer_list_expansion<1, 2, 3, 4, 5, 6>' requested here}} +namespace PR8977 { + struct A { }; + template void f(Args... args) { + T t(args...); + }; + + template void f(); +} + // In a base-specifier-list (Clause 10); the pattern is a base-specifier. template struct HasMixins : public Mixins... {