diff options
author | Douglas Gregor <dgregor@apple.com> | 2011-01-07 19:35:17 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2011-01-07 19:35:17 +0000 |
commit | 91fc73e7ffb1fa1da0276518359d3bd4ed11c843 (patch) | |
tree | 48ed64396d9978bd7cc4a569416ed1d1cfb5b078 /lib/Sema/SemaTemplateInstantiateDecl.cpp | |
parent | bd5f9f708aa31920d3bd73aa10fcb5de424c657a (diff) |
When instantiating the arguments to an initializer, use the
TreeTransform version of TransformExprs() rather than explicit loop,
so that we expand pack expansions properly. Test cast coming soon...
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@123014 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema/SemaTemplateInstantiateDecl.cpp')
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 34 |
1 files changed, 4 insertions, 30 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 2ef688b0eb..649fbf6625 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -166,29 +166,6 @@ Decl *TemplateDeclInstantiator::VisitTypedefDecl(TypedefDecl *D) { return Typedef; } -/// \brief Instantiate the arguments provided as part of initialization. -/// -/// \returns true if an error occurred, false otherwise. -static bool InstantiateInitializationArguments(Sema &SemaRef, - Expr **Args, unsigned NumArgs, - const MultiLevelTemplateArgumentList &TemplateArgs, - ASTOwningVector<Expr*> &InitArgs) { - for (unsigned I = 0; I != NumArgs; ++I) { - // When we hit the first defaulted argument, break out of the loop: - // we don't pass those default arguments on. - if (Args[I]->isDefaultArgument()) - break; - - ExprResult Arg = SemaRef.SubstExpr(Args[I], TemplateArgs); - if (Arg.isInvalid()) - return true; - - InitArgs.push_back(Arg.release()); - } - - return false; -} - /// \brief Instantiate an initializer, breaking it into separate /// initialization arguments. /// @@ -226,17 +203,14 @@ static bool InstantiateInitializer(Sema &S, Expr *Init, if (ParenListExpr *ParenList = dyn_cast<ParenListExpr>(Init)) { LParenLoc = ParenList->getLParenLoc(); RParenLoc = ParenList->getRParenLoc(); - return InstantiateInitializationArguments(S, ParenList->getExprs(), - ParenList->getNumExprs(), - TemplateArgs, NewArgs); + return S.SubstExprs(ParenList->getExprs(), ParenList->getNumExprs(), + true, TemplateArgs, NewArgs); } if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init)) { if (!isa<CXXTemporaryObjectExpr>(Construct)) { - if (InstantiateInitializationArguments(S, - Construct->getArgs(), - Construct->getNumArgs(), - TemplateArgs, NewArgs)) + if (S.SubstExprs(Construct->getArgs(), Construct->getNumArgs(), true, + TemplateArgs, NewArgs)) return true; // FIXME: Fake locations! |