]> granicus.if.org Git - clang/commitdiff
Sema: Taking the address of a dtor is illegal per C++ [class.dtor]p2.
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 10 Oct 2013 09:44:41 +0000 (09:44 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 10 Oct 2013 09:44:41 +0000 (09:44 +0000)
Emit a proper error instead of crashing in CodeGen. PR16892.

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

include/clang/Basic/DiagnosticSemaKinds.td
lib/Sema/SemaExpr.cpp
test/SemaCXX/destructor.cpp

index 868a5dd7d60d531ce2d3bfd5640e64dc92bb44f2..1e01da1991140bfb3e6f6b98a4decd68b098bdc5 100644 (file)
@@ -4483,6 +4483,8 @@ def ext_typecheck_addrof_temporary : ExtWarn<
   InGroup<DiagGroup<"address-of-temporary">>, DefaultError;
 def err_typecheck_addrof_temporary : Error<
   "taking the address of a temporary object of type %0">;
+def err_typecheck_addrof_dtor : Error<
+  "taking the address of a destructor">;
 def err_typecheck_unary_expr : Error<
   "invalid argument type %0 to unary expression">;
 def err_typecheck_indirection_requires_pointer : Error<
index db231e55d614dc7d4437612a92dcfc92f8787968..690661df1c7de5c703c651b9d37e2ea8f4f2b1c9 100644 (file)
@@ -8709,6 +8709,10 @@ QualType Sema::CheckAddressOfOperand(ExprResult &OrigOp, SourceLocation OpLoc) {
       }
     }
 
+    // Taking the address of a dtor is illegal per C++ [class.dtor]p2.
+    if (isa<CXXDestructorDecl>(MD))
+      Diag(OpLoc, diag::err_typecheck_addrof_dtor) << op->getSourceRange();
+
     return Context.getMemberPointerType(op->getType(),
               Context.getTypeDeclType(MD->getParent()).getTypePtr());
   } else if (lval != Expr::LV_Valid && lval != Expr::LV_IncompleteVoidType) {
index f3c6ab0b737f5cc4823bf51af0b1d6a909b43943..e511be0116621c61cd4e1381d2a9748f99fc00e6 100644 (file)
@@ -363,3 +363,7 @@ namespace PR7900 {
     (&b)->~A(); // expected-error{{destructor type 'PR7900::A' in object destruction expression does not match the type 'PR7900::B' of the object being destroyed}}
   }
 }
+
+namespace PR16892 {
+  auto p = &A::~A; // expected-error{{taking the address of a destructor}}
+}