From cf31ad398af816bc96f8e36f6e7b95f1ea2cbbaf Mon Sep 17 00:00:00 2001 From: John Camelon Date: Thu, 26 May 2005 15:54:32 +0000 Subject: [PATCH] Fixed Bug 95720 [Ambiguity] Cast Expression ambiguity --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 13 +++++++++++++ .../dom/parser/AbstractGNUSourceCodeParser.java | 7 +++++++ 2 files changed, 20 insertions(+) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java index cc4ca7c3af8..5562dd2e27a 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2Tests.java @@ -3006,6 +3006,19 @@ public class AST2Tests extends AST2BaseTest { assertNoProblemBindings(nameResolver); } + public void testBug95720() throws Exception { + StringBuffer buffer = new StringBuffer(); + buffer.append( "void func() {\n" ); + buffer.append( " int i=0;\n" ); + buffer.append( "i= i&0x00ff;\n" ); + buffer.append( "i= (i)&0x00ff;\n" ); + buffer.append( "}\n" ); + IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C ); + CNameCollector nameResolver = new CNameCollector(); + tu.accept(nameResolver); + assertNoProblemBindings(nameResolver); + } + protected void assertNoProblemBindings(CNameCollector col) { Iterator i = col.nameList.iterator(); while (i.hasNext()) { 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 3e9246f1efa..63e0404f16d 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 @@ -37,6 +37,7 @@ import org.eclipse.cdt.core.dom.ast.IASTGotoStatement; import org.eclipse.cdt.core.dom.ast.IASTIdExpression; import org.eclipse.cdt.core.dom.ast.IASTIfStatement; import org.eclipse.cdt.core.dom.ast.IASTLabelStatement; +import org.eclipse.cdt.core.dom.ast.IASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNamedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTNode; @@ -894,8 +895,14 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { protected IASTExpression unaryOperatorCastExpression(int operator) throws EndOfFileException, BacktrackException { + IToken mark = mark(); int offset = consume().getOffset(); IASTExpression castExpression = castExpression(); + if( castExpression instanceof IASTLiteralExpression && operator == IASTUnaryExpression.op_amper ) + { + backup( mark ); + throwBacktrack( mark ); + } return buildUnaryExpression(operator, castExpression, offset, calculateEndOffset(castExpression)); }