diff options
author | Nathan Ridge | 2017-07-18 22:13:15 +0000 |
---|---|---|
committer | Nathan Ridge | 2017-07-27 04:35:22 +0000 |
commit | 10ef1f11b0dc3191e022d1a9ad6a6b6064b575f6 (patch) | |
tree | 8b76f47dae7d437d6d81ad9158a7ceb1ef393f34 | |
parent | 862cf70fa32f7e2e092283076c30024cba644bc3 (diff) | |
download | org.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
Change-Id: I2d153e8676403709d4d674d3dcead6896ff9cafe
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()); |