Skip to content
This repository was archived by the owner on Oct 12, 2022. It is now read-only.

Commit 5c01e52

Browse files
committed
core.demangle: support template encoding without length prefix
1 parent 745853f commit 5c01e52

File tree

1 file changed

+12
-7
lines changed

1 file changed

+12
-7
lines changed

src/core/demangle.d

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)