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 dea19e865e7..31e4ef589b2 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 @@ -7149,4 +7149,20 @@ public class AST2TemplateTests extends AST2TestBase { public void testRegression_399142() throws Exception { parseAndCheckBindings(); } + + // template + // struct A { + // struct impl { + // static T x; + // }; + // static const int value = sizeof(impl::x); + // }; + // template struct W {}; + // template <> struct W<1> { typedef int type; }; + // int main() { + // W::value>::type w; + // } + public void testDependentExpressionInvolvingFieldInNestedClass_399362() throws Exception { + parseAndCheckBindings(); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index 392b133cac0..a1421067623 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -1330,25 +1330,29 @@ public class CPPTemplates { public static IBinding instantiateBinding(IBinding binding, ICPPTemplateParameterMap tpMap, int packOffset, ICPPClassSpecialization within, int maxdepth, IASTNode point) throws DOMException { - if (binding instanceof IEnumerator) { - IEnumerator enumerator = (IEnumerator) binding; - IBinding owner = enumerator.getOwner(); - if (!(owner instanceof ICPPEnumerationSpecialization)) { + if (binding instanceof ICPPClassTemplate) { + binding = createDeferredInstance((ICPPClassTemplate) binding); + } + + if (binding instanceof ICPPUnknownBinding) { + return resolveUnknown((ICPPUnknownBinding) binding, tpMap, packOffset, within, point); + } else if (binding instanceof IEnumerator + || binding instanceof ICPPMethod + || binding instanceof ICPPField + || binding instanceof ICPPEnumeration + || binding instanceof ICPPClassType) { + IBinding owner = binding.getOwner(); + if (!(owner instanceof ICPPSpecialization)) { owner = instantiateBinding(owner, tpMap, packOffset, within, maxdepth, point); } - if (owner instanceof ICPPEnumerationSpecialization) { - return ((ICPPEnumerationSpecialization) owner).specializeEnumerator(enumerator); - } - } else if (binding instanceof ICPPUnknownBinding) { - return resolveUnknown((ICPPUnknownBinding) binding, tpMap, packOffset, within, point); - } else if (binding instanceof ICPPMethod || binding instanceof ICPPField || binding instanceof ICPPEnumeration) { - IBinding owner = binding.getOwner(); - if (owner instanceof ICPPClassTemplate) { - owner = resolveUnknown(createDeferredInstance((ICPPClassTemplate) owner), - tpMap, packOffset, within, point); - } - if (owner instanceof ICPPClassSpecialization) { - return ((ICPPClassSpecialization) owner).specializeMember(binding, point); + if (binding instanceof IEnumerator) { + if (owner instanceof ICPPEnumerationSpecialization) { + return ((ICPPEnumerationSpecialization) owner).specializeEnumerator((IEnumerator) binding); + } + } else { + if (owner instanceof ICPPClassSpecialization) { + return ((ICPPClassSpecialization) owner).specializeMember(binding, point); + } } } else if (binding instanceof CPPFunctionInstance) { // TODO(nathanridge):