@@ -1483,21 +1483,21 @@ private struct Demangle
14831483 TemplateInstanceName:
14841484 Number __T LName TemplateArgs Z
14851485 */
1486- void parseTemplateInstanceName ()
1486+ void parseTemplateInstanceName (bool hasNumber )
14871487 {
14881488 debug (trace) printf( " parseTemplateInstanceName+\n " );
14891489 debug (trace) scope (success) printf( " parseTemplateInstanceName-\n " );
14901490
14911491 auto sav = pos;
14921492 scope (failure) pos = sav;
1493- auto n = decodeNumber();
1493+ auto n = hasNumber ? decodeNumber() : 0 ;
14941494 auto beg = pos;
14951495 match( " __T" );
14961496 parseLName();
14971497 put( " !(" );
14981498 parseTemplateArgs();
14991499 match( ' Z' );
1500- if ( pos - beg != n )
1500+ if ( hasNumber && pos - beg != n )
15011501 error( " Template name length mismatch" );
15021502 put( ' )' );
15031503 }
@@ -1532,6 +1532,11 @@ private struct Demangle
15321532 // TemplateInstanceName -> Number "__T"
15331533 switch ( front )
15341534 {
1535+ case ' _' :
1536+ // no length encoding for templates for new mangling
1537+ parseTemplateInstanceName(false );
1538+ return ;
1539+
15351540 case ' 0' : .. case ' 9' :
15361541 if ( mayBeTemplateInstanceName() )
15371542 {
@@ -1540,7 +1545,7 @@ private struct Demangle
15401545 try
15411546 {
15421547 debug (trace) printf( " may be template instance name\n " );
1543- parseTemplateInstanceName();
1548+ parseTemplateInstanceName(true );
15441549 return ;
15451550 }
15461551 catch ( ParseException e )
@@ -1589,12 +1594,12 @@ private struct Demangle
15891594 put( ' (' );
15901595 parseFuncArguments();
15911596 put( ' )' );
1592- if ( ! isDigit( front ) ) // voldemort types don't have a return type on the function
1597+ if ( ! isDigit( front ) && front != ' _ ' ) // voldemort types don't have a return type on the function
15931598 {
15941599 auto funclen = len;
15951600 parseType();
15961601
1597- if ( ! isDigit( front ) )
1602+ if ( ! isDigit( front ) && front != ' _ ' )
15981603 {
15991604 // not part of a qualified name, so back up
16001605 pos = prevpos;
@@ -1604,7 +1609,7 @@ private struct Demangle
16041609 len = funclen; // remove return type from qualified name
16051610 }
16061611 }
1607- } while ( isDigit ( front ) );
1612+ } while ( isDigit ( front ) || front == ' _ ' );
16081613 return dst[beg .. len];
16091614 }
16101615
0 commit comments