diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-03-24 21:22:47 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-03-24 21:22:47 +0000 |
commit | 28329e511854fdd3b31561b2690f91f9e6a6402e (patch) | |
tree | 5bf69ea8eb49f8685eb43bd07a3d666c0805a5f1 | |
parent | f7353c08d440aa3c1db46b181aff6c4eb41bbcab (diff) |
When pulling apart an initializer that involves a CXXConstructExpr, do
not pick apart a CXXTemporaryObjectExpr because such an object
construction was explicitly written in the source code. Fixes PR6657.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@99427 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateDecl.cpp | 24 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-init.cpp | 18 |
2 files changed, 31 insertions, 11 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateDecl.cpp b/lib/Sema/SemaTemplateInstantiateDecl.cpp index 15a7946174..7b0e88d163 100644 --- a/lib/Sema/SemaTemplateInstantiateDecl.cpp +++ b/lib/Sema/SemaTemplateInstantiateDecl.cpp @@ -286,17 +286,19 @@ static bool InstantiateInitializer(Sema &S, Expr *Init, } if (CXXConstructExpr *Construct = dyn_cast<CXXConstructExpr>(Init)) { - if (InstantiateInitializationArguments(S, - Construct->getArgs(), - Construct->getNumArgs(), - TemplateArgs, - CommaLocs, NewArgs)) - return true; - - // FIXME: Fake locations! - LParenLoc = S.PP.getLocForEndOfToken(Init->getLocStart()); - RParenLoc = CommaLocs.empty()? LParenLoc : CommaLocs.back(); - return false; + if (!isa<CXXTemporaryObjectExpr>(Construct)) { + if (InstantiateInitializationArguments(S, + Construct->getArgs(), + Construct->getNumArgs(), + TemplateArgs, + CommaLocs, NewArgs)) + return true; + + // FIXME: Fake locations! + LParenLoc = S.PP.getLocForEndOfToken(Init->getLocStart()); + RParenLoc = CommaLocs.empty()? LParenLoc : CommaLocs.back(); + return false; + } } Sema::OwningExprResult Result = S.SubstExpr(Init, TemplateArgs); diff --git a/test/SemaTemplate/instantiate-init.cpp b/test/SemaTemplate/instantiate-init.cpp index 16ecc4758a..e292aa3c5f 100644 --- a/test/SemaTemplate/instantiate-init.cpp +++ b/test/SemaTemplate/instantiate-init.cpp @@ -37,3 +37,21 @@ namespace PR6457 { }; B<int> b; } + +namespace PR6657 { + struct X + { + X (int, int) { } + }; + + template <typename> + void f0() + { + X x = X(0, 0); + } + + void f1() + { + f0<int>(); + } +} |