switch (S->getStmtClass()) {
// C++ and ARC stuff we don't support yet.
case Expr::ObjCIndirectCopyRestoreExprClass:
- case Stmt::CXXDefaultInitExprClass:
case Stmt::CXXDependentScopeMemberExprClass:
case Stmt::CXXPseudoDestructorExprClass:
case Stmt::CXXTryStmtClass:
break;
}
- case Stmt::CXXDefaultArgExprClass: {
+ case Stmt::CXXDefaultArgExprClass:
+ case Stmt::CXXDefaultInitExprClass: {
Bldr.takeNodes(Pred);
ExplodedNodeSet PreVisit;
getCheckerManager().runCheckersForPreStmt(PreVisit, Pred, S, *this);
ExplodedNodeSet Tmp;
StmtNodeBuilder Bldr2(PreVisit, Tmp, *currBldrCtx);
- const LocationContext *LCtx = Pred->getLocationContext();
- const CXXDefaultArgExpr *DefaultE = cast<CXXDefaultArgExpr>(S);
- const Expr *ArgE = DefaultE->getExpr();
+ const Expr *ArgE;
+ if (const CXXDefaultArgExpr *DefE = dyn_cast<CXXDefaultArgExpr>(S))
+ ArgE = DefE->getExpr();
+ else if (const CXXDefaultInitExpr *DefE = dyn_cast<CXXDefaultInitExpr>(S))
+ ArgE = DefE->getExpr();
+ else
+ llvm_unreachable("unknown constant wrapper kind");
bool IsTemporary = false;
if (const MaterializeTemporaryExpr *MTE =
if (!ConstantVal)
ConstantVal = UnknownVal();
+ const LocationContext *LCtx = Pred->getLocationContext();
for (ExplodedNodeSet::iterator I = PreVisit.begin(), E = PreVisit.end();
I != E; ++I) {
ProgramStateRef State = (*I)->getState();
- State = State->BindExpr(DefaultE, LCtx, *ConstantVal);
+ State = State->BindExpr(S, LCtx, *ConstantVal);
if (IsTemporary)
- State = createTemporaryRegionIfNeeded(State, LCtx, DefaultE,
- DefaultE);
+ State = createTemporaryRegionIfNeeded(State, LCtx,
+ cast<Expr>(S),
+ cast<Expr>(S));
Bldr2.generateNode(S, *I, State);
}
return w.arr[0].value; // no-warning
}
}
+
+namespace DefaultMemberInitializers {
+ struct Wrapper {
+ int value = 42;
+
+ Wrapper() {}
+ Wrapper(int x) : value(x) {}
+ Wrapper(bool) {}
+ };
+
+ void test() {
+ Wrapper w1;
+ clang_analyzer_eval(w1.value == 42); // expected-warning{{TRUE}}
+
+ Wrapper w2(50);
+ clang_analyzer_eval(w2.value == 50); // expected-warning{{TRUE}}
+
+ Wrapper w3(false);
+ clang_analyzer_eval(w3.value == 42); // expected-warning{{TRUE}}
+ }
+
+ struct StringWrapper {
+ const char s[4] = "abc";
+ const char *p = "xyz";
+
+ StringWrapper(bool) {}
+ };
+
+ void testString() {
+ StringWrapper w(true);
+ clang_analyzer_eval(w.s[1] == 'b'); // expected-warning{{TRUE}}
+ clang_analyzer_eval(w.p[1] == 'y'); // expected-warning{{TRUE}}
+ }
+}