mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-08-13 11:15:38 +02:00
Using 'typename' in expressions, bug 227082.
This commit is contained in:
parent
df92508705
commit
9594a52283
2 changed files with 16 additions and 18 deletions
|
@ -4513,4 +4513,15 @@ public class AST2Tests extends AST2BaseTest {
|
|||
parseAndCheckBindings(code, ParserLanguage.C, 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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1319,7 +1319,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
|
||||
switch (LT(1)) {
|
||||
case IToken.t_typename:
|
||||
int o = consume().getOffset();
|
||||
int typenameOffset= consume().getOffset();
|
||||
|
||||
boolean templateTokenConsumed = false;
|
||||
if (LT(1) == IToken.t_template) {
|
||||
|
@ -1328,28 +1328,14 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
}
|
||||
ITokenDuple nestedName = name();
|
||||
IASTName name = createName(nestedName);
|
||||
|
||||
consume(IToken.tLPAREN);
|
||||
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();
|
||||
}
|
||||
if (LT(1) != IToken.tLPAREN) {
|
||||
throwBacktrack(nestedName.getFirstToken().getOffset(), nestedName.getLastToken().getEndOffset());
|
||||
}
|
||||
|
||||
ICPPASTTypenameExpression result = createTypenameExpression();
|
||||
((ASTNode) result).setOffsetAndLength(o, lastOffset - o);
|
||||
((ASTNode) result).setOffsetAndLength(typenameOffset, nestedName.getLastToken().getEndOffset() - typenameOffset);
|
||||
result.setIsTemplate(templateTokenConsumed);
|
||||
result.setName(name);
|
||||
result.setInitialValue(expressionList);
|
||||
firstExpression = result;
|
||||
break;
|
||||
// simple-type-specifier ( assignment-expression , .. )
|
||||
|
@ -1396,6 +1382,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser {
|
|||
firstExpression = specialCastExpression(ICPPASTCastExpression.op_const_cast);
|
||||
break;
|
||||
case IToken.t_typeid:
|
||||
int lastOffset;
|
||||
int so = consume().getOffset();
|
||||
consume(IToken.tLPAREN);
|
||||
if (templateIdScopes.size() > 0) {
|
||||
|
|
Loading…
Add table
Reference in a new issue