Index: cfe/trunk/lib/Analysis/CFG.cpp =================================================================== --- cfe/trunk/lib/Analysis/CFG.cpp +++ cfe/trunk/lib/Analysis/CFG.cpp @@ -1378,6 +1378,15 @@ findConstructionContexts(Layer, CO->getRHS()); break; } + case Stmt::InitListExprClass: { + auto *ILE = cast(Child); + if (ILE->isTransparent()) { + findConstructionContexts(Layer, ILE->getInit(0)); + break; + } + // TODO: Handle other cases. For now, fail to find construction contexts. + break; + } default: break; } Index: cfe/trunk/test/Analysis/cfg-rich-constructors.cpp =================================================================== --- cfe/trunk/test/Analysis/cfg-rich-constructors.cpp +++ cfe/trunk/test/Analysis/cfg-rich-constructors.cpp @@ -1043,3 +1043,23 @@ C c(variadic(0 ? c : 0)); // no-crash } } // namespace variadic_function_arguments + +// CHECK: void testTransparentInitListExprs() +// CHECK: [B1] +// CHECK-NEXT: 1: getC +// CHECK-NEXT: 2: [B1.1] (ImplicitCastExpr, FunctionToPointerDecay, class transparent_init_list_exprs::C (*)(void)) +// CXX11-ELIDE-NEXT: 3: [B1.2]() (CXXRecordTypedCall, [B1.4], [B1.5]) +// CXX11-NOELIDE-NEXT: 3: [B1.2]() (CXXRecordTypedCall, [B1.4]) +// CXX11-NEXT: 4: [B1.3] +// CXX11-NEXT: 5: {[B1.4]} (CXXConstructExpr, [B1.6], class transparent_init_list_exprs::C) +// CXX11-NEXT: 6: transparent_init_list_exprs::C c{getC()}; +// CXX17-NEXT: 3: [B1.2]() (CXXRecordTypedCall, [B1.5]) +// CXX17-NEXT: 4: {[B1.3]} +// CXX17-NEXT: 5: transparent_init_list_exprs::C c{getC()}; +namespace transparent_init_list_exprs { +class C {}; +C getC(); +void testTransparentInitListExprs() { + C c{getC()}; +} +} // namespace transparent_init_list_exprs Index: cfe/trunk/test/Analysis/initializer.cpp =================================================================== --- cfe/trunk/test/Analysis/initializer.cpp +++ cfe/trunk/test/Analysis/initializer.cpp @@ -242,4 +242,22 @@ B &&bcr = C({{}}); // no-crash #endif } +} // namespace CXX17_aggregate_construction + +namespace CXX17_transparent_init_list_exprs { +class A {}; + +class B: private A {}; + +B boo(); +void foo1() { + B b { boo() }; // no-crash +} + +class C: virtual public A {}; + +C coo(); +void foo2() { + C c { coo() }; // no-crash } +} // namespace CXX17_transparent_init_list_exprs