NoQ accepted this revision. NoQ added a subscriber: george.karpenkov. NoQ added a comment. This revision is now accepted and ready to land.
Very nice! Crashing diagnostic locations are a fairly common issue. That said, this still makes me wonder what sort of checker were you writing that triggered this originally :) ================ Comment at: lib/StaticAnalyzer/Checkers/DebugCheckers.cpp:271 +//===----------------------------------------------------------------------===// +// Emits a report for each and every Stmt. +//===----------------------------------------------------------------------===// ---------------- Technically, we don't invoke `checkPreStmt` for every `Stmt` (eg., `IfStmt` is omitted in favor of `checkBranchCondition`, `IntegerLiteral` is outright skipped because `ExprEngine` doesn't even evaluate anything at this point). Moreover, for some `Stmt`s we more-or-less-intentionally only invoke `checkPreStmt` but not `checkPostStmt`. Also would you eventually want to expand this checker with non-`Stmt` callbacks? ================ Comment at: lib/StaticAnalyzer/Checkers/DebugCheckers.cpp:277 +class ReportStmts : public Checker<check::PreStmt<Stmt>> { + std::unique_ptr<BuiltinBug> BT_stmtLoc; + ---------------- My current favorite approach is: ```lang=c++ BuiltinBug BT_stmtLoc{this, "Statement"}; ``` ...and remove the constructor. And remove the `*` in your `make_unique<BugReport>`. ================ Comment at: lib/StaticAnalyzer/Core/PathDiagnostic.cpp:574-575 + // FIXME: Ironically, this assert actually fails in some cases. + //assert(L.isValid()); return L; ---------------- A normal day in Clang :) ================ Comment at: lib/StaticAnalyzer/Core/PathDiagnostic.cpp:679 + + if (ME->getMemberLoc().isValid()) + return PathDiagnosticLocation(ME->getMemberLoc(), SM, SingleLocK); ---------------- I think it's worth commenting why exactly this may fail. It's fairly hard to guess that we're talking about member operators. ================ Comment at: test/Analysis/invalid-pos-fix.cpp:6 + +struct h { + operator int(); ---------------- Random ideas on organizing tests so that to avoid adding thousands of one-test files: * Give these objects fancier names and/or add a `no-crash` so that it was clear that this test tests a crash for reporting a bug over a `MemberExpr` that corresponds to an `operator()` * Or maybe wrap this into a namespace, so that it was easier to expand this file. * We traditionally put such tests into `test/Analysis/diagnostics`, dunno why though. etc. I also recall @george.karpenkov arguing for making test directory structure mirror source directory structure, but that's definitely not a blocker for this patch :] ================ Comment at: test/Analysis/invalid-pos-fix.cpp:11-13 + return h(); // expected-warning{{Statement}} + // expected-warning@-1{{Statement}} + // expected-warning@-2{{Statement}} ---------------- `// expected-warning 3 {{Statement}}` CHANGES SINCE LAST ACTION https://reviews.llvm.org/D58777/new/ https://reviews.llvm.org/D58777 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits