Author: csilvers
Date: Tue Oct 19 19:38:15 2010
New Revision: 116891
URL: http://llvm.org/viewvc/llvm-project?rev=116891&view=rev
Log:
The type-to-delete may not be a pointer if it's a dependent type.
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.
Modified:
cfe/trunk/lib/AST/ExprCXX.cpp
Modified: cfe/trunk/lib/AST/ExprCXX.cpp
URL:
http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ExprCXX.cpp?rev=116891&r1=116890&r2=116891&view=diff
==============================================================================
--- cfe/trunk/lib/AST/ExprCXX.cpp (original)
+++ cfe/trunk/lib/AST/ExprCXX.cpp Tue Oct 19 19:38:15 2010
@@ -158,8 +158,12 @@
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; }
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits