diff options
author | Markus Schorn | 2009-01-08 13:03:02 +0000 |
---|---|---|
committer | Markus Schorn | 2009-01-08 13:03:02 +0000 |
commit | 7176aa999fc58a6ba1cb4fd7f96e77d24073f3b1 (patch) | |
tree | 8de707a76ddf05736020658077b1b4ffb98309fc | |
parent | c05848a913f817743e756a8112484bf07f7934cf (diff) | |
download | org.eclipse.cdt-7176aa999fc58a6ba1cb4fd7f96e77d24073f3b1.tar.gz org.eclipse.cdt-7176aa999fc58a6ba1cb4fd7f96e77d24073f3b1.tar.xz org.eclipse.cdt-7176aa999fc58a6ba1cb4fd7f96e77d24073f3b1.zip |
Nested template-id ambiguity, bug 259501.
3 files changed, 36 insertions, 21 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 c2191226805..2cfe5abecea 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 @@ -6178,4 +6178,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<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a || + // (c == c.a && (c<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a || + // (c == c.a && (c<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a || + // (c == c.a && (c<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a || + // (c == c.a && (c<c.a || (c == c.a && (c<c.a || (c == c.a && (c<c.a + // )))))))))))))))))))))))))))))); + // } + public void testNestedTemplateIDAmbiguity_259501() throws Exception { + final String code= getAboveComment(); + parseAndCheckBindings(code); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java index 1e0b5f3de71..57e2280f624 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java @@ -985,6 +985,10 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { EndOfFileException { IASTExpression firstExpression = logicalAndExpression(); while (LT(1) == IToken.tOR) { + if (shallRejectLogicalOperator()) { + throwBacktrack(LA(1)); + } + consume(); IASTExpression secondExpression = logicalAndExpression(); firstExpression = buildBinaryExpression( @@ -993,11 +997,17 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { } return firstExpression; } + protected boolean shallRejectLogicalOperator() { + return false; + } - protected IASTExpression logicalAndExpression() throws BacktrackException, - EndOfFileException { + protected IASTExpression logicalAndExpression() throws BacktrackException, EndOfFileException { IASTExpression firstExpression = inclusiveOrExpression(); while (LT(1) == IToken.tAND) { + if (shallRejectLogicalOperator()) { + throwBacktrack(LA(1)); + } + consume(); IASTExpression secondExpression = inclusiveOrExpression(); firstExpression = buildBinaryExpression( @@ -1180,6 +1190,10 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { EndOfFileException { IASTExpression firstExpression = logicalOrExpression(); if (LT(1) == IToken.tQUESTION) { + if (shallRejectLogicalOperator()) { + throwBacktrack(LA(1)); + } + consume(); IASTExpression secondExpression= null; if (LT(1) != IToken.tCOLON) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index 67bc7cadb94..ef6683417a6 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -463,25 +463,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } @Override - protected IASTExpression conditionalExpression() throws BacktrackException, EndOfFileException { - final IASTExpression expr= super.conditionalExpression(); - if (onTopInTemplateArgs && rejectLogicalOperatorInTemplateID > 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; } protected IToken consumeTemplateArguments(IToken last, TemplateParameterManager argumentList) throws EndOfFileException, BacktrackException { @@ -871,6 +854,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) { @@ -885,6 +869,8 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { return null; } catch (BacktrackException bt) { return null; + } finally { + rejectLogicalOperatorInTemplateID--; } IASTTypeId result = createTypeId(); ((ASTNode) result).setOffsetAndLength(startingOffset, figureEndOffset( |