Here's example code:
---
template<class T> class MyClass {
struct S { };
S* NewS() { return new S; }
void DeleteS() { delete NewS(); }
};
---
CXXDeleteExpr::getDestroyedType() on the 'delete NewS()' expression
would crash before this change. Now it returns a dependent type
object. Solution suggested by dgregor.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@116891
91177308-0d34-0410-b5e6-
96231b3b80d8
else
break;
}
+ // The type-to-delete may not be a pointer if it's a dependent type.
+ const Type *ArgType = Arg->getType();
+ if (ArgType->isDependentType())
+ return ArgType;
- return Arg->getType()->getAs<PointerType>()->getPointeeType();
+ return ArgType->getAs<PointerType>()->getPointeeType();
}
Stmt::child_iterator CXXDeleteExpr::child_begin() { return &Argument; }