65 lines · cpp
1// RUN: %clang_cc1 -std=c++17 %s -emit-llvm -triple %itanium_abi_triple -o - | FileCheck %s2 3namespace LambdaContainingLocalClasses {4 5template <typename F>6void GH59734() {7 [&](auto param) {8 struct Guard {9 Guard() {10 // Check that we're able to create DeclRefExpr to param at this point.11 static_assert(__is_same(decltype(param), int), "");12 }13 ~Guard() {14 static_assert(__is_same(decltype(param), int), "");15 }16 operator decltype(param)() {17 return decltype(param)();18 }19 };20 Guard guard;21 param = guard;22 }(42);23}24 25// Guard::Guard():26// CHECK-DAG: define {{.*}} @_ZZZN28LambdaContainingLocalClasses7GH59734IiEEvvENKUlT_E_clIiEEDaS1_EN5GuardC2Ev27// Guard::operator int():28// CHECK-DAG: define {{.*}} @_ZZZN28LambdaContainingLocalClasses7GH59734IiEEvvENKUlT_E_clIiEEDaS1_EN5GuardcviEv29// Guard::~Guard():30// CHECK-DAG: define {{.*}} @_ZZZN28LambdaContainingLocalClasses7GH59734IiEEvvENKUlT_E_clIiEEDaS1_EN5GuardD2Ev31 32struct S {};33 34template <class T = void>35auto GH132208 = [](auto param) {36 struct OnScopeExit {37 OnScopeExit() {38 static_assert(__is_same(decltype(param), S), "");39 }40 ~OnScopeExit() {41 static_assert(__is_same(decltype(param), S), "");42 }43 operator decltype(param)() {44 return decltype(param)();45 }46 } pending;47 48 param = pending;49};50 51void bar() {52 GH59734<int>();53 54 GH132208<void>(S{});55}56 57// OnScopeExit::OnScopeExit():58// CHECK-DAG: define {{.*}} @_ZZNK28LambdaContainingLocalClasses8GH132208IvEMUlT_E_clINS_1SEEEDaS2_EN11OnScopeExitC2Ev59// OnScopeExit::operator S():60// CHECK-DAG: define {{.*}} @_ZZNK28LambdaContainingLocalClasses8GH132208IvEMUlT_E_clINS_1SEEEDaS2_EN11OnScopeExitcvS5_Ev61// OnScopeExit::~OnScopeExit():62// CHECK-DAG: define {{.*}} @_ZZNK28LambdaContainingLocalClasses8GH132208IvEMUlT_E_clINS_1SEEEDaS2_EN11OnScopeExitD2Ev63 64} // namespace LambdaContainingLocalClasses65