r192345 - Sema: Taking the address of a dtor is illegal per C++ [class.dtor]p2.

Richard Smith richard at metafoo.co.uk
Thu Oct 10 11:31:13 PDT 2013


What do we do in the corresponding case for constructors? It seems like we
should handle those two cases together.
On 10 Oct 2013 02:49, "Benjamin Kramer" <benny.kra at googlemail.com> wrote:

> Author: d0k
> Date: Thu Oct 10 04:44:41 2013
> New Revision: 192345
>
> URL: http://llvm.org/viewvc/llvm-project?rev=192345&view=rev
> Log:
> Sema: Taking the address of a dtor is illegal per C++ [class.dtor]p2.
>
> Emit a proper error instead of crashing in CodeGen. PR16892.
>
> Modified:
>     cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>     cfe/trunk/lib/Sema/SemaExpr.cpp
>     cfe/trunk/test/SemaCXX/destructor.cpp
>
> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=192345&r1=192344&r2=192345&view=diff
>
> ==============================================================================
> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Oct 10
> 04:44:41 2013
> @@ -4483,6 +4483,8 @@ def ext_typecheck_addrof_temporary : Ext
>    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<
>
> Modified: cfe/trunk/lib/Sema/SemaExpr.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaExpr.cpp?rev=192345&r1=192344&r2=192345&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/Sema/SemaExpr.cpp (original)
> +++ cfe/trunk/lib/Sema/SemaExpr.cpp Thu Oct 10 04:44:41 2013
> @@ -8709,6 +8709,10 @@ QualType Sema::CheckAddressOfOperand(Exp
>        }
>      }
>
> +    // 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) {
>
> Modified: cfe/trunk/test/SemaCXX/destructor.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/destructor.cpp?rev=192345&r1=192344&r2=192345&view=diff
>
> ==============================================================================
> --- cfe/trunk/test/SemaCXX/destructor.cpp (original)
> +++ cfe/trunk/test/SemaCXX/destructor.cpp Thu Oct 10 04:44:41 2013
> @@ -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}}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20131010/50258da1/attachment.html>


More information about the cfe-commits mailing list