Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarkus Schorn2009-01-08 13:03:02 +0000
committerMarkus Schorn2009-01-08 13:03:02 +0000
commit7176aa999fc58a6ba1cb4fd7f96e77d24073f3b1 (patch)
tree8de707a76ddf05736020658077b1b4ffb98309fc
parentc05848a913f817743e756a8112484bf07f7934cf (diff)
downloadorg.eclipse.cdt-7176aa999fc58a6ba1cb4fd7f96e77d24073f3b1.tar.gz
org.eclipse.cdt-7176aa999fc58a6ba1cb4fd7f96e77d24073f3b1.tar.xz
org.eclipse.cdt-7176aa999fc58a6ba1cb4fd7f96e77d24073f3b1.zip
Nested template-id ambiguity, bug 259501.
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java15
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java18
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java24
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(

Back to the top