libiberty: Demangling 'M' prefixes
authorNathan Sidwell <nathan@acm.org>
Fri, 30 Sep 2022 16:43:30 +0000 (09:43 -0700)
committerNathan Sidwell <nathan@acm.org>
Tue, 11 Oct 2022 11:39:50 +0000 (04:39 -0700)
The grammar for a lambda context can include <source-name> 'M', and we
were adding the component that generated to the substitution table
twice.  Just ignore the 'M' completely -- we'll already have done the
checks we need when we saw its predecessor.  A prefix cannot be the
last component of a nested name, so we do not need to check for that
case (although we could if we wanted to be more lenient).

libiberty/
* cp-demangle.c (d_prefix): 'M' components are not
(re-)added to the substitution table.
* testsuite/demangle-expected: Add tests.

libiberty/cp-demangle.c
libiberty/testsuite/demangle-expected

index 303bfbf..4beb4d2 100644 (file)
@@ -1609,12 +1609,10 @@ d_prefix (struct d_info *di, int substable)
        }
       else if (peek == 'M')
        {
-         /* Initializer scope for a lambda.  We don't need to represent
-            this; the normal code will just treat the variable as a type
-            scope, which gives appropriate output.  */
-         if (ret == NULL)
-           return NULL;
+         /* Initializer scope for a lambda.  We already added it as a
+            substitution candidate, don't do that again.  */
          d_advance (di, 1);
+         continue;
        }
       else
        {
index 90dd4a1..bd92b12 100644 (file)
@@ -1581,3 +1581,24 @@ 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
 
+_Z7captureIN4gvarMUlvE_EE7WrapperIT_EOS3_
+Wrapper<gvar::{lambda()#1}> capture<gvar::{lambda()#1}>(gvar::{lambda()#1}&&)
+
+_ZNK2L2MUlT_T0_E_clIifEEvS_S0_
+void L2::{lambda(auto:1, auto:2)#1}::operator()<int, float>(L2, int) const
+
+_ZNK1C1fMUlT_E_clIMS_iEEDaS1_
+auto C::f::{lambda(auto:1)#1}::operator()<int C::*>(int C::*) const
+
+_ZNK2L2MUlT_T0_E_clIifEEvS0_S1_
+void L2::{lambda(auto:1, auto:2)#1}::operator()<int, float>(int, float) const
+
+_ZNK1B2L3MUlT_T0_E_clIjdEEvS1_S2_
+void B::L3::{lambda(auto:1, auto:2)#1}::operator()<unsigned int, double>(unsigned int, double) const
+
+_Z3fooIN1qMUlvE_ENS0_UlvE0_EEiOT_OT0_
+int foo<q::{lambda()#1}, q::{lambda()#2}>(q::{lambda()#1}&&, q::{lambda()#2}&&)
+
+_ZNK2L1MUlDpT_E_clIJiPiEEEvS1_
+void L1::{lambda((auto:1)...)#1}::operator()<int, int*>(int, int*) const
+