From 4c5c6bc7d37f8a7c913bbc307d61c010a1f20b47 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 8 Jan 2009 12:58:25 +0000 Subject: [PATCH] Nested template-id ambiguity, bug 259501. --- .../core/parser/tests/ast2/AST2CPPTests.java | 15 +++++++++ .../parser/AbstractGNUSourceCodeParser.java | 16 +++++++++ .../dom/parser/cpp/GNUCPPSourceParser.java | 33 ++++--------------- 3 files changed, 38 insertions(+), 26 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index 6722930bd23..260ec86a443 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -6331,4 +6331,19 @@ public class AST2CPPTests extends AST2BaseTest { ICPPFunction f2= ba.assertNonProblem("func(*b)", 4, ICPPFunction.class); assertNotSame(f1, f2); } + + // struct C {int a;}; + // void myfunc(C c) { + // return c < c.a || + // (c == c.a && (c 0) { - // bug 104706, don't allow usage of logical operators in template argument lists. - if (expr instanceof IASTConditionalExpression) { - final ASTNode node = (ASTNode) expr; - throwBacktrack(node.getOffset(), node.getLength()); - } - else if (expr instanceof IASTBinaryExpression) { - IASTBinaryExpression bexpr= (IASTBinaryExpression) expr; - switch (bexpr.getOperator()) { - case IASTBinaryExpression.op_logicalAnd: - case IASTBinaryExpression.op_logicalOr: - final ASTNode node = (ASTNode) expr; - throwBacktrack(node.getOffset(), node.getLength()); - } - } - } - return expr; + protected boolean shallRejectLogicalOperator() { + return onTopInTemplateArgs && rejectLogicalOperatorInTemplateID > 0; } - @Override protected IASTExpression constantExpression() throws EndOfFileException, BacktrackException { final boolean wasOnTop= onTopInTemplateArgs; @@ -2763,6 +2741,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { int startingOffset = mark.getOffset(); IASTDeclSpecifier declSpecifier = null; IASTDeclarator declarator = null; + rejectLogicalOperatorInTemplateID++; try { declSpecifier = declSpecifierSeq(option); if (LT(1) != IToken.tEOC) { @@ -2777,6 +2756,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { return null; } catch (BacktrackException bt) { return null; + } finally { + rejectLogicalOperatorInTemplateID--; } IASTTypeId result = nodeFactory.newTypeId(declSpecifier, declarator); ((ASTNode) result).setOffsetAndLength(startingOffset, figureEndOffset(declSpecifier, declarator) - startingOffset);