[analyzer] Pass the correct Expr to the bug reporter visitors when dealing with CompoundLiteralExpr
This allows us to trigger the IDC visitor in the added test case.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176577 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp b/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
index de5e6dc..87e2185 100644
--- a/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
+++ b/lib/StaticAnalyzer/Checkers/AttrNonNullChecker.cpp
@@ -57,10 +57,11 @@
if (!DV)
continue;
+ const Expr *ArgE = Call.getArgExpr(idx);
+
if (!DV->getAs<Loc>()) {
// If the argument is a union type, we want to handle a potential
// transparent_union GCC extension.
- const Expr *ArgE = Call.getArgExpr(idx);
if (!ArgE)
continue;
@@ -77,7 +78,13 @@
DV = V.getAs<DefinedSVal>();
assert(++CSV_I == CSV->end());
if (!DV)
- continue;
+ continue;
+ // Retrieve the corresponding expression.
+ if (const CompoundLiteralExpr *CE = dyn_cast<CompoundLiteralExpr>(ArgE))
+ if (const InitListExpr *IE =
+ dyn_cast<InitListExpr>(CE->getInitializer()))
+ ArgE = dyn_cast<Expr>(*(IE->begin()));
+
} else {
// FIXME: Handle LazyCompoundVals?
continue;
@@ -106,7 +113,7 @@
// Highlight the range of the argument that was null.
R->addRange(Call.getArgSourceRange(idx));
- if (const Expr *ArgE = Call.getArgExpr(idx))
+ if (ArgE)
bugreporter::trackNullOrUndefValue(errorNode, ArgE, *R);
// Emit the bug report.
C.emitReport(R);