This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: __cxa_demangle


Analysis:

The code

struct G {
  int m(void) const { return 0; }
  int n(void) { return 0; }
};

void r(int (G::*)(void), int (G::*)(void) const, int (G::*)(void), int (G::*)(void) const)
{
  r(&G::n, &G::m, &G::n, &G::m);
}

gives, for 'r':

_Z1rM1GFivEMS_KFivES1_S3_

(g++-3.2)

So, it adds a substitution for "1G" and reuses
that in "M1GKFivE" to give "MS_KFivE".  Furthermore
it adds a substitution for "M1GFivE" and "MS_KFivE".

The current demangler code would expect "_Z1rM1GFivEMKS_FivES1_S4_"
Note the bump from "S3_" to "S4_".
And indeed, g++ version 3.0.4 produces the mangled name:

_Z1rM1GFivEMKS_FivES1_S4_

The needed change is therefore that previously
the following substitutions were created:

The first substitution:

DEMANGLER:     Entering decode_type("1GFivEMKS_FivES1_S4_")
DEMANGLER:       Output thus far: ""
DEMANGLER:       Entering decode_class_enum_type("1GFivEMKS_FivES1_S4_")
DEMANGLER:         Output thus far: ""
DEMANGLER:         Entering decode_name("1GFivEMKS_FivES1_S4_")
DEMANGLER:           Output thus far: ""
DEMANGLER:           Entering decode_unscoped_name("1GFivEMKS_FivES1_S4_")
DEMANGLER:             Output thus far: ""
DEMANGLER:             Entering decode_unqualified_name("1GFivEMKS_FivES1_S4_")
DEMANGLER:               Output thus far: ""
DEMANGLER:               Entering decode_source_name("1GFivEMKS_FivES1_S4_")
DEMANGLER:               Leaving decode_source_name [5; result: "G"]
DEMANGLER:             Leaving decode_unqualified_name [5; result: "G"]
DEMANGLER:           Leaving decode_unscoped_name [5; result: "G"]
DEMANGLER:         Leaving decode_name [5; result: "G"]
DEMANGLER:       Leaving decode_class_enum_type [5; result: "G"]
DEMANGLER:     Leaving decode_type [5; result: "G"]
DEMANGLER:     Adding substitution S_ : G (from demangler.h:1316 <- demangler.h:1084 <- demangler.h:1934).

And thus

        _Z1rM1GFivEMKS_FivES1_S4_
S_ ==        1G

The second and third substitution:

DEMANGLER:     Entering decode_bare_function_type("vEMKS_FivES1_S4_")
DEMANGLER:       Output thus far: "("
DEMANGLER:       Entering decode_type[with qualifiers]("vEMKS_FivES1_S4_")
DEMANGLER:         Output thus far: "("
DEMANGLER:         Entering decode_builtin_type("vEMKS_FivES1_S4_")
DEMANGLER:         Leaving decode_builtin_type [8; result: "void"]
DEMANGLER:       Leaving decode_type[with qualifiers] [8; result: "void"]
DEMANGLER:     Leaving decode_bare_function_type [8; result: "(void)"]
DEMANGLER:     Adding substitution S0_ : int ()(void) (from demangler.h:1390 <- demangler.h:1084 <- demangler.h:1934).
DEMANGLER:     Adding substitution S1_ : int (G::*)(void) (from demangler.h:1166 <- demangler.h:1391 <- demangler.h:1084).

And thus

        _Z1rM1GFivEMKS_FivES1_S4_
S0_ ==         FivE
S1_ ==      M1GFivE

The fourth and fifth substitution:

