]> granicus.if.org Git - clang/commitdiff
Make sure we instantiate the destructor for variables initialized by
authorEli Friedman <eli.friedman@gmail.com>
Sun, 20 Dec 2009 22:29:11 +0000 (22:29 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sun, 20 Dec 2009 22:29:11 +0000 (22:29 +0000)
assignment.

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

lib/Sema/SemaDecl.cpp
test/SemaTemplate/instantiate-decl-dtor.cpp [new file with mode: 0644]

index a80d62a473807de78abe0ed91dad104e835c9c0d..f087bcb95cf86bae78de338bad454b40846b5fa6 100644 (file)
@@ -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 (file)
index 0000000..193d976
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: %clang_cc1 %s -fsyntax-only -verify
+
+template <typename T> struct A {
+  T x;
+  A(int y) { x = y; }
+  ~A() { *x = 10; } // expected-error {{indirection requires pointer operand}}
+};
+
+void a() {
+  A<int> b = 10; // expected-note {{requested here}}
+}