From 02b95b6d5c841c57bcdf6c2a46313cfd63a0bfb6 Mon Sep 17 00:00:00 2001 From: John Camelon Date: Tue, 21 Dec 2004 19:53:15 +0000 Subject: [PATCH] Fixed Bug 80992 - [Parser2] C Parser only handles 1 type-qualifier in array modifier --- .../cdt/core/parser/tests/ast2/AST2Tests.java | 17 +++++++- .../core/dom/parser/c/GNUCSourceParser.java | 42 ++++++++++--------- 2 files changed, 37 insertions(+), 22 deletions(-) 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 ac5b88ca9b0..60a375b329a 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 @@ -45,7 +45,6 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeIdExpression; import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IArrayType; import org.eclipse.cdt.core.dom.ast.IBasicType; -import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IEnumeration; import org.eclipse.cdt.core.dom.ast.IEnumerator; @@ -61,6 +60,7 @@ import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.ITypedef; import org.eclipse.cdt.core.dom.ast.IVariable; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; +import org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier; import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer; import org.eclipse.cdt.core.dom.ast.c.ICASTEnumerationSpecifier; @@ -70,7 +70,6 @@ import org.eclipse.cdt.core.dom.ast.c.ICArrayType; import org.eclipse.cdt.core.dom.ast.c.ICFunctionScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTPointerToMember; import org.eclipse.cdt.core.parser.ParserLanguage; -import org.eclipse.cdt.internal.core.dom.parser.c.CASTFunctionDeclarator; import org.eclipse.cdt.internal.core.dom.parser.c.CFunction; import org.eclipse.cdt.internal.core.dom.parser.c.CVisitor; import org.eclipse.cdt.internal.core.parser.ParserException; @@ -1411,5 +1410,19 @@ public class AST2Tests extends AST2BaseTest { assertEquals( ((IBasicType)((IFunctionType)((IPointerType)((ITypedef)((IFunctionType)signal3_t).getParameterTypes()[1]).getType()).getType()).getParameterTypes()[0]).getType(), IBasicType.t_int ); } + + public void testBug80992() throws Exception + { + StringBuffer buffer =new StringBuffer( "const int x = 10;\n"); //$NON-NLS-1$ + buffer.append( "int y [ const static x ];"); //$NON-NLS-1$ + IASTTranslationUnit tu = parse( buffer.toString(), ParserLanguage.C ); + IASTDeclaration [] declarations = tu.getDeclarations(); + IASTSimpleDeclaration y = (IASTSimpleDeclaration) declarations[1]; + ICASTArrayModifier mod = (ICASTArrayModifier) ((IASTArrayDeclarator)y.getDeclarators()[0]).getArrayModifiers()[0]; + assertTrue( mod.isConst() ); + assertTrue( mod.isStatic() ); + assertFalse( mod.isRestrict() ); + assertFalse( mod.isVolatile() ); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java index 1a5b50c5f31..0d266cf5116 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/GNUCSourceParser.java @@ -1776,16 +1776,29 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { //eat the '[' int startOffset = consume(IToken.tLBRACKET).getOffset(); - int modifier = -1; + boolean isStatic = false; + boolean isConst = false; + boolean isRestrict = false; + boolean isVolatile = false; outerLoop: do { switch (LT(1)) { case IToken.t_static: + isStatic = true; + consume(); + break; case IToken.t_const: + isConst = true; + consume(); + break; case IToken.t_volatile: + isVolatile = true; + consume(); + break; case IToken.t_restrict: - modifier = consume().getType(); - continue; + isRestrict = true; + consume(); + break; default: break outerLoop; } @@ -1794,7 +1807,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { IASTExpression exp = null; if (LT(1) != IToken.tRBRACKET) { - if (modifier != -1 ) + if (!( isStatic || isRestrict || isConst || isVolatile )) exp = assignmentExpression(); else exp = constantExpression(); @@ -1802,26 +1815,15 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { consume(IToken.tRBRACKET); IASTArrayModifier arrayMod = null; - if( modifier == -1 ) + if(!( isStatic || isRestrict || isConst || isVolatile )) arrayMod = createArrayModifier(); else { ICASTArrayModifier temp = createCArrayModifier(); - switch( modifier ) - { - case IToken.t_static: - temp.setConst( true ); - break; - case IToken.t_const: - temp.setConst( true ); - break; - case IToken.t_volatile: - temp.setVolatile( true ); - break; - case IToken.t_restrict: - temp.setRestrict( true ); - break; - } + temp.setStatic( isStatic ); + temp.setConst( isConst ); + temp.setVolatile( isVolatile ); + temp.setRestrict(isRestrict); arrayMod = temp; } ((ASTNode)arrayMod).setOffset( startOffset );