From 0ebca71a1d033d48e706a847f113a4c8c86951de Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Mon, 7 Nov 2011 15:00:44 +0100 Subject: [PATCH] Bug 362976: Directly nested ambiguity node. --- .../parser/tests/ast2/AST2TemplateTests.java | 9 +++++ .../ASTAmbiguousBinaryVsCastExpression.java | 10 ++++-- ...AmbiguousCastVsFunctionCallExpression.java | 10 ++++-- .../core/dom/parser/ASTAmbiguousNode.java | 33 +++++++++++++------ .../c/CASTAmbiguousSimpleDeclaration.java | 12 +++++-- .../CPPASTAmbiguousParameterDeclaration.java | 11 ++++++- .../cpp/CPPASTAmbiguousSimpleDeclaration.java | 12 +++++-- .../parser/cpp/CPPASTTemplateIDAmbiguity.java | 11 ++++--- 8 files changed, 80 insertions(+), 28 deletions(-) diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java index ca6240ec93e..4b1d5d9e4d3 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java @@ -5574,4 +5574,13 @@ public class AST2TemplateTests extends AST2BaseTest { public void testDependentUsingDeclaration() throws Exception { parseAndCheckBindings(); } + + // template void* foo(int); + // template void f(T t) { + // if (T* i = foo<0>(0)) + // return; + // } + public void testDirectlyNestedAmbiguity_362976() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousBinaryVsCastExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousBinaryVsCastExpression.java index 721950391e1..91b92405adf 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousBinaryVsCastExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousBinaryVsCastExpression.java @@ -40,15 +40,18 @@ public abstract class ASTAmbiguousBinaryVsCastExpression extends ASTAmbiguousNod fCastExpression= castExpression; } - public final IASTExpression copy() { + @Override + public final IASTExpression copy() { throw new UnsupportedOperationException(); } + @Override public final IASTExpression copy(CopyStyle style) { throw new UnsupportedOperationException(); } - public final void addExpression(IASTExpression e) { + @Override + public final void addExpression(IASTExpression e) { throw new UnsupportedOperationException(); } @@ -57,12 +60,13 @@ public abstract class ASTAmbiguousBinaryVsCastExpression extends ASTAmbiguousNod return getExpressions(); } + @Override public IASTExpression[] getExpressions() { return new IASTExpression[] {fBinaryExpression, fCastExpression}; } @Override - public final IASTNode resolveAmbiguity(ASTVisitor visitor) { + protected final IASTNode doResolveAmbiguity(ASTVisitor visitor) { final IASTAmbiguityParent owner= (IASTAmbiguityParent) getParent(); IASTNode nodeToReplace= this; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousCastVsFunctionCallExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousCastVsFunctionCallExpression.java index dcc060262b2..873e540bd39 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousCastVsFunctionCallExpression.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousCastVsFunctionCallExpression.java @@ -49,24 +49,28 @@ public abstract class ASTAmbiguousCastVsFunctionCallExpression extends ASTAmbigu return getExpressions(); } - public final IASTExpression copy() { + @Override + public final IASTExpression copy() { throw new UnsupportedOperationException(); } + @Override public final IASTExpression copy(CopyStyle style) { throw new UnsupportedOperationException(); } - public void addExpression(IASTExpression e) { + @Override + public void addExpression(IASTExpression e) { throw new UnsupportedOperationException(); } + @Override public IASTExpression[] getExpressions() { return new IASTExpression[] {fCastExpression, fFunctionCallExpression}; } @Override - public final IASTNode resolveAmbiguity(ASTVisitor visitor) { + protected final IASTNode doResolveAmbiguity(ASTVisitor visitor) { final IASTAmbiguityParent owner= (IASTAmbiguityParent) getParent(); IASTNode nodeToReplace= this; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousNode.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousNode.java index 772fd3e70c8..3f56c3c2d08 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousNode.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/ASTAmbiguousNode.java @@ -49,6 +49,8 @@ public abstract class ASTAmbiguousNode extends ASTNode { return names; } } + + private IASTNode fResolution; /** * Return the alternative nodes for this ambiguity. @@ -73,7 +75,11 @@ public abstract class ASTAmbiguousNode extends ASTNode { protected void afterResolution(ASTVisitor resolver, IASTNode best) { } - public IASTNode resolveAmbiguity(ASTVisitor resolver) { + public IASTNode resolveAmbiguity(ASTVisitor resolver) { + return fResolution= doResolveAmbiguity(resolver); + } + + protected IASTNode doResolveAmbiguity(ASTVisitor resolver) { beforeResolution(); final IASTAmbiguityParent owner= (IASTAmbiguityParent) getParent(); IASTNode nodeToReplace= this; @@ -85,23 +91,23 @@ public abstract class ASTAmbiguousNode extends ASTNode { for (IASTNode alternative : alternatives) { // Setup the ast to use the alternative owner.replace(nodeToReplace, alternative); - nodeToReplace= alternative; beforeAlternative(alternative); + + // Handle nested ambiguities + alternative= resolveNestedAmbiguities(alternative, resolver); + nodeToReplace= alternative; - // handle nested ambiguities first, otherwise we cannot visit the alternative - alternative.accept(resolver); - - // find nested names + // Find nested names final NameCollector nameCollector= new NameCollector(); alternative.accept(nameCollector); final IASTName[] names= nameCollector.getNames(); - // resolve names and count issues + // Resolve names and count issues int issues= 0; for (IASTName name : names) { try { - // avoid resolution of parameters (can always be resolved), + // Avoid resolution of parameters (can always be resolved), // it can triggers resolution of declaration it belongs to, // while the declarator is still ambiguous. Could be solved by introducing an // intermediate binding for parameters, similar to template parameters. @@ -133,7 +139,7 @@ public abstract class ASTAmbiguousNode extends ASTNode { } } - // switch back to the best alternative, if necessary. + // Switch back to the best alternative, if necessary. if (nodeToReplace != bestAlternative) { owner.replace(nodeToReplace, bestAlternative); } @@ -141,7 +147,14 @@ public abstract class ASTAmbiguousNode extends ASTNode { return bestAlternative; } - public final IType getExpressionType() { + protected IASTNode resolveNestedAmbiguities(IASTNode alternative, ASTVisitor resolver) { + alternative.accept(resolver); + if (alternative instanceof ASTAmbiguousNode) + return ((ASTAmbiguousNode) alternative).fResolution; + return alternative; + } + + public final IType getExpressionType() { throw new UnsupportedOperationException(); } public final ValueCategory getValueCategory() { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousSimpleDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousSimpleDeclaration.java index 27e7424a91c..c62e6eede27 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousSimpleDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTAmbiguousSimpleDeclaration.java @@ -56,39 +56,45 @@ public class CASTAmbiguousSimpleDeclaration extends ASTAmbiguousNode implements return new IASTNode[] {fSimpleDecl, fAltDeclSpec, fAltDtor}; } + @Override public IASTSimpleDeclaration copy() { throw new UnsupportedOperationException(); } + @Override public IASTSimpleDeclaration copy(CopyStyle style) { throw new UnsupportedOperationException(); } + @Override public void addDeclarator(IASTDeclarator declarator) { fSimpleDecl.addDeclarator(declarator); } + @Override public IASTDeclSpecifier getDeclSpecifier() { return fSimpleDecl.getDeclSpecifier(); } + @Override public IASTDeclarator[] getDeclarators() { return fSimpleDecl.getDeclarators(); } + @Override public void setDeclSpecifier(IASTDeclSpecifier declSpec) { fSimpleDecl.setDeclSpecifier(declSpec); } @Override - public final IASTNode resolveAmbiguity(ASTVisitor visitor) { + protected final IASTNode doResolveAmbiguity(ASTVisitor resolver) { final IASTAmbiguityParent owner= (IASTAmbiguityParent) getParent(); IASTNode nodeToReplace= this; // handle nested ambiguities first owner.replace(nodeToReplace, fSimpleDecl); IASTDeclSpecifier declSpec= fSimpleDecl.getDeclSpecifier(); - declSpec.accept(visitor); + declSpec.accept(resolver); // find nested names @@ -118,7 +124,7 @@ public class CASTAmbiguousSimpleDeclaration extends ASTAmbiguousNode implements } // resolve further nested ambiguities - fSimpleDecl.accept(visitor); + fSimpleDecl.accept(resolver); return fSimpleDecl; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousParameterDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousParameterDeclaration.java index f58d3afbb9b..81b864a9bfc 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousParameterDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousParameterDeclaration.java @@ -43,13 +43,14 @@ public class CPPASTAmbiguousParameterDeclaration extends ASTAmbiguousNode implem fParameterDecl= decl; } + @Override public void addParameterDeclaration(IASTParameterDeclaration d) { assert false; } @Override - public IASTNode resolveAmbiguity(ASTVisitor resolver) { + protected final IASTNode doResolveAmbiguity(ASTVisitor resolver) { final IASTAmbiguityParent owner= (IASTAmbiguityParent) getParent(); // Setup the ast to use the alternative @@ -79,6 +80,7 @@ public class CPPASTAmbiguousParameterDeclaration extends ASTAmbiguousNode implem } } + @Override public IASTParameterDeclaration[] getParameterDeclarations() { return new IASTParameterDeclaration[] {fParameterDecl}; } @@ -88,32 +90,39 @@ public class CPPASTAmbiguousParameterDeclaration extends ASTAmbiguousNode implem return getParameterDeclarations(); } + @Override public IASTDeclSpecifier getDeclSpecifier() { return fParameterDecl.getDeclSpecifier(); } + @Override public ICPPASTDeclarator getDeclarator() { return fParameterDecl.getDeclarator(); } + @Override public void setDeclSpecifier(IASTDeclSpecifier declSpec) { Assert.isLegal(false); } + @Override public void setDeclarator(IASTDeclarator declarator) { Assert.isLegal(false); } + @Override public ICPPASTParameterDeclaration copy() { Assert.isLegal(false); return null; } + @Override public ICPPASTParameterDeclaration copy(CopyStyle style) { Assert.isLegal(false); return null; } + @Override public boolean isParameterPack() { Assert.isLegal(false); return true; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousSimpleDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousSimpleDeclaration.java index a546fb979d2..483a0652c50 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousSimpleDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTAmbiguousSimpleDeclaration.java @@ -58,39 +58,45 @@ public class CPPASTAmbiguousSimpleDeclaration extends ASTAmbiguousNode implement return new IASTNode[] {fSimpleDecl, fAltDeclSpec, fAltDtor}; } + @Override public IASTSimpleDeclaration copy() { throw new UnsupportedOperationException(); } + @Override public IASTSimpleDeclaration copy(CopyStyle style) { throw new UnsupportedOperationException(); } + @Override public void addDeclarator(IASTDeclarator declarator) { fSimpleDecl.addDeclarator(declarator); } + @Override public IASTDeclSpecifier getDeclSpecifier() { return fSimpleDecl.getDeclSpecifier(); } + @Override public IASTDeclarator[] getDeclarators() { return fSimpleDecl.getDeclarators(); } + @Override public void setDeclSpecifier(IASTDeclSpecifier declSpec) { fSimpleDecl.setDeclSpecifier(declSpec); } @Override - public final IASTNode resolveAmbiguity(ASTVisitor visitor) { + protected final IASTNode doResolveAmbiguity(ASTVisitor resolver) { final IASTAmbiguityParent owner= (IASTAmbiguityParent) getParent(); IASTNode nodeToReplace= this; // handle nested ambiguities first owner.replace(nodeToReplace, fSimpleDecl); IASTDeclarator dtor= fSimpleDecl.getDeclarators()[0]; - dtor.accept(visitor); + dtor.accept(resolver); // find nested names @@ -120,7 +126,7 @@ public class CPPASTAmbiguousSimpleDeclaration extends ASTAmbiguousNode implement } // resolve further nested ambiguities - fSimpleDecl.accept(visitor); + fSimpleDecl.accept(resolver); return fSimpleDecl; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateIDAmbiguity.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateIDAmbiguity.java index 4cb5929ce15..6ae39e11ae9 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateIDAmbiguity.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplateIDAmbiguity.java @@ -57,7 +57,7 @@ public class CPPASTTemplateIDAmbiguity extends ASTAmbiguousNode implements IASTA } @Override - public IASTNode resolveAmbiguity(ASTVisitor resolver) { + protected final IASTNode doResolveAmbiguity(ASTVisitor resolver) { final IASTAmbiguityParent owner= (IASTAmbiguityParent) getParent(); IASTNode nodeToReplace= this; @@ -77,10 +77,7 @@ public class CPPASTTemplateIDAmbiguity extends ASTAmbiguousNode implements IASTA // Setup the ast to use the alternative owner.replace(nodeToReplace, expression); - nodeToReplace= expression; - - // Handle nested ambiguities first - expression.accept(resolver); + nodeToReplace= resolveNestedAmbiguities(expression, resolver); int count= checkNames(templateNames); if (count > bestCount) { @@ -163,18 +160,22 @@ public class CPPASTTemplateIDAmbiguity extends ASTAmbiguousNode implements IASTA return fNodes; } + @Override public IASTExpression copy() { throw new UnsupportedOperationException(); } + @Override public IASTExpression copy(CopyStyle style) { throw new UnsupportedOperationException(); } + @Override public void addExpression(IASTExpression e) { throw new UnsupportedOperationException(); } + @Override public IASTExpression[] getExpressions() { throw new UnsupportedOperationException(); }