diff options
author | Douglas Gregor <dgregor@apple.com> | 2009-05-20 21:51:01 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2009-05-20 21:51:01 +0000 |
commit | e06274d5c5c6b2decc9f217a8913b28f846bfcfa (patch) | |
tree | b9ea93c1d91cceafb52d540d5475c3715f791394 | |
parent | d94546a0a1deef7286c13e49b9584621ae81cc9a (diff) |
Template instantiation for CXXExprWithTemporaries, which occurs when
temporaries are generated for some object-constructing expressions in
templates that are not type-dependent.
Also, be sure to introduce the variable from a CXXConditionDeclExpr
into the set of instantiated local variables.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@72185 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Sema/SemaTemplateInstantiateExpr.cpp | 14 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-expr-4.cpp | 9 | ||||
-rw-r--r-- | test/SemaTemplate/instantiate-function-1.cpp | 3 |
3 files changed, 25 insertions, 1 deletions
diff --git a/lib/Sema/SemaTemplateInstantiateExpr.cpp b/lib/Sema/SemaTemplateInstantiateExpr.cpp index 1b2fa46957..099ce278f1 100644 --- a/lib/Sema/SemaTemplateInstantiateExpr.cpp +++ b/lib/Sema/SemaTemplateInstantiateExpr.cpp @@ -92,7 +92,7 @@ namespace { // FIXME: CXXDeleteExpr // FIXME: UnaryTypeTraitExpr // FIXME: QualifiedDeclRefExpr - // FIXME: CXXExprWithTemporaries + OwningExprResult VisitCXXExprWithTemporaries(CXXExprWithTemporaries *E); OwningExprResult VisitCXXUnresolvedConstructExpr( CXXUnresolvedConstructExpr *E); OwningExprResult VisitGNUNullExpr(GNUNullExpr *E); @@ -450,6 +450,7 @@ TemplateExprInstantiator::VisitCXXConditionDeclExpr(CXXConditionDeclExpr *E) { if (!Var) return SemaRef.ExprError(); + SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var); return SemaRef.Owned(new (SemaRef.Context) CXXConditionDeclExpr( E->getStartLoc(), SourceLocation(), @@ -877,6 +878,7 @@ TemplateExprInstantiator::VisitCXXConstructExpr(CXXConstructExpr *E) { return SemaRef.ExprError(); } + SemaRef.CurrentInstantiationScope->InstantiatedLocal(E->getVarDecl(), Var); return SemaRef.Owned(CXXConstructExpr::Create(SemaRef.Context, Var, T, E->getConstructor(), E->isElidable(), @@ -917,6 +919,16 @@ TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) { } Sema::OwningExprResult +TemplateExprInstantiator::VisitCXXExprWithTemporaries( + CXXExprWithTemporaries *E) { + OwningExprResult SubExpr = Visit(E->getSubExpr()); + if (SubExpr.isInvalid()) + return SemaRef.ExprError(); + + return SemaRef.ActOnFinishFullExpr(move(SubExpr)); +} + +Sema::OwningExprResult TemplateExprInstantiator::VisitCXXUnresolvedConstructExpr( CXXUnresolvedConstructExpr *E) { QualType T = SemaRef.InstantiateType(E->getTypeAsWritten(), TemplateArgs, diff --git a/test/SemaTemplate/instantiate-expr-4.cpp b/test/SemaTemplate/instantiate-expr-4.cpp index a5b55b35d7..8a3f7d858e 100644 --- a/test/SemaTemplate/instantiate-expr-4.cpp +++ b/test/SemaTemplate/instantiate-expr-4.cpp @@ -33,3 +33,12 @@ struct BuildTemporary0 { }; template struct BuildTemporary0<5, 7>; + +template<int N, int M> +struct Temporaries0 { + void f() { + (void)X(N, M); + } +}; + +template struct Temporaries0<5, 7>; diff --git a/test/SemaTemplate/instantiate-function-1.cpp b/test/SemaTemplate/instantiate-function-1.cpp index caae97e60b..6182e1fe88 100644 --- a/test/SemaTemplate/instantiate-function-1.cpp +++ b/test/SemaTemplate/instantiate-function-1.cpp @@ -69,6 +69,9 @@ template<typename T, typename U, typename V> struct X6 { return v; // expected-error{{incompatible type}} } + if (T x = t) { + t = x; + } return v; } }; |