Bug 77950 - GCC produces un-demanglable symbols with [] (auto&) { ... } lambdas in templates
Summary: GCC produces un-demanglable symbols with [] (auto&) { ... } lambdas in templates
Status: NEW
Alias: None
Product: gcc
Classification: Unclassified
Component: c++ (show other bugs)
Version: 6.2.1
: P3 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords: c++-lambda
Depends on:
Blocks: lambdas
  Show dependency treegraph
 
Reported: 2016-10-12 09:53 UTC by Jean-Michaël Celerier
Modified: 2022-03-11 00:32 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2016-10-12 00:00:00


Attachments
Preprocessed source exhibiting the bug (367.96 KB, application/x-xz)
2016-10-12 09:53 UTC, Jean-Michaël Celerier
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Jean-Michaël Celerier 2016-10-12 09:53:18 UTC
Created attachment 39793 [details]
Preprocessed source exhibiting the bug

My problem is in the attachement starting at line 135809, within the struct vec_merger_impl.

When I have this code : 

    template<int N>
    struct vec_merger_impl
    {
      template<typename Dataspace_T>
      ossia::value_with_unit operator()(const Dataspace_T& ds)
      {
        if(ds)
        {
          return eggs::variants::apply([&] (auto& unit) -> ossia::value_with_unit {
            return detail::vec_value_merger<N>{idx}(unit, val);
          }, ds);
        }
        return {};
      }
    };

The lambda [&] (auto& unit) ... produces undemanglable code, which makes the software undebuggable... doing "nm -a preprocessed.o | c++filt" fails at the following symbol : 

_ZN4eggs8variants6detail7forwardIOZN5ossia15vec_merger_implILi2EEclINS0_7variantIJNS3_12strong_valueINS3_11speed_ratioISt5ratioILl1ELl1EEEEEENS8_INS9_ISA_ILl16093440ELl36000000EEEEEENS8_INS9_ISA_ILl1000ELl3600EEEEEENS8_INS9_ISA_ILl1852ELl3600EEEEEENS8_INS9_ISA_ILl3048ELl10000EEEEEENS8_INS9_ISA_ILl3048ELl36000000EEEEEEEEEEENS7_IJNS3_5valueENS7_IJNS8_INS3_14distance_ratioISB_EEEENS8_INSV_ISA_ILl1000ELl1EEEEEENS8_INSV_ISA_ILl1ELl10EEEEEENS8_INSV_ISA_ILl1ELl100EEEEEENS8_INSV_ISA_ILl1ELl1000EEEEEENS8_INSV_ISA_ILl1ELl1000000EEEEEENS8_INSV_ISA_ILl1ELl1000000000EEEEEENS8_INSV_ISA_ILl1ELl1000000000000EEEEEENS8_INSV_ISA_ILl254ELl10000EEEEEENS8_INSV_ISN_EEEENS8_INSV_ISA_ILl16093440ELl10000EEEEEEEEENS7_IJNS8_INS3_14cartesian_3d_uEEENS8_INS3_14cartesian_2d_uEEENS8_INS3_11spherical_uEEENS8_INS3_7polar_uEEENS8_INS3_8opengl_uEEENS8_INS3_13cylindrical_uEEEEEEST_NS7_IJNS8_INS3_12quaternion_uEEENS8_INS3_7euler_uEEENS8_INS3_6axis_uEEEEEENS7_IJNS8_INS3_8degree_uEEENS8_INS3_8radian_uEEEEEENS7_IJNS8_INS3_6argb_uEEENS8_INS3_6rgba_uEEENS8_INS3_5rgb_uEEENS8_INS3_5bgr_uEEENS8_INS3_7argb8_uEEENS8_INS3_5hsv_uEEENS8_INS3_6cmy8_uEEENS8_INS3_5xyz_uEEEEEENS7_IJNS8_INS3_8linear_uEEENS8_INS3_10midigain_uEEENS8_INS3_9decibel_uEEENS8_INS3_13decibel_raw_uEEEEEEEEERKT_EUlRS38_E_EEOS38_RNSt16remove_referenceIS38_E4typeE

If I change my lambda by an equivalent functor (can be tested in the attached source by setting -DFIXED_VERSION, the code passes through c++filt (and GDB) without problems.
Comment 1 Markus Trippelsdorf 2016-10-12 10:25:31 UTC
Confirmed.

libcxxabi's demangler gives:

eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > >&& eggs::variants::detail::forward<eggs::variants::variant<ossia::value, eggs::variants::variant<ossia::strong_value<ossia::distance_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<1000l, 1l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<1l, 10l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<1l, 100l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<1l, 1000l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<1l, 1000000l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<1l, 1000000000l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<1l, 1000000000000l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<254l, 10000l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::distance_ratio<std::ratio<16093440l, 10000l> > > >, eggs::variants::variant<ossia::strong_value<ossia::cartesian_3d_u>, ossia::strong_value<ossia::cartesian_2d_u>, ossia::strong_value<ossia::spherical_u>, ossia::strong_value<ossia::polar_u>, ossia::strong_value<ossia::opengl_u>, ossia::strong_value<ossia::cylindrical_u> >, eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > >, eggs::variants::variant<ossia::strong_value<ossia::quaternion_u>, ossia::strong_value<ossia::euler_u>, ossia::strong_value<ossia::axis_u> >, eggs::variants::variant<ossia::strong_value<ossia::degree_u>, ossia::strong_value<ossia::radian_u> >, eggs::variants::variant<ossia::strong_value<ossia::argb_u>, ossia::strong_value<ossia::rgba_u>, ossia::strong_value<ossia::rgb_u>, ossia::strong_value<ossia::bgr_u>, ossia::strong_value<ossia::argb8_u>, ossia::strong_value<ossia::hsv_u>, ossia::strong_value<ossia::cmy8_u>, ossia::strong_value<ossia::xyz_u> >, eggs::variants::variant<ossia::strong_value<ossia::linear_u>, ossia::strong_value<ossia::midigain_u>, ossia::strong_value<ossia::decibel_u>, ossia::strong_value<ossia::decibel_raw_u> > > ossia::vec_merger_impl<2>::operator()<eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > > >(eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > > const&)::'lambda'(eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > >&)&&>(std::remove_reference<eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l>
> >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l>
> > > >::type&)

libiberty overflows the stack and Ian's Go demangler doesn't handle the symbol.
Comment 2 Ian Lance Taylor 2021-12-04 01:37:58 UTC
Just a note that my Go demangler does demangle this symbol now, producing

ossia::vec_merger_impl<2>::operator()<eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > > >(eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > > const&)::{lambda(auto:1&)#1}&& eggs::variants::detail::forward<ossia::vec_merger_impl<2>::operator()<eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > > >(eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > > const&)::{lambda(auto:1&)#1}&&>(std::remove_reference<ossia::vec_merger_impl<2>::operator()<eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > > >(eggs::variants::variant<ossia::strong_value<ossia::speed_ratio<std::ratio<1l, 1l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<16093440l, 36000000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1000l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<1852l, 3600l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 10000l> > >, ossia::strong_value<ossia::speed_ratio<std::ratio<3048l, 36000000l> > > > const&)::{lambda(auto:1&)#1}&&>::type&)