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 60a375b329a..872e7afb4ec 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 @@ -1415,14 +1415,24 @@ public class AST2Tests extends AST2BaseTest { { 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]; + ICASTArrayModifier mod = (ICASTArrayModifier) ((IASTArrayDeclarator)((IASTSimpleDeclaration) parse( buffer.toString(), ParserLanguage.C ).getDeclarations()[1]).getDeclarators()[0]).getArrayModifiers()[0]; assertTrue( mod.isConst() ); assertTrue( mod.isStatic() ); assertFalse( mod.isRestrict() ); assertFalse( mod.isVolatile() ); + assertFalse( mod.isVariableSized() ); + } + + public void testBug80978() throws Exception + { + StringBuffer buffer =new StringBuffer(); //$NON-NLS-1$ + buffer.append( "int y ( int [ const *] );"); //$NON-NLS-1$ + ICASTArrayModifier mod = (ICASTArrayModifier)((IASTArrayDeclarator)((IASTFunctionDeclarator) ((IASTSimpleDeclaration) parse( buffer.toString(), ParserLanguage.C ).getDeclarations()[0]).getDeclarators()[0]).getParameters()[0].getDeclarator() ).getArrayModifiers()[0]; + assertTrue( mod.isConst() ); + assertTrue( mod.isVariableSized() ); + assertFalse( mod.isStatic() ); + assertFalse( mod.isRestrict() ); + assertFalse( mod.isVolatile() ); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/c/ICASTArrayModifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/c/ICASTArrayModifier.java index e271aa15726..7f142902213 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/c/ICASTArrayModifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/c/ICASTArrayModifier.java @@ -25,4 +25,6 @@ public interface ICASTArrayModifier extends IASTArrayModifier { public void setVolatile( boolean value ); public void setRestrict( boolean value ); public void setStatic( boolean value ); + public boolean isVariableSized(); + public void setVariableSized( boolean value ); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTModifiedArrayModifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTModifiedArrayModifier.java index 3afaa86a50e..f95871600df 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTModifiedArrayModifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTModifiedArrayModifier.java @@ -21,6 +21,7 @@ public class CASTModifiedArrayModifier extends CASTArrayModifier implements private boolean isRestrict; private boolean isStatic; private boolean isConst; + private boolean varSized; /* (non-Javadoc) * @see org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier#isConst() @@ -78,4 +79,18 @@ public class CASTModifiedArrayModifier extends CASTArrayModifier implements this.isStatic = value; } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier#isVariableSized() + */ + public boolean isVariableSized() { + return varSized; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier#setVariableSized(boolean) + */ + public void setVariableSized(boolean value) { + varSized = value; + } + } 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 0d266cf5116..8f569811754 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 @@ -1780,6 +1780,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { boolean isConst = false; boolean isRestrict = false; boolean isVolatile = false; + boolean isVarSized = false; outerLoop: do { switch (LT(1)) { @@ -1799,6 +1800,10 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { isRestrict = true; consume(); break; + case IToken.tSTAR: + isVarSized = true; + consume(); + //deliberate fall through default: break outerLoop; } @@ -1824,6 +1829,7 @@ public class GNUCSourceParser extends AbstractGNUSourceCodeParser { temp.setConst( isConst ); temp.setVolatile( isVolatile ); temp.setRestrict(isRestrict); + temp.setVariableSized(isVarSized ); arrayMod = temp; } ((ASTNode)arrayMod).setOffset( startOffset );