From: Craig Silverstein Date: Tue, 16 Nov 2010 07:16:25 +0000 (+0000) Subject: Have CXXDeleteExpr::getDestroyedType return the actual destroyed type X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=a437ad3ec5b407ede394d74e6f9f463fa3657dbe;p=clang Have CXXDeleteExpr::getDestroyedType return the actual destroyed type in more situations. In particular, for code like template void Fn() { T* x; delete x; } getDestroyedType() will now return T rather than T*, as it would before this change. On the other hand, for code like this: template void Fn() { T x; delete x; } getDestroyedType() will return an empty QualType(), since it doesn't know what the actual destroyed type would be. Previously, it would return T. OKed by rjmccall git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@119334 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/clang/AST/ExprCXX.h b/include/clang/AST/ExprCXX.h index 3b8ecf2930..78edd4beec 100644 --- a/include/clang/AST/ExprCXX.h +++ b/include/clang/AST/ExprCXX.h @@ -1150,6 +1150,9 @@ public: Expr *getArgument() { return cast(Argument); } const Expr *getArgument() const { return cast(Argument); } + /// \brief Retrieve the type being destroyed. If the type being + /// destroyed is a dependent type which may or may not be a pointer, + /// return an invalid type. QualType getDestroyedType() const; virtual SourceRange getSourceRange() const { diff --git a/lib/AST/ExprCXX.cpp b/lib/AST/ExprCXX.cpp index 60785d471a..1820ff7707 100644 --- a/lib/AST/ExprCXX.cpp +++ b/lib/AST/ExprCXX.cpp @@ -162,8 +162,9 @@ QualType CXXDeleteExpr::getDestroyedType() const { } // The type-to-delete may not be a pointer if it's a dependent type. const QualType ArgType = Arg->getType(); - if (ArgType->isDependentType()) - return ArgType; + + if (ArgType->isDependentType() && !ArgType->isPointerType()) + return QualType(); return ArgType->getAs()->getPointeeType(); }