Author: dergachev Date: Fri Feb 23 19:54:22 2018 New Revision: 326021 URL: http://llvm.org/viewvc/llvm-project?rev=326021&view=rev Log: [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. Modified: cfe/trunk/lib/Analysis/CFG.cpp Modified: cfe/trunk/lib/Analysis/CFG.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Analysis/CFG.cpp?rev=326021&r1=326020&r2=326021&view=diff ============================================================================== --- cfe/trunk/lib/Analysis/CFG.cpp (original) +++ cfe/trunk/lib/Analysis/CFG.cpp Fri Feb 23 19:54:22 2018 @@ -1171,25 +1171,47 @@ void CFGBuilder::findConstructionContext const ConstructionContext *ContextSoFar, Stmt *Child) { if (!BuildOpts.AddRichCXXConstructors) return; + if (!Child) return; - if (auto *CE = dyn_cast<CXXConstructExpr>(Child)) { - consumeConstructionContext(ContextSoFar, CE); - } else if (auto *Cleanups = dyn_cast<ExprWithCleanups>(Child)) { + + switch(Child->getStmtClass()) { + case Stmt::CXXConstructExprClass: + case Stmt::CXXTemporaryObjectExprClass: { + consumeConstructionContext(ContextSoFar, cast<CXXConstructExpr>(Child)); + break; + } + case Stmt::ExprWithCleanupsClass: { + auto *Cleanups = cast<ExprWithCleanups>(Child); findConstructionContexts(ContextSoFar, Cleanups->getSubExpr()); - } else if (auto *Cast = dyn_cast<CXXFunctionalCastExpr>(Child)) { + break; + } + case Stmt::CXXFunctionalCastExprClass: { + auto *Cast = cast<CXXFunctionalCastExpr>(Child); findConstructionContexts(ContextSoFar, Cast->getSubExpr()); - } else if (auto *ImplicitCast = dyn_cast<ImplicitCastExpr>(Child)) { - if (ImplicitCast->getCastKind() == CK_NoOp) - findConstructionContexts(ContextSoFar, ImplicitCast->getSubExpr()); - } else if (auto *BTE = dyn_cast<CXXBindTemporaryExpr>(Child)) { + break; + } + case Stmt::ImplicitCastExprClass: { + auto *Cast = cast<ImplicitCastExpr>(Child); + findConstructionContexts(ContextSoFar, Cast->getSubExpr()); + break; + } + case Stmt::CXXBindTemporaryExprClass: { + auto *BTE = cast<CXXBindTemporaryExpr>(Child); findConstructionContexts( ConstructionContext::create(cfg->getBumpVectorContext(), BTE, ContextSoFar), BTE->getSubExpr()); - } else if (auto *CO = dyn_cast<ConditionalOperator>(Child)) { + break; + } + case Stmt::ConditionalOperatorClass: { + auto *CO = cast<ConditionalOperator>(Child); findConstructionContexts(ContextSoFar, CO->getLHS()); findConstructionContexts(ContextSoFar, CO->getRHS()); + break; + } + default: + break; } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits