On Tue, May 19, 2015 at 2:19 PM, Nick Lewycky <[email protected]> wrote:
> On 18 May 2015 at 12:59, Ismail Pazarbasi <[email protected]> > wrote: > >> Author: ismailp >> Date: Mon May 18 14:59:11 2015 >> New Revision: 237608 >> >> URL: http://llvm.org/viewvc/llvm-project?rev=237608&view=rev >> Log: >> Detect uses of mismatching forms of 'new' and 'delete' >> >> Emit warning when operand to `delete` is allocated with `new[]` or >> operand to `delete[]` is allocated with `new`. >> >> rev 2 update: >> `getNewExprFromInitListOrExpr` should return `dyn_cast_or_null` >> instead of `dyn_cast`, since `E` might be null. >> > > FYI, I'm getting an assertion firing: > > clang: llvm/tools/clang/lib/Sema/SemaExprCXX.cpp:2447: const > clang::CXXNewExpr *(anonymous > namespace)::MismatchingNewDeleteDetector::getNewExprFromInitListOrExpr(const > clang::Expr *): Assertion `E != nullptr && "Expected a valid initializer > expression"' failed. > > on presumed to be valid code (code that builds with a previous version of > clang). I'm creduce'ing a testcase now. > > Try this reduced case: template <typename T> struct Base { struct S { const T *t = 0; }; }; void Foo(Base<double>::S s) { delete s.t; } I think what is happening is that the warning is looking for the initializer of Base<double>::S::t, which is never used and not instantiated. So, the FieldDecl reports that it has an initializer, but returns a null pointer when trying to retrieve it.
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
