]> granicus.if.org Git - clang/commitdiff
Template instantiation for CXXExprWithTemporaries, which occurs when
authorDouglas Gregor <dgregor@apple.com>
Wed, 20 May 2009 21:51:01 +0000 (21:51 +0000)
committerDouglas Gregor <dgregor@apple.com>
Wed, 20 May 2009 21:51:01 +0000 (21:51 +0000)
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

lib/Sema/SemaTemplateInstantiateExpr.cpp
test/SemaTemplate/instantiate-expr-4.cpp
test/SemaTemplate/instantiate-function-1.cpp

index 1b2fa469575accad095801cf7073c43d79875643..099ce278f1f452cd530c49d4bb0ae0183e03db41 100644 (file)
@@ -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(),
@@ -916,6 +918,16 @@ TemplateExprInstantiator::VisitCXXZeroInitValueExpr(CXXZeroInitValueExpr *E) {
   return SemaRef.Clone(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) {
index a5b55b35d75241d6d3d27097a747c84bcd97a24c..8a3f7d858e4cf6aaae94458a4db6ffbf0b348a1f 100644 (file)
@@ -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>;
index caae97e60bb62c07dccfb29c5480069f82058010..6182e1fe8882a2a94bf587b710bf249fe68f7d00 100644 (file)
@@ -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;
   }
 };