Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Ridge2015-07-09 06:09:38 +0000
committerGerrit Code Review @ Eclipse.org2015-07-09 21:00:30 +0000
commit6ed25565a6afa021cf62e574b247abed1e7b1fae (patch)
tree5cf989c474a517288482e4aaf0963660c6e42f85
parenta9a454f2569a9249df13364193f394487ebf148c (diff)
downloadorg.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>
-rw-r--r--core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2TemplateTests.java18
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPSemantics.java5
-rw-r--r--core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/LookupData.java3
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;

Back to the top