<div dir="ltr"><br>Ismail,<br><br>I ran into a segfault inside the new warning you added in <a href="http://reviews.llvm.org/D4661">http://reviews.llvm.org/D4661</a>.  I don't have a repro case for you, but I'm in a debugging session now and this may help you (and me getting a test case for you).<br><br>We die in<br><br><font face="monospace, monospace">clang: llvm/llvm/include/llvm/Support/Casting.h:95: static bool llvm::isa_impl_cl<const clang::CXXNewExpr, const clang::Expr *>::doit(const From *) [To = const clang::CXXNewExpr, From = const clang::Expr *]: Assertion `Val && "isa<> used on a null pointer"' failed.<br></font><br>The issue starts in MismatchingNewDeleteDetector::analyzeInClassInitializer. The call to Field->getInClassInitializer() returns the expression:<br><br>(gdb) call E->dump()<br>InitListExpr 0x7ffff6cdf010 'class Cord *'<br>`-ImplicitCastExpr 0x7ffff6cdf050 'class Cord *' <NullToPointer><div>  `-CXXNullPtrLiteralExpr 0x7ffff6cdefb0 'nullptr_t'</div><div><br></div><div>We then call MismatchingNewDeleteDetector::getNewExprFromInitListOrExpr() with that expression. The function checks that the initial expression is not null, but we then decide to get the first init from the list of inits, which returns a nullptr:</div><div><br></div><div><div><font face="monospace, monospace">2451        if (ILE->getNumInits() == 1)</font></div><div><font face="monospace, monospace">(gdb) call ILE->dump()</font></div><div><font face="monospace, monospace">InitListExpr 0x7ffff6cdf010 'class Cord *'</font></div><div><font face="monospace, monospace">`-ImplicitCastExpr 0x7ffff6cdf050 'class Cord *' <NullToPointer></font></div><div><font face="monospace, monospace">  `-CXXNullPtrLiteralExpr 0x7ffff6cdefb0 'nullptr_t'</font></div><div><font face="monospace, monospace">(gdb) n</font></div><div><font face="monospace, monospace">2452          E = dyn_cast<const CXXNewExpr>(ILE->getInit(0)->IgnoreParenImpCasts());</font></div><div><font face="monospace, monospace">(gdb) n</font></div><div><font face="monospace, monospace">2453      }</font></div><div><font face="monospace, monospace">(gdb) p E</font></div><div><font face="monospace, monospace">$6 = (const clang::Expr *) 0x0</font></div></div><div><br></div><div>Then we try to dyn_cast<> it, which segfaults:</div><div><br></div><div><div><font face="monospace, monospace">(gdb) n</font></div><div><font face="monospace, monospace">2455      return dyn_cast<const CXXNewExpr>(E);</font></div><div><font face="monospace, monospace">(gdb) n</font></div><div><font face="monospace, monospace">clang: third_party/llvm/llvm/include/llvm/Support/Casting.h:95: static bool llvm::isa_impl_cl<const clang::CXXNewExpr, const clang::Expr *>::doit(const From *) [To = const clang::CXXNewExpr, From = const clang::Expr *]: Assertion `Val && "isa<> used on a null pointer"' failed.</font></div><div><font face="monospace, monospace"><br></font></div><div><font face="monospace, monospace">Program received signal SIGABRT, Aborted.</font></div></div><div><font face="monospace, monospace"><br></font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">I don't know whether we should just return nil when E gets nullfiied or this is a sign of some other problem.</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Thanks.  Diego.</font></div></div>