From 67425186a2c74e1215670c6a1edd2162b474819d Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Mon, 27 May 2013 03:12:11 -0400 Subject: [PATCH] Bug 409107 - Incorrect instantiation of const member access Change-Id: I5909d7998e86a28d3c44172c3e80cad06c6b1b1b Reviewed-on: https://git.eclipse.org/r/13169 Reviewed-by: Sergey Prigogin IP-Clean: Sergey Prigogin Tested-by: Sergey Prigogin --- .../parser/tests/ast2/AST2TemplateTests.java | 20 +++++++++++++++++++ .../cpp/semantics/EvalMemberAccess.java | 5 +++-- 2 files changed, 23 insertions(+), 2 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 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()); }