// RUN: %clang_cc1 -std=c++17 %s -emit-llvm -triple %itanium_abi_triple -o - | FileCheck %s namespace LambdaContainingLocalClasses { template void GH59734() { [&](auto param) { struct Guard { Guard() { // Check that we're able to create DeclRefExpr to param at this point. static_assert(__is_same(decltype(param), int), ""); } ~Guard() { static_assert(__is_same(decltype(param), int), ""); } operator decltype(param)() { return decltype(param)(); } }; Guard guard; param = guard; }(42); } // Guard::Guard(): // CHECK-DAG: define {{.*}} @_ZZZN28LambdaContainingLocalClasses7GH59734IiEEvvENKUlT_E_clIiEEDaS1_EN5GuardC2Ev // Guard::operator int(): // CHECK-DAG: define {{.*}} @_ZZZN28LambdaContainingLocalClasses7GH59734IiEEvvENKUlT_E_clIiEEDaS1_EN5GuardcviEv // Guard::~Guard(): // CHECK-DAG: define {{.*}} @_ZZZN28LambdaContainingLocalClasses7GH59734IiEEvvENKUlT_E_clIiEEDaS1_EN5GuardD2Ev struct S {}; template auto GH132208 = [](auto param) { struct OnScopeExit { OnScopeExit() { static_assert(__is_same(decltype(param), S), ""); } ~OnScopeExit() { static_assert(__is_same(decltype(param), S), ""); } operator decltype(param)() { return decltype(param)(); } } pending; param = pending; }; void bar() { GH59734(); GH132208(S{}); } // OnScopeExit::OnScopeExit(): // CHECK-DAG: define {{.*}} @_ZZNK28LambdaContainingLocalClasses8GH132208IvEMUlT_E_clINS_1SEEEDaS2_EN11OnScopeExitC2Ev // OnScopeExit::operator S(): // CHECK-DAG: define {{.*}} @_ZZNK28LambdaContainingLocalClasses8GH132208IvEMUlT_E_clINS_1SEEEDaS2_EN11OnScopeExitcvS5_Ev // OnScopeExit::~OnScopeExit(): // CHECK-DAG: define {{.*}} @_ZZNK28LambdaContainingLocalClasses8GH132208IvEMUlT_E_clINS_1SEEEDaS2_EN11OnScopeExitD2Ev } // namespace LambdaContainingLocalClasses