https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67268
Henning Meyer <hmeyer.eu at gmail dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |hmeyer.eu at gmail dot com
--- Comment #2 from Henning Meyer <hmeyer.eu at gmail dot com> ---
This bug still exists in GCC 15.
I noticed when creating a std::thread
_ZNSt6threadC1IRFvvEJEvEEOT_DpOT0_ demangles to "std::thread::thread<void
(&)(), , void>(void (&)())"
The simplest example is
template<typename... Args, typename = void>
void funk(Args&&... ) {}
which when called as funk();
mangles to
_Z4funkIJEvEvDpOT_
which demangles to "void funk<, void>()"
For a templated function or method, a template parameter pack may be followed
by further template arguments, including more packs, possibly empty.
When I build the standalone demangler in libiberty, I get this parse tree
./a.out -v _Z4funkIJEvEvDpOT_
typed name
template
name 'funk'
template argument list
template argument list
template argument list
builtin type void
function type
builtin type void
argument list
pack expansion
rvalue reference
template parameter 0
void funk<, void>()
which is not what I would expect. I would expect
typed name
template
name 'funk'
template argument list
template argument list
builtin type void
for a template argument list consisting of an empty pack and the type void.
Which indicates to me that the bug is in the parsing logic and not in the
formatting logic.