Index: clang/test/Analysis/domtest.cpp =================================================================== --- /dev/null +++ clang/test/Analysis/domtest.cpp @@ -0,0 +1,46 @@ +// RUN: %clang_analyze_cc1 %s \ +// RUN: -analyzer-checker=debug.DumpCFG \ +// RUN: -analyzer-checker=debug.DumpDominators \ +// RUN: 2>&1 | FileCheck %s + +namespace pr42041_unreachable_cfg_successor { +enum Kind { + A +}; + +void f() { + switch(Kind{}) { + case A: + break; + } +} +} // end of namespace pr42041_unreachable_cfg_successor + +// CHECK: void f() +// CHECK-NEXT: [B3 (ENTRY)] +// CHECK-NEXT: Succs (1): B1 +// +// CHECK: [B1] +// CHECK-NEXT: 1: {} +// CHECK-NEXT: 2: pr42041_unreachable_cfg_successor::Kind[B1.1] +// CHECK-SAME: (CXXFunctionalCastExpr, NoOp, +// CHECK-SAME: enum pr42041_unreachable_cfg_successor::Kind) +// CHECK-NEXT: 3: [B1.2] (ImplicitCastExpr, IntegralCast, int) +// CHECK-NEXT: T: switch [B1.3] +// CHECK-NEXT: Preds (1): B3 +// CHECK-NEXT: Succs (2): B2 B0(Unreachable) +// +// CHECK: [B2] +// CHECK-NEXT: case A: +// CHECK-NEXT: T: break; +// CHECK-NEXT: Preds (1): B1 +// CHECK-NEXT: Succs (1): B0 +// +// CHECK: [B0 (EXIT)] +// CHECK-NEXT: Preds (2): B2 B1(Unreachable) +// +// CHECK: Immediate dominance tree (Node#,IDom#): +// CHECK-NEXT: (0,2) +// CHECK-NEXT: (1,3) +// CHECK-NEXT: (2,1) +// CHECK-NEXT: (3,3) Index: llvm/include/llvm/Support/GenericDomTreeConstruction.h =================================================================== --- llvm/include/llvm/Support/GenericDomTreeConstruction.h +++ llvm/include/llvm/Support/GenericDomTreeConstruction.h @@ -235,6 +235,13 @@ constexpr bool Direction = IsReverse != IsPostDom; // XOR. for (const NodePtr Succ : ChildrenGetter::Get(BB, BatchUpdates)) { + + // The clang's CFG contains nullpointers for unreachable successors (eg. + // an if statement's condition is always false, the 'then' branch is + // unreachable), skip them. + if (!Succ) + continue; + const auto SIT = NodeToInfo.find(Succ); // Don't visit nodes more than once but remember to collect // ReverseChildren.