From a3ce8ae36144991fa125dafc5345a03cc875e503 Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Wed, 31 Mar 2010 18:34:58 +0000 Subject: [PATCH] Re-bind non-dependent CXXTemporaryObjectExpr nodes as temporaries when 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 | 2 +- test/SemaTemplate/instantiate-expr-4.cpp | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/Sema/TreeTransform.h b/lib/Sema/TreeTransform.h index 5d3f21e4e8..361ab2e78c 100644 --- a/lib/Sema/TreeTransform.h +++ b/lib/Sema/TreeTransform.h @@ -5134,7 +5134,7 @@ TreeTransform::TransformCXXTemporaryObjectExpr( !ArgumentChanged) { // FIXME: Instantiation-specific SemaRef.MarkDeclarationReferenced(E->getTypeBeginLoc(), Constructor); - return SemaRef.Owned(E->Retain()); + return SemaRef.MaybeBindToTemporary(E->Retain()); } // FIXME: Bogus location information diff --git a/test/SemaTemplate/instantiate-expr-4.cpp b/test/SemaTemplate/instantiate-expr-4.cpp index 92915c7daf..8cd7342e98 100644 --- a/test/SemaTemplate/instantiate-expr-4.cpp +++ b/test/SemaTemplate/instantiate-expr-4.cpp @@ -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 struct BadX { + BadX() { int a[-N]; } // expected-error {{array size is negative}} + ~BadX() { int a[-N]; } // expected-error {{array size is negative}} +}; + +template +struct PR6671 { + void f() { (void)BadX<1>(); } // expected-note 2 {{instantiation}} +}; +template struct PR6671<1>; + // --------------------------------------------------------------------- // new/delete expressions // --------------------------------------------------------------------- -- 2.40.0