From 20cebd8f6f52ff72e8ba99f4b8f762f6b9a3e995 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Fri, 13 Oct 2017 21:49:40 -0400 Subject: [PATCH] Bug 525982 - Have TypeOfUnknownMember implement ICPPUnknownBinding This ensures that name resolution can proceed when a TypeOfUnknownMember appears on the left hand side of a scope resolution operator. Change-Id: I2dfc22eb474b8a2f776eda09ce90c91462d7fe5b --- .../parser/tests/ast2/AST2TemplateTests.java | 9 ++++++++ .../parser/cpp/semantics/CPPTemplates.java | 22 +++++++++---------- .../cpp/semantics/TypeOfUnknownMember.java | 14 ++++++------ 3 files changed, 26 insertions(+), 19 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 0fae04febd6..ef03eefa2bc 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 @@ -9723,6 +9723,15 @@ public class AST2TemplateTests extends AST2CPPTestBase { IVariable var2 = helper.assertNonProblem("var2"); assertSameType(var1.getType(), var2.getType()); } + + // template + // void foo() { + // typedef decltype(T::member) C; + // typedef decltype(C::member) D; + // } + public void testScopeOfUnkownMemberType_525982() throws Exception { + parseAndCheckBindings(); + } // template // struct integral_constant { 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 fae6938ac21..afb93a6fa51 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 @@ -1533,6 +1533,16 @@ public class CPPTemplates { return instantiated.getType(); } } + } else if (type instanceof TypeOfUnknownMember) { + IBinding binding = resolveUnknown(((TypeOfUnknownMember) type).getUnknownMember(), context); + if (binding instanceof IType) { + return (IType) binding; + } else if (binding instanceof IVariable) { + return ((IVariable) binding).getType(); + } else if (binding instanceof IFunction) { + return ((IFunction) binding).getType(); + } + return type; } else { IBinding binding= resolveUnknown((ICPPUnknownBinding) type, context); if (binding instanceof IType) @@ -1542,18 +1552,6 @@ public class CPPTemplates { } } - if (type instanceof TypeOfUnknownMember) { - IBinding binding = resolveUnknown(((TypeOfUnknownMember) type).getUnknownMember(), context); - if (binding instanceof IType) { - return (IType) binding; - } else if (binding instanceof IVariable) { - return ((IVariable) binding).getType(); - } else if (binding instanceof IFunction) { - return ((IFunction) binding).getType(); - } - return type; - } - if (context.getContextTypeSpecialization() != null && type instanceof IBinding) { IType unwound= getNestedType(type, TDEF); ICPPClassSpecialization withinClass = context.getContextClassSpecialization(); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeOfUnknownMember.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeOfUnknownMember.java index 9d595b60d5e..5d8167998ac 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeOfUnknownMember.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TypeOfUnknownMember.java @@ -11,9 +11,11 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IType; import org.eclipse.cdt.internal.core.dom.parser.ISerializableType; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownBinding; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownMember; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownType; import org.eclipse.cdt.internal.core.index.IIndexFragment; @@ -22,10 +24,11 @@ import org.eclipse.core.runtime.CoreException; /** * Represents the type of an unknown member. */ -public class TypeOfUnknownMember implements ICPPUnknownType, ISerializableType { +public class TypeOfUnknownMember extends CPPUnknownBinding implements ICPPUnknownType, ISerializableType { private final CPPUnknownMember fMember; public TypeOfUnknownMember(CPPUnknownMember member) { + super(("decltype(" + member.getName() + ")").toCharArray()); //$NON-NLS-1$ //$NON-NLS-2$ fMember = member; } @@ -53,11 +56,8 @@ public class TypeOfUnknownMember implements ICPPUnknownType, ISerializableType { } @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException e) { - return null; - } + public IBinding getOwner() { + // We won't know until instantiation. + return null; } }