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 47320e78968..0f5915c42d7 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 @@ -7465,6 +7465,26 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // struct foo { + // int operator()() const; + // }; + // + // template + // struct W { + // F f; + // + // auto operator()() const -> decltype(f()) { + // return f(); + // } + // }; + // + // typedef decltype(W()()) waldo; + public void testInstantiationOfConstMemberAccess_409107() throws Exception { + BindingAssertionHelper bh = getAssertionHelper(); + IType waldo = bh.assertNonProblem("waldo"); + assertSameType(waldo, CommonTypes.int_); + } + // template // struct remove_reference { // typedef _Tp type; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalMemberAccess.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalMemberAccess.java index 90149b8358d..dd2f5d43973 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalMemberAccess.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalMemberAccess.java @@ -335,8 +335,9 @@ public class EvalMemberAccess extends CPPDependentEvaluation { return this; IBinding member = fMember; - if (ownerType instanceof ICPPClassSpecialization) { - member = CPPTemplates.createSpecialization((ICPPClassSpecialization) ownerType, fMember, point); + IType ownerClass = SemanticUtil.getNestedType(ownerType, ALLCVQ); + if (ownerClass instanceof ICPPClassSpecialization) { + member = CPPTemplates.createSpecialization((ICPPClassSpecialization) ownerClass, fMember, point); } return new EvalMemberAccess(ownerType, fOwnerValueCategory, member, fIsPointerDeref, getTemplateDefinition()); }