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 274597bbc43..bdfba2e8b17 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 @@ -5827,6 +5827,19 @@ public class AST2Tests extends AST2BaseTest { return runtime.totalMemory()-runtime.freeMemory(); } + // int n= 0; + // int a[]= {0x00, sizeof(n)}; + public void testNonTrivialInitializer_Bug253690() throws Exception { + final String code= getAboveComment(); + for (ParserLanguage lang : ParserLanguage.values()) { + IASTTranslationUnit tu= parse(code, lang, false, true, true); + IASTSimpleDeclaration d= getDeclaration(tu, 0); + IBinding b= d.getDeclarators()[0].getName().resolveBinding(); + IASTName[] refs = tu.getReferences(b); + assertEquals(1, refs.length); + } + } + // void test() { // const void* p = 1+2; // } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java index 26fc1e04d0d..5d42d03657f 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java @@ -127,7 +127,9 @@ public abstract class ASTVisitor { public boolean includeInactiveNodes= false; /** - * For internal use, only. + * Normally neither ambiguous nodes nor their children are visited. By setting + * this flag to true ambiguous nodes are visited, their children + * are not. * @noreference This field is not intended to be referenced by clients. */ public boolean shouldVisitAmbiguousNodes = false; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTQueries.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTQueries.java index 409c10fa1c1..c45479f48de 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTQueries.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTQueries.java @@ -45,6 +45,15 @@ public class ASTQueries { fFound= true; return PROCESS_ABORT; } + @Override + public int visit(ASTAmbiguousNode node) { + IASTNode[] alternatives= node.getNodes(); + for (IASTNode alt : alternatives) { + if (!alt.accept(this)) + return PROCESS_ABORT; + } + return PROCESS_CONTINUE; + } } private static NameSearch NAME_SEARCH= new NameSearch(); 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 9d8466c55bd..f9d579f9d23 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 @@ -121,6 +121,17 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { ((ASTNode) node).setInactive(); return PROCESS_CONTINUE; } + + @Override + public int visit(ASTAmbiguousNode node) { + node.setInactive(); + IASTNode[] alternatives= node.getNodes(); + for (IASTNode alt : alternatives) { + if (!alt.accept(this)) + return PROCESS_ABORT; + } + return PROCESS_CONTINUE; + } }; protected static final int DEFAULT_DESIGNATOR_LIST_SIZE = 4;