From: Nathan Sidwell Date: Tue, 26 Sep 2017 02:38:12 +0000 (+0000) Subject: re PR demangler/82195 (Undemangleable lambda) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=68aac47f3a4c310890099e67ba239b7dee05bd2c;p=gcc.git re PR demangler/82195 (Undemangleable lambda) PR demangler/82195 * cp-demangle.c (d_encoding): Strip return type when name is a LOCAL_NAME. (d_local_name): Strip return type of enclosing TYPED_NAME. * testsuite/demangle-expected: Add and adjust tests. From-SVN: r253186 --- diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog index 1c92338d33b..ecbf3e7d41d 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,11 @@ +2017-09-25 Nathan Sidwell + + PR demangler/82195 + * cp-demangle.c (d_encoding): Strip return type when name is a + LOCAL_NAME. + (d_local_name): Strip return type of enclosing TYPED_NAME. + * testsuite/demangle-expected: Add and adjust tests. + 2017-09-21 Nathan Sidwell PR demangler/82195 diff --git a/libiberty/cp-demangle.c b/libiberty/cp-demangle.c index ae3469d08b2..8e643472317 100644 --- a/libiberty/cp-demangle.c +++ b/libiberty/cp-demangle.c @@ -1338,8 +1338,18 @@ d_encoding (struct d_info *di, int top_level) ftype = d_bare_function_type (di, has_return_type (dc)); if (ftype) - dc = d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, - dc, ftype); + { + /* If this is a non-top-level local-name, clear the + return type, so it doesn't confuse the user by + being confused with the return type of whaever + this is nested within. */ + if (!top_level && dc->type == DEMANGLE_COMPONENT_LOCAL_NAME + && ftype->type == DEMANGLE_COMPONENT_FUNCTION_TYPE) + d_left (ftype) = NULL; + + dc = d_make_comp (di, DEMANGLE_COMPONENT_TYPED_NAME, + dc, ftype); + } else dc = NULL; } @@ -3621,6 +3631,13 @@ d_local_name (struct d_info *di) name = d_make_default_arg (di, num, name); } + /* Elide the return type of the containing function so as to not + confuse the user thinking it is the return type of whatever local + function we might be containing. */ + if (function->type == DEMANGLE_COMPONENT_TYPED_NAME + && d_right (function)->type == DEMANGLE_COMPONENT_FUNCTION_TYPE) + d_left (d_right (function)) = NULL; + return d_make_comp (di, DEMANGLE_COMPONENT_LOCAL_NAME, function, name); } diff --git a/libiberty/testsuite/demangle-expected b/libiberty/testsuite/demangle-expected index 993435fb0ac..b62561c6d4d 100644 --- a/libiberty/testsuite/demangle-expected +++ b/libiberty/testsuite/demangle-expected @@ -3817,14 +3817,14 @@ C::f # Another case where we got member function qualifiers wrong. --format=gnu-v3 --no-params _ZZ3BBdI3FooEvvENK3Fob3FabEv -void BBd()::Fob::Fab() const -void BBd()::Fob::Fab +BBd()::Fob::Fab() const +BBd()::Fob::Fab # # The same idea one level deeper. --format=gnu-v3 --no-params _ZZZ3BBdI3FooEvvENK3Fob3FabEvENK3Gob3GabEv -void BBd()::Fob::Fab() const::Gob::Gab() const -void BBd()::Fob::Fab() const::Gob::Gab +BBd()::Fob::Fab() const::Gob::Gab() const +BBd()::Fob::Fab() const::Gob::Gab # # Yet another member function qualifier problem. --format=gnu-v3 --no-params @@ -4445,7 +4445,7 @@ void f() # https://sourceware.org/bugzilla/show_bug.cgi?id=14963#c3 --format=gnu-v3 _ZSt7forwardIRN1x14refobjiteratorINS0_3refINS0_4mime30multipart_section_processorObjIZ15get_body_parserIZZN14mime_processor21make_section_iteratorERKNS2_INS3_10sectionObjENS0_10ptrrefBaseEEEbENKUlvE_clEvEUlSB_bE_ZZNS6_21make_section_iteratorESB_bENKSC_clEvEUlSB_E0_ENS1_INS2_INS0_20outputrefiteratorObjIiEES8_EEEERKSsSB_OT_OT0_EUlmE_NS3_32make_multipart_default_discarderISP_EEEES8_EEEEEOT_RNSt16remove_referenceISW_E4typeE -x::refobjiterator, x::ptrrefBase> > get_body_parser const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}>(std::string const&, x::ref const&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&> >, x::ptrrefBase> >& std::forward, x::ptrrefBase> > get_body_parser const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}>(std::string const&, x::ref const&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&> >, x::ptrrefBase> >&>(std::remove_reference, x::ptrrefBase> > get_body_parser const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}>(std::string const&, x::ref const&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&> > >::type&) +x::refobjiterator const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}>(std::string const&, x::ref const&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&> >, x::ptrrefBase> >& std::forward const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}>(std::string const&, x::ref const&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&> >, x::ptrrefBase> >&>(std::remove_reference const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}>(std::string const&, x::ref const&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&, mime_processor::make_section_iterator(x::ref const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&)#2}&&)::{lambda(unsigned long)#1}, x::mime::make_multipart_default_discarder const&, bool)::{lambda()#1}::operator()() const::{lambda(x::ref const&, bool)#1}&&> > >::type&) # --format=gnu-v3 --no-params _ZNK7strings8internal8SplitterINS_9delimiter5AnyOfENS_9SkipEmptyEEcvT_ISt6vectorI12basic_stringIcSt11char_traitsIcESaIcEESaISD_EEvEEv @@ -4469,28 +4469,28 @@ A::operator C # https://sourceware.org/bugzilla/show_bug.cgi?id=14963#c16 --format=gnu-v3 _ZN3mdr16in_cached_threadIRZNK4cudr6GPUSet17parallel_for_eachIZN5tns3d20shape_representation7compute7GPUImpl7executeERKNS_1AINS_7ptr_refIKjEELl3ELl3ENS_8c_strideILl1ELl0EEEEERKNS8_INS9_IjEELl4ELl1ESD_EEEUliRKNS1_7ContextERNS7_5StateEE_JSt6vectorISO_SaISO_EEEEEvOT_DpRT0_EUlSP_E_JSt17reference_wrapperISO_EEEENS_12ScopedFutureIDTclfp_spcl7forwardISW_Efp0_EEEEESV_DpOSW_ -mdr::ScopedFuture, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&>)({parm#2}))...))> mdr::in_cached_thread, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(void cudr::GPUSet::parallel_for_each, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&, std::reference_wrapper >(void cudr::GPUSet::parallel_for_each, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&, (void cudr::GPUSet::parallel_for_each, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&&&)...) +mdr::ScopedFuture, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&>)({parm#2}))...))> mdr::in_cached_thread, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(cudr::GPUSet::parallel_for_each, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&, std::reference_wrapper >(cudr::GPUSet::parallel_for_each, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&, (cudr::GPUSet::parallel_for_each, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}, std::vector > >(tns3d::shape_representation::compute::GPUImpl::execute(mdr::A, 3l, 3l, mdr::c_stride<1l, 0l> > const&, mdr::A, 4l, 1l, mdr::c_stride<1l, 0l> > const&)::{lambda(int, cudr::Context const&, tns3d::shape_representation::compute::GPUImpl::State&)#1}&&, std::vector >&) const::{lambda(tns3d::shape_representation::compute::GPUImpl::State&)#1}&&&)...) # https://sourceware.org/bugzilla/show_bug.cgi?id=14963#c18 --format=gnu-v3 _ZNSt9_Any_data9_M_accessIPZN13ThreadManager10futureTaskISt5_BindIFSt7_Mem_fnIM6RunnerFvvEEPS5_EEEEvOT_EUlvE_EERSC_v -void ThreadManager::futureTask (Runner*)> >(std::_Bind (Runner*)>&&)::{lambda()#1}*& std::_Any_data::_M_access (Runner*)> >(void ThreadManager::futureTask (Runner*)> >(std::_Bind (Runner*)>&&)::{lambda()#1}*&&)::{lambda()#1}*>() +ThreadManager::futureTask (Runner*)> >(std::_Bind (Runner*)>&&)::{lambda()#1}*& std::_Any_data::_M_access (Runner*)> >(ThreadManager::futureTask (Runner*)> >(std::_Bind (Runner*)>&&)::{lambda()#1}*&&)::{lambda()#1}*>() # https://sourceware.org/bugzilla/show_bug.cgi?id=14963#c24 # aka https://sourceware.org/bugzilla/show_bug.cgi?id=16593 --format=gnu-v3 _ZNSt9_Any_data9_M_accessIPZN3sel8Selector6SetObjI3FooJPKcMS4_FviEEEEvRT_DpT0_EUlvE_EESA_v -void sel::Selector::SetObj(Foo&, char const*, void (Foo::*)(int))::{lambda()#1}*& std::_Any_data::_M_access(void sel::Selector::SetObj(Foo&, char const*, void (Foo::*)(int))::{lambda()#1}*&, char const*, void (Foo::*)(int))::{lambda()#1}*>() +sel::Selector::SetObj(Foo&, char const*, void (Foo::*)(int))::{lambda()#1}*& std::_Any_data::_M_access(sel::Selector::SetObj(Foo&, char const*, void (Foo::*)(int))::{lambda()#1}*&, char const*, void (Foo::*)(int))::{lambda()#1}*>() # https://sourceware.org/bugzilla/show_bug.cgi?id=16752#c1 --format=gnu-v3 _ZNSt9_Any_data9_M_accessIPZN13ThreadManager7newTaskIRSt5_BindIFSt7_Mem_fnIM5DiaryFivEEPS5_EEIEEESt6futureINSt9result_ofIFT_DpT0_EE4typeEEOSF_DpOSG_EUlvE_EERSF_v -std::future (Diary*)>& ()>::type> ThreadManager::newTask (Diary*)>&>(std::_Bind (Diary*)>&)::{lambda()#1}*& std::_Any_data::_M_access (Diary*)>& ()>::type> ThreadManager::newTask (Diary*)>&>(std::future (Diary*)>& ()>::type> ThreadManager::newTask (Diary*)>&>(std::_Bind (Diary*)>&)::{lambda()#1}*&&)::{lambda()#1}*>() +ThreadManager::newTask (Diary*)>&>(std::_Bind (Diary*)>&)::{lambda()#1}*& std::_Any_data::_M_access (Diary*)>&>(ThreadManager::newTask (Diary*)>&>(std::_Bind (Diary*)>&)::{lambda()#1}*&&)::{lambda()#1}*>() # https://sourceware.org/bugzilla/show_bug.cgi?id=16752#c6 --format=gnu-v3 _ZNSt9_Any_data9_M_accessIPZN6cereal18polymorphic_detail15getInputBindingINS1_16JSONInputArchiveEEENS1_6detail15InputBindingMapIT_E11SerializersERS7_jEUlPvRSt10unique_ptrIvNS5_12EmptyDeleterIvEEEE0_EESA_v -cereal::detail::InputBindingMap::Serializers cereal::polymorphic_detail::getInputBinding(cereal::JSONInputArchive&, unsigned int)::{lambda(void*, std::unique_ptr >&)#2}*& std::_Any_data::_M_access::Serializers cereal::polymorphic_detail::getInputBinding(cereal::detail::InputBindingMap::Serializers cereal::polymorphic_detail::getInputBinding(cereal::JSONInputArchive&, unsigned int)::{lambda(void*, std::unique_ptr >&)#2}*&, unsigned int)::{lambda(void*, std::unique_ptr >&)#2}*>() +cereal::polymorphic_detail::getInputBinding(cereal::JSONInputArchive&, unsigned int)::{lambda(void*, std::unique_ptr >&)#2}*& std::_Any_data::_M_access(cereal::polymorphic_detail::getInputBinding(cereal::JSONInputArchive&, unsigned int)::{lambda(void*, std::unique_ptr >&)#2}*&, unsigned int)::{lambda(void*, std::unique_ptr >&)#2}*>() # https://sourceware.org/bugzilla/show_bug.cgi?id=16845#c2 --format=gnu-v3 _ZNSt9_Any_data9_M_accessIPZ4postISt8functionIFvvEEEvOT_EUlvE_EERS5_v -void post >(std::function&&)::{lambda()#1}*& std::_Any_data::_M_access >(void post >(std::function&&)::{lambda()#1}*&&)::{lambda()#1}*>() +post >(std::function&&)::{lambda()#1}*& std::_Any_data::_M_access >(post >(std::function&&)::{lambda()#1}*&&)::{lambda()#1}*>() # --format=auto --no-params _Z3xxxDFyuVb @@ -4525,7 +4525,7 @@ void function_temp(A) # --format=gnu-v3 _Z7ZipWithI7QStringS0_5QListZN4oral6detail16AdaptCreateTableI7AccountEES0_RKNS3_16CachedFieldsDataEEUlRKS0_SA_E_ET1_IDTclfp1_cvT__EcvT0__EEEERKT1_ISC_ERKT1_ISD_ET2_ -QList ZipWith(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}>(QList(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}> const&, QList const&, QString oral::detail::AdaptCreateTable(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}) +QList ZipWith(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}>(QList(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}> const&, QList const&, oral::detail::AdaptCreateTable(oral::detail::CachedFieldsData const&)::{lambda(QString const&, QString const&)#1}) # # These three are symbols generated by g++'s testsuite, which triggered the same bug as above. --format=gnu-v3 @@ -4665,7 +4665,7 @@ _Z3eatIPiZ3FoovEUlPT_PT0_E4_EvRS1_RS3_ void eat(int*&, Foo()::{lambda(auto:1*, auto:2*)#6}&) _Z3eatIPiZ3BarIsEvvEUlPsPT_PT0_E0_EvRS3_RS5_ -void eat()::{lambda(short*, auto:1*, auto:2*)#2}>(int*&, void Bar()::{lambda(short*, auto:1*, auto:2*)#2}&) +void eat()::{lambda(short*, auto:1*, auto:2*)#2}>(int*&, Bar()::{lambda(short*, auto:1*, auto:2*)#2}&) # PR 77489 _ZZ3foovE8localVar_9 @@ -4739,19 +4739,28 @@ __thunk_4294967297__$_1x # demangler/82195 members of lambdas --no-params _ZZZ3FoovENKUlT_E_clIiEEfS_EN5Local2fnEv -float Foo()::{lambda(auto:1)#1}::operator()(int) const::Local::fn() -float Foo()::{lambda(auto:1)#1}::operator()(int) const::Local::fn +Foo()::{lambda(auto:1)#1}::operator()(int) const::Local::fn() +Foo()::{lambda(auto:1)#1}::operator()(int) const::Local::fn --no-params _Z7CaptureIZZ3FoovENKUlT_E_clIiEEvS0_EUlvE_EvOS0_ -void Capture(int) const::{lambda()#1}>(void Foo()::{lambda(auto:1)#1}::operator()(int) const::{lambda()#1}&&) -Capture(int) const::{lambda()#1}> +void Capture(int) const::{lambda()#1}>(Foo()::{lambda(auto:1)#1}::operator()(int) const::{lambda()#1}&&) +Capture(int) const::{lambda()#1}> --no-params _Z4FrobIZZ3FoovENKUlT_E_clIiEEvS0_EUlvE_Evv -void Frob(int) const::{lambda()#1}>() -Frob(int) const::{lambda()#1}> -# +void Frob(int) const::{lambda()#1}>() +Frob(int) const::{lambda()#1}> # A lambda {local-class::member-fn} --no-params _ZZ3FoovENKUlT_E_clIiEEfS_ float Foo()::{lambda(auto:1)#1}::operator()(int) const Foo()::{lambda(auto:1)#1}::operator() +# template-fn {local-class::member-fn} +--no-params +_ZZ3FooIiEfvEN1X2fnEv +Foo()::X::fn() +Foo()::X::fn +# template-fn generic-lambda local-class::member-fn +--no-params +_ZZZ3FooIiEfvENKUlT_E_clIcEEDaS0_EN1X2fnEv +Foo()::{lambda(auto:1)#1}::operator()(char) const::X::fn() +Foo()::{lambda(auto:1)#1}::operator()(char) const::X::fn