libiberty: Demangle variadic template lambdas
Now we have templated lambdas, we can have variadic template lambdas, and this leads to lambda signatures containing parameter packs. But just like 'auto' inside such a signature, we don't have a containing template, and thus fail. The fix is to check is_lambda_arg, just as for a template parameter. This allows us to demangle g++'s manglings of such lambdas. It's not a totally accurate demangling, because we don't mangle the template head (that's a separate issue), but it is better than failing to demangle. Due to the way we print subexprs, we add an unnecessary parens around the argument of the pack. That's an orthogonal problem, for which the solution is to have better knowledge of operator precedence. libiberty/ * cp-demangle.c (d_print_comp_inner): Allow parameter packs in a lambda signature. * testsuite/demangle-expected: Add tests.
This commit is contained in:
parent
f7f4628054
commit
eb491ea5c1
2 changed files with 24 additions and 13 deletions
|
@ -348,7 +348,7 @@ struct d_print_info
|
|||
be bigger than MAX_RECURSION_COUNT. */
|
||||
int recursion;
|
||||
/* Non-zero if we're printing a lambda argument. A template
|
||||
parameter reference actually means 'auto'. */
|
||||
parameter reference actually means 'auto', a pack expansion means T... */
|
||||
int is_lambda_arg;
|
||||
/* The current index into any template argument packs we are using
|
||||
for printing, or -1 to print the whole pack. */
|
||||
|
@ -5930,9 +5930,10 @@ d_print_comp_inner (struct d_print_info *dpi, int options,
|
|||
|
||||
case DEMANGLE_COMPONENT_PACK_EXPANSION:
|
||||
{
|
||||
int len;
|
||||
int i;
|
||||
struct demangle_component *a = d_find_pack (dpi, d_left (dc));
|
||||
struct demangle_component *a = NULL;
|
||||
|
||||
if (!dpi->is_lambda_arg)
|
||||
a = d_find_pack (dpi, d_left (dc));
|
||||
if (a == NULL)
|
||||
{
|
||||
/* d_find_pack won't find anything if the only packs involved
|
||||
|
@ -5940,17 +5941,20 @@ d_print_comp_inner (struct d_print_info *dpi, int options,
|
|||
case, just print the pattern and "...". */
|
||||
d_print_subexpr (dpi, options, d_left (dc));
|
||||
d_append_string (dpi, "...");
|
||||
return;
|
||||
}
|
||||
|
||||
len = d_pack_length (a);
|
||||
dc = d_left (dc);
|
||||
for (i = 0; i < len; ++i)
|
||||
else
|
||||
{
|
||||
dpi->pack_index = i;
|
||||
d_print_comp (dpi, options, dc);
|
||||
if (i < len-1)
|
||||
d_append_string (dpi, ", ");
|
||||
int len = d_pack_length (a);
|
||||
int i;
|
||||
|
||||
dc = d_left (dc);
|
||||
for (i = 0; i < len; ++i)
|
||||
{
|
||||
if (i)
|
||||
d_append_string (dpi, ", ");
|
||||
dpi->pack_index = i;
|
||||
d_print_comp (dpi, options, dc);
|
||||
}
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
|
|
@ -1574,3 +1574,10 @@ initializer for module Foo.Bar
|
|||
|
||||
_ZGIW3FooWP3BarW3Baz
|
||||
initializer for module Foo:Bar.Baz
|
||||
|
||||
_ZZ2L1vENKUlDpT_E_clIJiPiEEEvS0_
|
||||
void L1()::{lambda((auto:1)...)#1}::operator()<int, int*>(int, int*) const
|
||||
|
||||
_ZZ2L1vENKUlDpT_E_clIJiPiEEEDaS0_
|
||||
auto L1()::{lambda((auto:1)...)#1}::operator()<int, int*>(int, int*) const
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue