r326021 - [CFG] Keep speculatively working around an MSVC compiler crash.

Artem Dergachev via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 23 19:54:22 PST 2018


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;
   }
 }
 




More information about the cfe-commits mailing list