]> granicus.if.org Git - clang/commitdiff
Re-bind non-dependent CXXTemporaryObjectExpr nodes as temporaries when
authorChandler Carruth <chandlerc@gmail.com>
Wed, 31 Mar 2010 18:34:58 +0000 (18:34 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Wed, 31 Mar 2010 18:34:58 +0000 (18:34 +0000)
instantiating a template, which ensures the destructor is called. This fixes
PR6671.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@100029 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Sema/TreeTransform.h
test/SemaTemplate/instantiate-expr-4.cpp

index 5d3f21e4e8c1613efce3c2f3a7127954ac2593ec..361ab2e78c9af427af45c7f15d5a0bd4e3968bed 100644 (file)
@@ -5134,7 +5134,7 @@ TreeTransform<Derived>::TransformCXXTemporaryObjectExpr(
       !ArgumentChanged) {
     // FIXME: Instantiation-specific
     SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor);
-    return SemaRef.Owned(E->Retain());
+    return SemaRef.MaybeBindToTemporary(E->Retain());
   }
 
   // FIXME: Bogus location information
index 92915c7daf17411b672adcde0db4013a32ca6f5b..8cd7342e98ebc6e9b46eeef05e1a2dd7239e39bd 100644 (file)
@@ -43,6 +43,19 @@ struct Temporaries0 {
 
 template struct Temporaries0<5, 7>;
 
+// Ensure that both the constructor and the destructor are instantiated by
+// checking for parse errors from each.
+template<int N> struct BadX {
+  BadX() { int a[-N]; } // expected-error {{array size is negative}}
+  ~BadX() { int a[-N]; } // expected-error {{array size is negative}}
+};
+
+template<int N>
+struct PR6671 {
+  void f() { (void)BadX<1>(); } // expected-note 2 {{instantiation}}
+};
+template struct PR6671<1>;
+
 // ---------------------------------------------------------------------
 // new/delete expressions
 // ---------------------------------------------------------------------