diff options
author | Nathan Ridge | 2015-07-09 06:09:38 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2015-07-09 21:00:30 +0000 |
commit | 6ed25565a6afa021cf62e574b247abed1e7b1fae (patch) | |
tree | 5cf989c474a517288482e4aaf0963660c6e42f85 | |
parent | a9a454f2569a9249df13364193f394487ebf148c (diff) | |
download | org.eclipse.cdt-6ed25565a6afa021cf62e574b247abed1e7b1fae.tar.gz org.eclipse.cdt-6ed25565a6afa021cf62e574b247abed1e7b1fae.tar.xz org.eclipse.cdt-6ed25565a6afa021cf62e574b247abed1e7b1fae.zip |
Bug 421823 - When a base class lookup runs into a deferred instance,
disambiguate between a method and a field
Change-Id: I03cf9aa55d79c6b9f2a96bf3cace36e706bfecfb
Signed-off-by: Nathan Ridge <zeratul976@hotmail.com>
3 files changed, 25 insertions, 1 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 46bfdb72245..817297ddc16 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 @@ -8816,4 +8816,22 @@ public class AST2TemplateTests extends AST2TestBase { public void testAmbiguityResolutionOrder_462348b() throws Exception { parseAndCheckBindings(); } + + // template <typename> + // struct Base { + // template <typename> + // void method(int); + // }; + // + // template <typename V> + // struct C : Base<V> { + // typedef int WALDO; + // + // C() { + // this->template method<WALDO>(0); + // } + // }; + public void testRegression_421823() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java index 2d24255257d..6071b15347b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java @@ -217,6 +217,7 @@ import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateNonTypeArgument; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPTemplateParameterMap; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownConstructor; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownField; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownMemberClass; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownMethod; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUsingDeclaration; @@ -497,8 +498,10 @@ public class CPPSemantics { if (binding == null && data.skippedScope != null) { if (namePropertyInParent == IASTNamedTypeSpecifier.NAME) { binding= new CPPUnknownMemberClass(data.skippedScope, name.getSimpleID()); - } else { + } else if (data.isFunctionCall()) { binding= new CPPUnknownMethod(data.skippedScope, name.getSimpleID()); + } else { + binding= new CPPUnknownField(data.skippedScope, name.getSimpleID()); } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java index 8664a3bc8c1..51426f5eb33 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java @@ -186,6 +186,9 @@ public class LookupData extends ScopeLookupData { fDeclarator= (IASTDeclarator) nameParent; } else if (nameParent instanceof IASTFieldReference) { qualified= true; + if (nameParent.getPropertyInParent() == IASTFunctionCallExpression.FUNCTION_NAME) { + fFunctionCall= true; + } } else if (nameParent instanceof IASTIdExpression) { if (nameParent.getPropertyInParent() == IASTFunctionCallExpression.FUNCTION_NAME) { fFunctionCall= true; |