From dd4e485a0db4e651f28281cd3eda93aad6ee04fd Mon Sep 17 00:00:00 2001 From: Eli Friedman Date: Sun, 20 Dec 2009 22:29:11 +0000 Subject: [PATCH] Make sure we instantiate the destructor for variables initialized by assignment. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@91798 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaDecl.cpp | 9 +++++++++ test/SemaTemplate/instantiate-decl-dtor.cpp | 11 +++++++++++ 2 files changed, 20 insertions(+) create mode 100644 test/SemaTemplate/instantiate-decl-dtor.cpp diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index a80d62a473..f087bcb95c 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -3658,6 +3658,15 @@ void Sema::AddInitializerToDecl(DeclPtrTy dcl, ExprArg init, bool DirectInit) { assert(Deleted && "Unrecorded tentative definition?"); Deleted=Deleted; } + if (getLangOptions().CPlusPlus) { + // Make sure we mark the destructor as used if necessary. + QualType InitType = VDecl->getType(); + if (const ArrayType *Array = Context.getAsArrayType(InitType)) + InitType = Context.getBaseElementType(Array); + if (InitType->isRecordType()) + FinalizeVarWithDestructor(VDecl, InitType); + } + return; } diff --git a/test/SemaTemplate/instantiate-decl-dtor.cpp b/test/SemaTemplate/instantiate-decl-dtor.cpp new file mode 100644 index 0000000000..193d9764c2 --- /dev/null +++ b/test/SemaTemplate/instantiate-decl-dtor.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 %s -fsyntax-only -verify + +template struct A { + T x; + A(int y) { x = y; } + ~A() { *x = 10; } // expected-error {{indirection requires pointer operand}} +}; + +void a() { + A b = 10; // expected-note {{requested here}} +} -- 2.50.1