forked from OSchip/llvm-project
Fix PR 6844, a regression caused by the introduction of llvm_unreachable for the default
case in GRExprEngine::Visit (in r101129). Instead, enumerate all Stmt cases and have no 'default' case in the switch statement. When we encounter a Stmt we don't handle, we should explicitly add it to the switch statement. llvm-svn: 101378
This commit is contained in:
parent
2085719a98
commit
8db54ff1de
|
@ -583,49 +583,85 @@ void GRExprEngine::Visit(Stmt* S, ExplodedNode* Pred, ExplodedNodeSet& Dst) {
|
|||
}
|
||||
|
||||
switch (S->getStmtClass()) {
|
||||
default:
|
||||
llvm_unreachable("Unhandled stmt class");
|
||||
// C++ stuff we don't support yet.
|
||||
case Stmt::CXXTypeidExprClass:
|
||||
case Stmt::CXXNullPtrLiteralExprClass:
|
||||
case Stmt::CXXThrowExprClass:
|
||||
case Stmt::CXXDefaultArgExprClass:
|
||||
case Stmt::CXXZeroInitValueExprClass:
|
||||
case Stmt::CXXNewExprClass:
|
||||
case Stmt::CXXDeleteExprClass:
|
||||
case Stmt::CXXPseudoDestructorExprClass:
|
||||
case Stmt::UnresolvedLookupExprClass:
|
||||
case Stmt::UnaryTypeTraitExprClass:
|
||||
case Stmt::DependentScopeDeclRefExprClass:
|
||||
case Stmt::CXXConstructExprClass:
|
||||
case Stmt::CXXBindReferenceExprClass:
|
||||
case Stmt::CXXBindTemporaryExprClass:
|
||||
case Stmt::CXXExprWithTemporariesClass:
|
||||
case Stmt::CXXTemporaryObjectExprClass:
|
||||
case Stmt::CXXUnresolvedConstructExprClass:
|
||||
case Stmt::CXXDependentScopeMemberExprClass:
|
||||
case Stmt::UnresolvedMemberExprClass:
|
||||
case Stmt::CXXCatchStmtClass:
|
||||
case Stmt::CXXTryStmtClass: {
|
||||
case Stmt::CXXConstructExprClass:
|
||||
case Stmt::CXXDefaultArgExprClass:
|
||||
case Stmt::CXXDeleteExprClass:
|
||||
case Stmt::CXXDependentScopeMemberExprClass:
|
||||
case Stmt::CXXExprWithTemporariesClass:
|
||||
case Stmt::CXXNamedCastExprClass:
|
||||
case Stmt::CXXNewExprClass:
|
||||
case Stmt::CXXNullPtrLiteralExprClass:
|
||||
case Stmt::CXXPseudoDestructorExprClass:
|
||||
case Stmt::CXXTemporaryObjectExprClass:
|
||||
case Stmt::CXXThrowExprClass:
|
||||
case Stmt::CXXTryStmtClass:
|
||||
case Stmt::CXXTypeidExprClass:
|
||||
case Stmt::CXXUnresolvedConstructExprClass:
|
||||
case Stmt::CXXZeroInitValueExprClass:
|
||||
case Stmt::DependentScopeDeclRefExprClass:
|
||||
case Stmt::UnaryTypeTraitExprClass:
|
||||
case Stmt::UnresolvedLookupExprClass:
|
||||
case Stmt::UnresolvedMemberExprClass:
|
||||
{
|
||||
SaveAndRestore<bool> OldSink(Builder->BuildSinks);
|
||||
Builder->BuildSinks = true;
|
||||
MakeNode(Dst, S, Pred, GetState(Pred));
|
||||
break;
|
||||
}
|
||||
|
||||
// Cases that should never be evaluated simply because they shouldn't
|
||||
// appear in the CFG.
|
||||
case Stmt::BreakStmtClass:
|
||||
case Stmt::CaseStmtClass:
|
||||
case Stmt::CompoundStmtClass:
|
||||
case Stmt::ContinueStmtClass:
|
||||
case Stmt::DefaultStmtClass:
|
||||
case Stmt::DoStmtClass:
|
||||
case Stmt::GotoStmtClass:
|
||||
case Stmt::IndirectGotoStmtClass:
|
||||
case Stmt::LabelStmtClass:
|
||||
case Stmt::NoStmtClass:
|
||||
case Stmt::NullStmtClass:
|
||||
case Stmt::SwitchCaseClass:
|
||||
llvm_unreachable("Stmt should not be in analyzer evaluation loop");
|
||||
break;
|
||||
|
||||
// Cases not handled yet; but will handle some day.
|
||||
case Stmt::DesignatedInitExprClass:
|
||||
case Stmt::ExtVectorElementExprClass:
|
||||
case Stmt::GNUNullExprClass:
|
||||
case Stmt::ImaginaryLiteralClass:
|
||||
case Stmt::ImplicitValueInitExprClass:
|
||||
case Stmt::ObjCAtCatchStmtClass:
|
||||
case Stmt::ObjCAtFinallyStmtClass:
|
||||
case Stmt::ObjCAtSynchronizedStmtClass:
|
||||
case Stmt::ObjCAtTryStmtClass:
|
||||
case Stmt::ObjCEncodeExprClass:
|
||||
case Stmt::ObjCImplicitSetterGetterRefExprClass:
|
||||
case Stmt::ObjCIsaExprClass:
|
||||
case Stmt::ObjCPropertyRefExprClass:
|
||||
case Stmt::ObjCProtocolExprClass:
|
||||
case Stmt::ObjCSelectorExprClass:
|
||||
case Stmt::ObjCStringLiteralClass:
|
||||
case Stmt::ObjCSuperExprClass:
|
||||
case Stmt::ParenListExprClass:
|
||||
case Stmt::PredefinedExprClass:
|
||||
case Stmt::ShuffleVectorExprClass:
|
||||
case Stmt::TypesCompatibleExprClass:
|
||||
case Stmt::VAArgExprClass:
|
||||
// Fall through.
|
||||
|
||||
// Cases we intentionally don't evaluate, since they don't need
|
||||
// to be explicitly evaluated.
|
||||
case Stmt::AddrLabelExprClass:
|
||||
case Stmt::IntegerLiteralClass:
|
||||
case Stmt::CharacterLiteralClass:
|
||||
case Stmt::CXXBoolLiteralExprClass:
|
||||
case Stmt::FloatingLiteralClass:
|
||||
case Stmt::ImplicitValueInitExprClass:
|
||||
case Stmt::ObjCSuperExprClass:
|
||||
case Stmt::ObjCStringLiteralClass:
|
||||
case Stmt::ObjCSelectorExprClass:
|
||||
case Stmt::ObjCImplicitSetterGetterRefExprClass:
|
||||
case Stmt::PredefinedExprClass:
|
||||
// Cases we intentionally have "default" handle:
|
||||
// AddrLabelExpr, IntegerLiteral, CharacterLiteral
|
||||
|
||||
Dst.Add(Pred); // No-op. Simply propagate the current state unchanged.
|
||||
break;
|
||||
|
||||
|
|
|
@ -994,3 +994,13 @@ int rdar7813989(int x, rdar7813989_Val *a, rdar7813989_Val *b) {
|
|||
return z + 1;
|
||||
}
|
||||
|
||||
// PR 6844 - Don't crash on vaarg expression.
|
||||
typedef __builtin_va_list va_list;
|
||||
void map(int srcID, ...) {
|
||||
va_list ap;
|
||||
int i;
|
||||
for (i = 0; i < srcID; i++) {
|
||||
int v = __builtin_va_arg(ap, int);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue