1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-08-14 11:45:38 +02:00

Using 'typename' in expressions, bug 227082.

This commit is contained in:
Markus Schorn 2008-04-15 07:35:01 +00:00
parent df92508705
commit 9594a52283
2 changed files with 16 additions and 18 deletions

View file

@ -4513,4 +4513,15 @@ public class AST2Tests extends AST2BaseTest {
parseAndCheckBindings(code, ParserLanguage.C, true); parseAndCheckBindings(code, ParserLanguage.C, true);
parseAndCheckBindings(code, ParserLanguage.CPP, true); parseAndCheckBindings(code, ParserLanguage.CPP, true);
} }
// template<typename T> class X {
// typename T::t func() {
// return typename T::t();
// }
// };
public void testTypenameInExpression() throws Exception {
final String code = getAboveComment();
parseAndCheckBindings(code, ParserLanguage.CPP);
}
} }

View file

@ -1319,7 +1319,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
switch (LT(1)) { switch (LT(1)) {
case IToken.t_typename: case IToken.t_typename:
int o = consume().getOffset(); int typenameOffset= consume().getOffset();
boolean templateTokenConsumed = false; boolean templateTokenConsumed = false;
if (LT(1) == IToken.t_template) { if (LT(1) == IToken.t_template) {
@ -1328,28 +1328,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
} }
ITokenDuple nestedName = name(); ITokenDuple nestedName = name();
IASTName name = createName(nestedName); IASTName name = createName(nestedName);
if (LT(1) != IToken.tLPAREN) {
consume(IToken.tLPAREN); throwBacktrack(nestedName.getFirstToken().getOffset(), nestedName.getLastToken().getEndOffset());
int lastOffset;
IASTExpression expressionList;
if (templateIdScopes.size() > 0) {
templateIdScopes.push(IToken.tLPAREN);
}
try {
expressionList = expression();
lastOffset = consume(IToken.tRPAREN).getEndOffset();
}
finally {
if (templateIdScopes.size() > 0) {
templateIdScopes.pop();
}
} }
ICPPASTTypenameExpression result = createTypenameExpression(); ICPPASTTypenameExpression result = createTypenameExpression();
((ASTNode) result).setOffsetAndLength(o, lastOffset - o); ((ASTNode) result).setOffsetAndLength(typenameOffset, nestedName.getLastToken().getEndOffset() - typenameOffset);
result.setIsTemplate(templateTokenConsumed); result.setIsTemplate(templateTokenConsumed);
result.setName(name); result.setName(name);
result.setInitialValue(expressionList);
firstExpression = result; firstExpression = result;
break; break;
// simple-type-specifier ( assignment-expression , .. ) // simple-type-specifier ( assignment-expression , .. )
@ -1396,6 +1382,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
firstExpression = specialCastExpression(ICPPASTCastExpression.op_const_cast); firstExpression = specialCastExpression(ICPPASTCastExpression.op_const_cast);
break; break;
case IToken.t_typeid: case IToken.t_typeid:
int lastOffset;
int so = consume().getOffset(); int so = consume().getOffset();
consume(IToken.tLPAREN); consume(IToken.tLPAREN);
if (templateIdScopes.size() > 0) { if (templateIdScopes.size() > 0) {