Skip to main content
summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
authorNathan Ridge2017-04-23 21:27:53 +0000
committerNathan Ridge2017-05-01 06:01:10 +0000
commit87db7de76505c9fbb945a5f5af8aa22a9e0e6b0d (patch)
treef4bb1fd321fa64634bca05581a4343f946946fa7 /core
parent6edd1c6a53bde9187722e338dab4c043aed801b8 (diff)
downloadorg.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')
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java17
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTranslationUnit.java19
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;
}

Back to the top