EMANGLER:     Entering decode_type("KS_FivES1_S4_")
DEMANGLER:       Output thus far: ""
DEMANGLER:       Entering decode_substitution("S_FivES1_S4_")
DEMANGLER:         Output thus far: ""
DEMANGLER:         Entering decode_type("1GFivEMKS_FivES1_S4_")
DEMANGLER:           Output thus far: ""
DEMANGLER:           Entering decode_class_enum_type("1GFivEMKS_FivES1_S4_")
DEMANGLER:             Output thus far: ""
DEMANGLER:             Entering decode_name("1GFivEMKS_FivES1_S4_")
DEMANGLER:               Output thus far: ""
DEMANGLER:               Entering decode_unscoped_name("1GFivEMKS_FivES1_S4_")
DEMANGLER:                 Output thus far: ""
DEMANGLER:                 Entering decode_unqualified_name("1GFivEMKS_FivES1_S4_")
DEMANGLER:                   Output thus far: ""
DEMANGLER:                   Entering decode_source_name("1GFivEMKS_FivES1_S4_")
DEMANGLER:                   Leaving decode_source_name [5; result: "G"]
DEMANGLER:                 Leaving decode_unqualified_name [5; result: "G"]
DEMANGLER:               Leaving decode_unscoped_name [5; result: "G"]
DEMANGLER:             Leaving decode_name [5; result: "G"]
DEMANGLER:           Leaving decode_class_enum_type [5; result: "G"]
DEMANGLER:         Leaving decode_type [5; result: "G"]
DEMANGLER:       Leaving decode_substitution [13; result: "G"]
DEMANGLER:     Leaving decode_type [13; result: "G"]
DEMANGLER:     Adding substitution S2_ : G const (from demangler.h:1316 <- demangler.h:1089 <- demangler.h:1934).
DEMANGLER:     Adding substitution S3_ : G const (from demangler.h:1166 <- demangler.h:1321 <- demangler.h:1089).

And thus

        _Z1rM1GFivEMKS_FivES1_S4_
S2_ ==              KS_
S3_ ==              KS_

The sixth substitution:

DEMANGLER:     Entering decode_bare_function_type("vES1_S4_")
DEMANGLER:       Output thus far: "("
DEMANGLER:       Entering decode_type[with qualifiers]("vES1_S4_")
DEMANGLER:         Output thus far: "("
DEMANGLER:         Entering decode_builtin_type("vES1_S4_")
DEMANGLER:         Leaving decode_builtin_type [16; result: "void"]
DEMANGLER:       Leaving decode_type[with qualifiers] [16; result: "void"]
DEMANGLER:     Leaving decode_bare_function_type [16; result: "(void)"]
DEMANGLER:     Adding substitution S4_ : int (G::*)(void) const (from demangler.h:1344 <- demangler.h:1089 <- demangler.h:1934).

And thus

        _Z1rM1GFivEMKS_FivES1_S4_
S4_ ==             MKS_FivE


I cannot succeed in letting g++ 3.2 produce a mangled name with S0_ and/or S2_ in it.
Therefore I can only guess that what drops out there is one of the
duplicates S2_ or S3_ (of g++ 3.0) and because the first one is very
general (the class of the member function, with qualifier), it must
be the second at demangler.h:1166 that is part of `decode_qualifiers'
because `decode_qualifiers' is not anymore called(?).  The call comes
from demangler.h:1321, together with demangler.h:1316 (S2_) the relevant
code, starting at line 1312 is:

1302:   case 'M':
1303:   {
1304:     eat_current();
1305:     qualifier_list<Allocator>* class_type_qualifiers = new qualifier_list<Allocator>(*this);
1306:     M_decoding_pointer_to_member_class_type = true;
1307:     std::basic_string<char, std::char_traits<char>, Allocator> class_type;
1308:     if (!decode_type(class_type, class_type_qualifiers) || !class_type_qualifiers->suppressed())
1309:     {
1310:       delete class_type_qualifiers;
1311:       failure = true;
1312:       break;
1313:     }
1314:     M_decoding_pointer_to_member_class_type = false;
1315:     if (M_str[start_pos + 1] != 'S' || M_str[start_pos + 2] == 't')
1316:       add_substitution(start_pos + 1, type);                                      // substitution: "<C>".
1317:     if (class_type_qualifiers->size() > 0)        // Must be CV-qualifiers and a member function pointer.
1318:     {
1319:       // <Q>M<Q2><C>F<R><B>E      ==> R (C::*Q)B Q2               "<C>", "<Q2><C>", "F<R><B>E" (<R> and <B> recursive), "M<Q2><C>F<R><B>E".
1320:       std::basic_string<char, std::char_traits<char>, Allocator> member_function_qualifiers;
1321:       class_type_qualifiers->decode_qualifiers(member_function_qualifiers);       // substitution(s): "<Q2><C>".
1322:       delete class_type_qualifiers;
1323:       if (eat_current() != 'F')
1324:       {
1325:         failure = true;
1326:         break;
1327:       }
1328:       // Return type.
1329:       // Constructors, destructors and conversion operators don't have a return type, but seem to never get here.
1330:       if (!decode_type(output))                                           // substitution: "F<R><B>E" (<R> and <B> recursive).
1331:       {
1332:         failure = true;
1333:         break;
1334:       }
1335:       output += " (";
1336:       output += class_type;
1337:       output += "::*";
1338:       std::basic_string<char, std::char_traits<char>, Allocator> bare_function_type;
1339:       if (!decode_bare_function_type(bare_function_type) || eat_current() != 'E')
1340:       {
1341:         failure = true;
1342:         break;
1343:       }
1344:       add_substitution(start_pos, type);                                  // substitution: "M<Q2><C>F<R><B>E".
1345:       qualifiers->decode_qualifiers(output);                              // substitution: all qualified types if any.
1346:       output += ")";
1347:       output += bare_function_type;
1348:       output += member_function_qualifiers;
1349:       goto decode_type_exit;
1350:     }
1351:     delete class_type_qualifiers;
1352:          qualifiers->add_qualifier_start(pointer_to_member, start_pos, class_type, M_inside_substitution);
1353:     continue;
1354:   }

