[Bug c++/115245] Fails to demangle some concepts
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon May 27 10:09:26 GMT 2024
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115245
Jakub Jelinek <jakub at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Last reconfirmed| |2024-05-27
CC| |jakub at gcc dot gnu.org,
| |jason at gcc dot gnu.org
Status|UNCONFIRMED |NEW
Ever confirmed|0 |1
--- Comment #1 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I can't find the concept mangling in the Itanium mangling docs specified at
all.
The comments in cp/mangle.cc and cp-demangle.cc suggest it is
Q <constraint-expression>
where
constraint-expression: expression
r14-6064-gc3f281a0c1ca5 commit that started the corresponding ICE refers
to https://github.com/itanium-cxx-abi/cxx-abi/pull/166 but that doesn't seem to
define Q either.
Anyway, seems the d_expression in
static struct demangle_component *
d_maybe_constraints (struct d_info *di, struct demangle_component *dc)
{
if (d_peek_char (di) == 'Q')
{
d_advance (di, 1);
struct demangle_component *expr = d_expression (di);
fails (returns NULL).
After Q there is 3cstITL0__...
llvm-cxxfilt demangles this as
void Outer<void>::method<void>() requires cst<TL0_>::Inner::operator
new(unsigned long)
but that can't be right either, there is nothing called TL0_ in the source.
d_expression_1 parses the 3cst part and because of I following it calls
3542 if (d_peek_char (di) == 'I')
3543 return d_make_comp (di, DEMANGLE_COMPONENT_TEMPLATE, name,
3544 d_template_args (di));
The TL0__ part comes during mangling from write_template_param on
TEMPLATE_TYPE_PARM U
with level 2 and parm_index 1 (as it writes level - 1 that is the 0_ in there
and _
for parm_index).
Now, this 'L' part has been added there with r14-4544 of PR109422.
So, my guess is the bug is that r14-4544 didn't include corresponding changes
to the demangler,
/* <template-param> ::= T_
::= T <(parameter-2 non-negative) number> _
*/
static struct demangle_component *
d_template_param (struct d_info *di)
{
int param;
if (! d_check_char (di, 'T'))
return NULL;
param = d_compact_number (di);
if (param < 0)
return NULL;
return d_make_template_param (di, param);
}
can't handle the L with d_compact_number in there.
More information about the Gcc-bugs
mailing list