From 1c6ed3add617a06da11c8a69b643a7b2e41604b9 Mon Sep 17 00:00:00 2001 From: Artem Dergachev Date: Sat, 24 Feb 2018 03:54:22 +0000 Subject: [PATCH] [CFG] Keep speculatively working around an MSVC compiler crash. Replace if() with a switch(). Because random changes in the code seem to suppress the crash. Story so far: r325966 - Crash introduced. r325969 - Speculative fix had no effect. r325978 - Tried to bisect the offending function, crash suddenly disappeared. r326016 - After another random change in the code, bug appeared again. llvm-svn: 326021 --- clang/lib/Analysis/CFG.cpp | 40 +++++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 9 deletions(-) diff --git a/clang/lib/Analysis/CFG.cpp b/clang/lib/Analysis/CFG.cpp index 7ad6fbbf90bd..1cf706311728 100644 --- a/clang/lib/Analysis/CFG.cpp +++ b/clang/lib/Analysis/CFG.cpp @@ -1171,25 +1171,47 @@ void CFGBuilder::findConstructionContexts( const ConstructionContext *ContextSoFar, Stmt *Child) { if (!BuildOpts.AddRichCXXConstructors) return; + if (!Child) return; - if (auto *CE = dyn_cast(Child)) { - consumeConstructionContext(ContextSoFar, CE); - } else if (auto *Cleanups = dyn_cast(Child)) { + + switch(Child->getStmtClass()) { + case Stmt::CXXConstructExprClass: + case Stmt::CXXTemporaryObjectExprClass: { + consumeConstructionContext(ContextSoFar, cast(Child)); + break; + } + case Stmt::ExprWithCleanupsClass: { + auto *Cleanups = cast(Child); findConstructionContexts(ContextSoFar, Cleanups->getSubExpr()); - } else if (auto *Cast = dyn_cast(Child)) { + break; + } + case Stmt::CXXFunctionalCastExprClass: { + auto *Cast = cast(Child); findConstructionContexts(ContextSoFar, Cast->getSubExpr()); - } else if (auto *ImplicitCast = dyn_cast(Child)) { - if (ImplicitCast->getCastKind() == CK_NoOp) - findConstructionContexts(ContextSoFar, ImplicitCast->getSubExpr()); - } else if (auto *BTE = dyn_cast(Child)) { + break; + } + case Stmt::ImplicitCastExprClass: { + auto *Cast = cast(Child); + findConstructionContexts(ContextSoFar, Cast->getSubExpr()); + break; + } + case Stmt::CXXBindTemporaryExprClass: { + auto *BTE = cast(Child); findConstructionContexts( ConstructionContext::create(cfg->getBumpVectorContext(), BTE, ContextSoFar), BTE->getSubExpr()); - } else if (auto *CO = dyn_cast(Child)) { + break; + } + case Stmt::ConditionalOperatorClass: { + auto *CO = cast(Child); findConstructionContexts(ContextSoFar, CO->getLHS()); findConstructionContexts(ContextSoFar, CO->getRHS()); + break; + } + default: + break; } }