[Bug demangler/96143] New: C++ demangler should not add a lambda as a substitution

ian at airs dot com gcc-bugzilla@gcc.gnu.org
Fri Jul 10 04:27:30 GMT 2020


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

            Bug ID: 96143
           Summary: C++ demangler should not add a lambda as a
                    substitution
           Product: gcc
           Version: 11.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: demangler
          Assignee: unassigned at gcc dot gnu.org
          Reporter: ian at airs dot com
  Target Milestone: ---

The C++ demangler adds a lambda as a substitution in d_lambda in
libiberty/cp-demangle.c.  However, the C++ compiler does not add a lambda as a
substitution in write_closure_type_name in cp/mangle.c.  According to
https://codesourcery.com/cxx-abi, the compiler is correct and the demangler is
not.

Here is a test case that shows the problem:

template<typename F>
struct A {
  typedef int X;
};

template<typename F>
inline typename A<F>::X
F2(F f) {
  return 0;
}

void F() {
  F2([]{});
}

This produces the symbol _Z2F2IZ1FvEUlvE_EN1AIT_E1XES2_, which is the type of
F2 instantiated with a lambda.  Currently the demangler demangles this as

A<F()::{lambda()#1}>::X F2<F()::{lambda()#1}>(A)

Note the final (A).  That does not make sense.  The argument type of F2 is not
A, which doesn't even make sense by itself.  The argument type is a lambda.

Compare to the output of llvm-cxxfilt:

A<F()::'lambda'()>::X F2<F()::'lambda'()>(F()::'lambda'())

Here the argument is correctly shown as a lambda.

I can send a patch.


More information about the Gcc-bugs mailing list