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 429e4b6f739..fb08acfef5a 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 @@ -15,6 +15,7 @@ package org.eclipse.cdt.core.parser.tests.ast2; import org.eclipse.cdt.core.dom.ast.IASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; +import org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; import org.eclipse.cdt.core.dom.ast.IASTExpressionStatement; @@ -973,6 +974,11 @@ public class AST2CPPTests extends AST2BaseTest { assertInstances( col, x, 3 ); } + public void testBug84250() throws Exception { + assertTrue( ((IASTDeclarationStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) parse( "void f() { int (*p) [2]; }", ParserLanguage.CPP ).getDeclarations()[0]).getBody()).getStatements()[0]).getDeclaration() instanceof IASTSimpleDeclaration ); //$NON-NLS-1$ + } + + public void _testBug84250() throws Exception{ StringBuffer buffer = new StringBuffer(); buffer.append("void f() { \n"); //$NON-NLS-1$ 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 c0c19eb55f6..c0156dbc658 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 @@ -2671,4 +2671,8 @@ public class AST2Tests extends AST2BaseTest { buffer.append("}\n"); //$NON-NLS-1$ parse( buffer.toString(), ParserLanguage.C ); } + + public void testBug84250() throws Exception { + assertTrue( ((IASTDeclarationStatement) ((IASTCompoundStatement) ((IASTFunctionDefinition) parse( "void f() { int (*p) [2]; }", ParserLanguage.C ).getDeclarations()[0]).getBody()).getStatements()[0]).getDeclaration() instanceof IASTSimpleDeclaration ); //$NON-NLS-1$ + } } \ No newline at end of file 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 259145649ef..9d95fd6fb81 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 @@ -1465,6 +1465,10 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { return expressionStatement; } + + if( resolveOtherAmbiguitiesAsDeclaration( ds, expressionStatement ) ) + return ds; + backup(mark); while (true) { if (consume() == lastTokenOfExpression) @@ -1474,6 +1478,15 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { return expressionStatement; } + /** + * @param ds + * @param expressionStatement + * @return + */ + protected boolean resolveOtherAmbiguitiesAsDeclaration(IASTDeclarationStatement ds, IASTExpressionStatement expressionStatement) { + return false; + } + /** * @return @throws * EndOfFileException 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 bd6db9be201..637d91b2fb8 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 @@ -4706,5 +4706,23 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { ((ASTNode) result).setLength(length); return result; } + + /* (non-Javadoc) + * @see org.eclipse.cdt.internal.core.dom.parser.AbstractGNUSourceCodeParser#resolveOtherAmbiguitiesAsDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclarationStatement, org.eclipse.cdt.core.dom.ast.IASTExpressionStatement) + */ + protected boolean resolveOtherAmbiguitiesAsDeclaration( + IASTDeclarationStatement ds, + IASTExpressionStatement expressionStatement) { + if( expressionStatement.getExpression() instanceof IASTArraySubscriptExpression ) + { + IASTArraySubscriptExpression arraySub = (IASTArraySubscriptExpression) expressionStatement.getExpression(); + if( ! ( arraySub.getArrayExpression() instanceof IASTIdExpression || + arraySub.getArrayExpression() instanceof IASTArraySubscriptExpression || + arraySub.getArrayExpression() instanceof IASTFieldReference )) + return true; + } + return super + .resolveOtherAmbiguitiesAsDeclaration(ds, expressionStatement); + } } \ No newline at end of file