Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Ridge2017-07-18 22:13:15 +0000
committerNathan Ridge2017-07-27 04:35:22 +0000
commit10ef1f11b0dc3191e022d1a9ad6a6b6064b575f6 (patch)
tree8b76f47dae7d437d6d81ad9158a7ceb1ef393f34
parent862cf70fa32f7e2e092283076c30024cba644bc3 (diff)
downloadorg.eclipse.cdt-10ef1f11b0dc3191e022d1a9ad6a6b6064b575f6.tar.gz
org.eclipse.cdt-10ef1f11b0dc3191e022d1a9ad6a6b6064b575f6.tar.xz
org.eclipse.cdt-10ef1f11b0dc3191e022d1a9ad6a6b6064b575f6.zip
Bug 519819 - Correctly classify unknown member binding as an unknown member class when it appears in a nested-name-specifier
-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/semantics/CPPSemantics.java5
2 files changed, 21 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 8ea14a808a7..48afbbfb40b 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
@@ -10328,4 +10328,21 @@ public class AST2TemplateTests extends AST2CPPTestBase {
// Check that the TypeOfDependentExpression instantiated to the correct type.
helper.assertVariableValue("waldo", 42);
}
+
+ // template <class>
+ // struct A {
+ // template <class>
+ // struct B {
+ // enum { val = 0 };
+ // };
+ // };
+ //
+ // template <class X>
+ // struct C {
+ // struct D : A<X> {};
+ // enum { val = D::template B<X>::val };
+ // };
+ public void testMemberOfUnknownMemberClass_519819() 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 80ad5bebfbb..9b624e67ecc 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
@@ -498,10 +498,13 @@ public class CPPSemantics {
name= (ICPPASTTemplateId) nameParent;
nameParent= name.getParent();
}
+ boolean isNestedNameSpecifier = false;
if (nameParent instanceof ICPPASTQualifiedName) {
if (name == ((ICPPASTQualifiedName) nameParent).getLastName()) {
name= (IASTName) nameParent;
nameParent= name.getParent();
+ } else {
+ isNestedNameSpecifier = true;
}
}
@@ -509,7 +512,7 @@ public class CPPSemantics {
// binding.
final ASTNodeProperty namePropertyInParent = name.getPropertyInParent();
if (binding == null && data.skippedScope != null) {
- if (namePropertyInParent == IASTNamedTypeSpecifier.NAME) {
+ if (isNestedNameSpecifier || namePropertyInParent == IASTNamedTypeSpecifier.NAME) {
binding= new CPPUnknownMemberClass(data.skippedScope, name.getSimpleID());
} else if (data.isFunctionCall()) {
binding= new CPPUnknownMethod(data.skippedScope, name.getSimpleID());

Back to the top