diff options
author | Nathan Ridge | 2017-04-23 21:27:53 +0000 |
---|---|---|
committer | Nathan Ridge | 2017-05-01 06:01:10 +0000 |
commit | 87db7de76505c9fbb945a5f5af8aa22a9e0e6b0d (patch) | |
tree | f4bb1fd321fa64634bca05581a4343f946946fa7 /core | |
parent | 6edd1c6a53bde9187722e338dab4c043aed801b8 (diff) | |
download | org.eclipse.cdt-87db7de76505c9fbb945a5f5af8aa22a9e0e6b0d.tar.gz org.eclipse.cdt-87db7de76505c9fbb945a5f5af8aa22a9e0e6b0d.tar.xz org.eclipse.cdt-87db7de76505c9fbb945a5f5af8aa22a9e0e6b0d.zip |
Bug 515453 - Clear all ProblemBindings stored during ambiguity resolution
This prevents names getting incorrectly stuck with ProblemBindings
created at a time when the AST wasn't fully ambiguity-resolved yet.
Change-Id: Ibca4a774ee26c393bf2b6decb535b82a2329caad
Diffstat (limited to 'core')
2 files changed, 36 insertions, 0 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 fbd78fe3cd2..29ccee449d1 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 @@ -9867,6 +9867,23 @@ public class AST2TemplateTests extends AST2TestBase { public void testAmbiguityResolutionInNestedClassMethodBody_485388() throws Exception { parseAndCheckBindings(); } + + // template <typename...> + // struct Voider { + // using type = void; + // }; + // + // template <typename... Args> + // using void_t = typename Voider<Args...>::type; + // + // template <typename, template <typename...> class Op, typename... Args> + // struct IsDetectedImpl; + // + // template <template <typename...> class Op, typename... Args> + // struct IsDetectedImpl<void_t<Op<Args...>>, Op, Args...> {}; + public void testAmbiguityResolution_515453() throws Exception { + parseAndCheckBindings(); + } // template<typename T, T v> // struct F { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java index 5e7c40235a1..8f01e8ba5a2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java @@ -16,6 +16,7 @@ import java.util.HashMap; import java.util.Map; import org.eclipse.cdt.core.dom.ILinkage; +import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTTypeId; @@ -23,6 +24,7 @@ import org.eclipse.cdt.core.dom.ast.IBasicType; import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IMacroBinding; +import org.eclipse.cdt.core.dom.ast.IProblemBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTranslationUnit; @@ -204,10 +206,27 @@ public class CPPASTTranslationUnit extends ASTTranslationUnit implements ICPPAST fScopeMapper.handleAdditionalDirectives(scope); } + private class ProblemBindingClearer extends ASTVisitor { + public ProblemBindingClearer() { + shouldVisitNames = true; + } + @Override + public int visit(IASTName name) { + if (name.getBinding() instanceof IProblemBinding) { + name.setBinding(null); + } + return PROCESS_CONTINUE; + } + } + @Override public void resolveAmbiguities() { fAmbiguityResolver = new CPPASTAmbiguityResolver(); accept(fAmbiguityResolver); + // During ambiguity resolution, names can incorrectly get stuck with ProblemBindings. + // To prevent this, clear all ProblemBindings here, allowing name resolution for + // the affected names to be attempted again with a fully ambiguity-resolved AST. + accept(new ProblemBindingClearer()); fAmbiguityResolver = null; } |