https://gcc.gnu.org/bugzilla/show_bug.cgi?id=117578

            Bug ID: 117578
           Summary: cxa_demangle cannot deal with long names
           Product: gcc
           Version: 15.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: jengelh at inai dot de
  Target Milestone: ---

Version: gcc version 15.0.0 20241111 (experimental) (SUSE Linux) 


== Input (x.cpp) ==

template<const char *...> struct FFF { unsigned int memb = 0; };
struct HHH {
        HHH();
        static constexpr char spicyeight[] = "";
        FFF<
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight
        > id;
};
HHH::HHH() {}


== Observed output ==

g++ -c x.cpp
nm -C x.o
0000000000000000 W _ZN3FFFIJXadL_ZN3HHH10spicyeigh...
...
0000000000000000 T HHH::HHH()


== Expected output ==

0000000000000000 W FFF<<anonymous> >::FFF() [with const char* ...<anonymous> =
{(& HHH::spicyeight)...}]

To verify that my /usr/bin/nm isn't having a too-old copy of cp-demangle, let's
invoke cxa_demangle from the current g++ libstdc++ directly:


== Input (y.cpp) ==

#include <cstdio>
#include <cxxabi.h>
template<const char *...> struct FFF {
        FFF() { printf("Pretty: %s\n", __PRETTY_FUNCTION__); }
        unsigned int memb = 0;
};
struct HHH {
        HHH();
        static constexpr char spicyeight[] = "";
        FFF<
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight, spicyeight, spicyeight, spicyeight, spicyeight,
                spicyeight
        > id;
};
HHH::HHH() {}
int main()
{
        HHH h;
        char buf[1024];
        size_t bufsize = sizeof(buf);
        int status = 0;
       
__cxxabiv1::__cxa_demangle("_ZN3FFFIJXadL_ZN3HHH10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEXadL_ZNS0_10spicyeightEEEEEC1Ev",
                buf, &bufsize, &status);
        printf("Via demangle: %s (%d)\n", buf, status);
}

== Observed ==

Pretty: FFF<<anonymous> >::FFF() [with const .....
Via demangle:  (-2)

Reply via email to