diff options
-rw-r--r-- | include/clang/AST/ExprCXX.h | 3 | ||||
-rw-r--r-- | lib/AST/ExprCXX.cpp | 5 |
2 files changed, 6 insertions, 2 deletions
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<Expr>(Argument); } const Expr *getArgument() const { return cast<Expr>(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<PointerType>()->getPointeeType(); } |