And we can savely assume that the reason we (should) not come
at line 1321 is because now the 'if' at 1317 is always false.

In fact, the whole block from line 1317 till 1350 can drop out I assume.
This observation then allows me to fix the comment at line 1117, my
analysis of substitution.

// <Q>M<Q2><C>F<R><B>E  ==> R (C::*Q)B Q2               "<C>", "<Q2><C>", "F<R><B>E" (<R> and <B> recursive), "M<Q2><C>F<R><B>E".

becomes apparently

// <Q>M<C><Q2>F<R><B>E  ==> R (C::*Q)B Q2               "<C>", "F<R><B>E" (<R> and <B> recursive), "M<C><Q2>F<R><B>E".

Where the substitution "<Q2><C>" dropped out.

And then - as happens often, so no panic - I blacked out and awoke
a few hours later with the dead chicken still in my hand.  Testing
badly needed thus!

But well...

~/c++/demangler>dtd _Z1rM1GFivEMS_KFivES1_S3_ > troep 2>&1
DEMANGLER: Output thus far: ""
DEMANGLER: Entering decode_encoding("1rM1GFivEMS_KFivES1_S3_")
DEMANGLER: Output thus far: ""
DEMANGLER: Entering decode_special_name("1rM1GFivEMS_KFivES1_S3_")
DEMANGLER: Leaving decode_special_name[failure]
DEMANGLER: Output thus far: ""
DEMANGLER: Entering decode_name("1rM1GFivEMS_KFivES1_S3_")
DEMANGLER:   Output thus far: ""
DEMANGLER:   Entering decode_unscoped_name("1rM1GFivEMS_KFivES1_S3_")
DEMANGLER:     Output thus far: ""
DEMANGLER:     Entering decode_unqualified_name("1rM1GFivEMS_KFivES1_S3_")
DEMANGLER:       Output thus far: ""
DEMANGLER:       Entering decode_source_name("1rM1GFivEMS_KFivES1_S3_")
DEMANGLER:       Leaving decode_source_name [2; result: "r"]
DEMANGLER:     Leaving decode_unqualified_name [2; result: "r"]
DEMANGLER:   Leaving decode_unscoped_name [2; result: "r"]
DEMANGLER: Leaving decode_name [2; result: "r"]
DEMANGLER: Output thus far: "r"
DEMANGLER: Entering decode_bare_function_type("M1GFivEMS_KFivES1_S3_")
DEMANGLER:   Output thus far: "r("
DEMANGLER:   Entering decode_type[with qualifiers]("M1GFivEMS_KFivES1_S3_")
DEMANGLER:     Output thus far: ""
DEMANGLER:     Entering decode_type[with qualifiers]("1GFivEMS_KFivES1_S3_")
DEMANGLER:       Output thus far: ""
DEMANGLER:       Entering decode_class_enum_type("1GFivEMS_KFivES1_S3_")
DEMANGLER:         Output thus far: ""
DEMANGLER:         Entering decode_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:           Output thus far: ""
DEMANGLER:           Entering decode_unscoped_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:             Output thus far: ""
DEMANGLER:             Entering decode_unqualified_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:               Output thus far: ""
DEMANGLER:               Entering decode_source_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:               Leaving decode_source_name [5; result: "G"]
DEMANGLER:             Leaving decode_unqualified_name [5; result: "G"]
DEMANGLER:           Leaving decode_unscoped_name [5; result: "G"]
DEMANGLER:         Leaving decode_name [5; result: "G"]
DEMANGLER:       Leaving decode_class_enum_type [5; result: "G"]
DEMANGLER:       Adding substitution S_ : G (from demangler.h:1477 <- demangler.h:1312 <- demangler.h:1083).
DEMANGLER:     Leaving decode_type[with qualifiers] [5; result: "G"]
DEMANGLER:     Adding substitution S0_ : G (from demangler.h:1318 <- demangler.h:1083 <- demangler.h:1945).
DEMANGLER:     Output thus far: "r("
DEMANGLER:     Entering decode_type[with qualifiers]("ivEMS_KFivES1_S3_")
DEMANGLER:       Output thus far: "r("
DEMANGLER:       Entering decode_builtin_type("ivEMS_KFivES1_S3_")
DEMANGLER:       Leaving decode_builtin_type [7; result: "int"]
DEMANGLER:     Leaving decode_type[with qualifiers] [7; result: "int"]
DEMANGLER:     Output thus far: ""
DEMANGLER:     Entering decode_bare_function_type("vEMS_KFivES1_S3_")
DEMANGLER:       Output thus far: "("
DEMANGLER:       Entering decode_type[with qualifiers]("vEMS_KFivES1_S3_")
DEMANGLER:         Output thus far: "("
DEMANGLER:         Entering decode_builtin_type("vEMS_KFivES1_S3_")
DEMANGLER:         Leaving decode_builtin_type [8; result: "void"]
DEMANGLER:       Leaving decode_type[with qualifiers] [8; result: "void"]
DEMANGLER:     Leaving decode_bare_function_type [8; result: "(void)"]
DEMANGLER:     Adding substitution S1_ : int (G::*)(void) (from demangler.h:1357 <- demangler.h:1083 <- demangler.h:1945).
DEMANGLER:   Leaving decode_type[with qualifiers] [9; result: "int (G::*)(void)"]
DEMANGLER:   Output thus far: "r(int (G::*)(void), "
DEMANGLER:   Entering decode_type[with qualifiers]("MS_KFivES1_S3_")
DEMANGLER:     Output thus far: ""
DEMANGLER:     Entering decode_type[with qualifiers]("S_KFivES1_S3_")
DEMANGLER:       Output thus far: ""
DEMANGLER:       Entering decode_substitution("S_KFivES1_S3_")
DEMANGLER:         Output thus far: ""
DEMANGLER:         Entering decode_type("1GFivEMS_KFivES1_S3_")
DEMANGLER:           Output thus far: ""
DEMANGLER:           Entering decode_class_enum_type("1GFivEMS_KFivES1_S3_")
DEMANGLER:             Output thus far: ""
DEMANGLER:             Entering decode_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:               Output thus far: ""
DEMANGLER:               Entering decode_unscoped_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                 Output thus far: ""
DEMANGLER:                 Entering decode_unqualified_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                   Output thus far: ""
DEMANGLER:                   Entering decode_source_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                   Leaving decode_source_name [5; result: "G"]
DEMANGLER:                 Leaving decode_unqualified_name [5; result: "G"]
DEMANGLER:               Leaving decode_unscoped_name [5; result: "G"]
DEMANGLER:             Leaving decode_name [5; result: "G"]
DEMANGLER:           Leaving decode_class_enum_type [5; result: "G"]
DEMANGLER:         Leaving decode_type [5; result: "G"]
DEMANGLER:       Leaving decode_substitution [12; result: "G"]
DEMANGLER:     Leaving decode_type[with qualifiers] [12; result: "G"]
DEMANGLER:     Adding substitution S2_ : int ( const)(void) (from demangler.h:1171 <- demangler.h:1335 <- demangler.h:1088).
DEMANGLER:     Output thus far: "r(int (G::*)(void), "
DEMANGLER:     Entering decode_type[with qualifiers]("ivES1_S3_")
DEMANGLER:       Output thus far: "r(int (G::*)(void), "
DEMANGLER:       Entering decode_builtin_type("ivES1_S3_")
DEMANGLER:       Leaving decode_builtin_type [15; result: "int"]
DEMANGLER:     Leaving decode_type[with qualifiers] [15; result: "int"]
DEMANGLER:     Output thus far: ""
DEMANGLER:     Entering decode_bare_function_type("vES1_S3_")
DEMANGLER:       Output thus far: "("
DEMANGLER:       Entering decode_type[with qualifiers]("vES1_S3_")
DEMANGLER:         Output thus far: "("
DEMANGLER:         Entering decode_builtin_type("vES1_S3_")
DEMANGLER:         Leaving decode_builtin_type [16; result: "void"]
DEMANGLER:       Leaving decode_type[with qualifiers] [16; result: "void"]
DEMANGLER:     Leaving decode_bare_function_type [16; result: "(void)"]
DEMANGLER:     Adding substitution S3_ : int (G::*)(void) const (from demangler.h:1357 <- demangler.h:1088 <- demangler.h:1945).
DEMANGLER:   Leaving decode_type[with qualifiers] [17; result: "int (G::*)(void) const"]
DEMANGLER:   Output thus far: "r(int (G::*)(void), int (G::*)(void) const, "
DEMANGLER:   Entering decode_type[with qualifiers]("S1_S3_")
DEMANGLER:     Output thus far: "r(int (G::*)(void), int (G::*)(void) const, "
DEMANGLER:     Entering decode_substitution("S1_S3_")
DEMANGLER:       Output thus far: "r(int (G::*)(void), int (G::*)(void) const, "
DEMANGLER:       Entering decode_type("M1GFivEMS_KFivES1_S3_")
DEMANGLER:         Output thus far: ""
DEMANGLER:         Entering decode_type[with qualifiers]("1GFivEMS_KFivES1_S3_")
DEMANGLER:           Output thus far: ""
DEMANGLER:           Entering decode_class_enum_type("1GFivEMS_KFivES1_S3_")
DEMANGLER:             Output thus far: ""
DEMANGLER:             Entering decode_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:               Output thus far: ""
DEMANGLER:               Entering decode_unscoped_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                 Output thus far: ""
DEMANGLER:                 Entering decode_unqualified_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                   Output thus far: ""
DEMANGLER:                   Entering decode_source_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                   Leaving decode_source_name [5; result: "G"]
DEMANGLER:                 Leaving decode_unqualified_name [5; result: "G"]
DEMANGLER:               Leaving decode_unscoped_name [5; result: "G"]
DEMANGLER:             Leaving decode_name [5; result: "G"]
DEMANGLER:           Leaving decode_class_enum_type [5; result: "G"]
DEMANGLER:         Leaving decode_type[with qualifiers] [5; result: "G"]
DEMANGLER:         Output thus far: "r(int (G::*)(void), int (G::*)(void) const, "
DEMANGLER:         Entering decode_type[with qualifiers]("ivEMS_KFivES1_S3_")
DEMANGLER:           Output thus far: "r(int (G::*)(void), int (G::*)(void) const, "
DEMANGLER:           Entering decode_builtin_type("ivEMS_KFivES1_S3_")
DEMANGLER:           Leaving decode_builtin_type [7; result: "int"]
DEMANGLER:         Leaving decode_type[with qualifiers] [7; result: "int"]
DEMANGLER:         Output thus far: ""
DEMANGLER:         Entering decode_bare_function_type("vEMS_KFivES1_S3_")
DEMANGLER:           Output thus far: "("
DEMANGLER:           Entering decode_type[with qualifiers]("vEMS_KFivES1_S3_")
DEMANGLER:             Output thus far: "("
DEMANGLER:             Entering decode_builtin_type("vEMS_KFivES1_S3_")
DEMANGLER:             Leaving decode_builtin_type [8; result: "void"]
DEMANGLER:           Leaving decode_type[with qualifiers] [8; result: "void"]
DEMANGLER:         Leaving decode_bare_function_type [8; result: "(void)"]
DEMANGLER:       Leaving decode_type [9; result: "int (G::*)(void)"]
DEMANGLER:     Leaving decode_substitution [20; result: "int (G::*)(void)"]
DEMANGLER:   Leaving decode_type[with qualifiers] [20; result: "int (G::*)(void)"]
DEMANGLER:   Output thus far: "r(int (G::*)(void), int (G::*)(void) const, int (G::*)(void), "
DEMANGLER:   Entering decode_type[with qualifiers]("S3_")
DEMANGLER:     Output thus far: "r(int (G::*)(void), int (G::*)(void) const, int (G::*)(void), "
DEMANGLER:     Entering decode_substitution("S3_")
DEMANGLER:       Output thus far: "r(int (G::*)(void), int (G::*)(void) const, int (G::*)(void), "
DEMANGLER:       Entering decode_type("MS_KFivES1_S3_")
DEMANGLER:         Output thus far: ""
DEMANGLER:         Entering decode_type[with qualifiers]("S_KFivES1_S3_")
DEMANGLER:           Output thus far: ""
DEMANGLER:           Entering decode_substitution("S_KFivES1_S3_")
DEMANGLER:             Output thus far: ""
DEMANGLER:             Entering decode_type("1GFivEMS_KFivES1_S3_")
DEMANGLER:               Output thus far: ""
DEMANGLER:               Entering decode_class_enum_type("1GFivEMS_KFivES1_S3_")
DEMANGLER:                 Output thus far: ""
DEMANGLER:                 Entering decode_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                   Output thus far: ""
DEMANGLER:                   Entering decode_unscoped_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                     Output thus far: ""
DEMANGLER:                     Entering decode_unqualified_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                       Output thus far: ""
DEMANGLER:                       Entering decode_source_name("1GFivEMS_KFivES1_S3_")
DEMANGLER:                       Leaving decode_source_name [5; result: "G"]
DEMANGLER:                     Leaving decode_unqualified_name [5; result: "G"]
DEMANGLER:                   Leaving decode_unscoped_name [5; result: "G"]
DEMANGLER:                 Leaving decode_name [5; result: "G"]
DEMANGLER:               Leaving decode_class_enum_type [5; result: "G"]
DEMANGLER:             Leaving decode_type [5; result: "G"]
DEMANGLER:           Leaving decode_substitution [12; result: "G"]
DEMANGLER:         Leaving decode_type[with qualifiers] [12; result: "G"]
DEMANGLER:         Output thus far: "r(int (G::*)(void), int (G::*)(void) const, int (G::*)(void), "
DEMANGLER:         Entering decode_type[with qualifiers]("ivES1_S3_")
DEMANGLER:           Output thus far: "r(int (G::*)(void), int (G::*)(void) const, int (G::*)(void), "
DEMANGLER:           Entering decode_builtin_type("ivES1_S3_")
DEMANGLER:           Leaving decode_builtin_type [15; result: "int"]
DEMANGLER:         Leaving decode_type[with qualifiers] [15; result: "int"]
DEMANGLER:         Output thus far: ""
DEMANGLER:         Entering decode_bare_function_type("vES1_S3_")
DEMANGLER:           Output thus far: "("
DEMANGLER:           Entering decode_type[with qualifiers]("vES1_S3_")
DEMANGLER:             Output thus far: "("
DEMANGLER:             Entering decode_builtin_type("vES1_S3_")
DEMANGLER:             Leaving decode_builtin_type [16; result: "void"]
DEMANGLER:           Leaving decode_type[with qualifiers] [16; result: "void"]
DEMANGLER:         Leaving decode_bare_function_type [16; result: "(void)"]
DEMANGLER:       Leaving decode_type [17; result: "int (G::*)(void) const"]
DEMANGLER:     Leaving decode_substitution [23; result: "int (G::*)(void) const"]
DEMANGLER:   Leaving decode_type[with qualifiers] [23; result: "int (G::*)(void) const"]
DEMANGLER: Leaving decode_bare_function_type [23; result: "(int (G::*)(void), int (G::*)(void) const, int (G::*)(void), int (G::*)(void) const)"]
r(int (G::*)(void), int (G::*)(void) const, int (G::*)(void), int (G::*)(void) const)

Do the substitutions look ok to you?

S_  : G
S0_ : G
S1_ : int (G::*)(void)
S2_ : int ( const)(void)
S3_ : int (G::*)(void) const


While the output is ok now, I am not 100% sure what happened with
the substitutions :*).   As it is 2:45 am now, I'll send you a
new tar tomorrow (besides, you never know what what I might come
up with during the night; I code also in my sleep).

-- 
Carlo Wood <carlo@alinoe.com>


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]