From df76958d18c032be00e930d343e29a50db6efccb Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Sun, 12 Jul 2015 21:10:11 -0400 Subject: [PATCH] Bug 472436 - Dependent field reference with pointer as field owner Change-Id: I28ed13ac473249fe79800ae1a2361f87bacc156d Signed-off-by: Nathan Ridge --- .../parser/tests/ast2/AST2TemplateTests.java | 16 ++++++++++++++++ .../dom/parser/cpp/CPPUnknownMemberClass.java | 4 ---- .../parser/cpp/semantics/EvalMemberAccess.java | 13 +++++++++---- 3 files changed, 25 insertions(+), 8 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 817297ddc16..383cc4ddaaf 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 @@ -7997,6 +7997,22 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // struct S { + // int foo; + // }; + // + // template + // auto bar(T t) -> decltype(t->foo); + // + // int main() { + // S s; + // auto waldo = bar(&s); + // } + public void testDependentFieldReference_472436() throws Exception { + BindingAssertionHelper helper = getAssertionHelper(); + helper.assertVariableType("waldo", CommonCPPTypes.int_); + } + // template // struct Bind {}; // template diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownMemberClass.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownMemberClass.java index 5ed49c9b025..5dce68ecb61 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownMemberClass.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPUnknownMemberClass.java @@ -30,10 +30,6 @@ import org.eclipse.cdt.core.parser.util.CharArrayUtils; * Represents a C++ class, declaration of which is not yet available. */ public class CPPUnknownMemberClass extends CPPUnknownMember implements ICPPUnknownMemberClass { - public static CPPUnknownMemberClass createUnnamedInstance() { - return new CPPUnknownMemberClass(null, CharArrayUtils.EMPTY); - } - public CPPUnknownMemberClass(IType owner, char[] name) { super(owner, name); } 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 c2833690ef9..c4bbf5e8cbe 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 @@ -27,6 +27,7 @@ import java.util.Collection; import org.eclipse.cdt.core.dom.ast.IASTExpression.ValueCategory; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTUnaryExpression; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IEnumerator; import org.eclipse.cdt.core.dom.ast.IFunction; @@ -46,7 +47,6 @@ import org.eclipse.cdt.internal.core.dom.parser.ISerializableEvaluation; import org.eclipse.cdt.internal.core.dom.parser.ITypeMarshalBuffer; import org.eclipse.cdt.internal.core.dom.parser.ProblemType; import org.eclipse.cdt.internal.core.dom.parser.Value; -import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPUnknownMemberClass; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPEvaluation; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPInternalUnknownScope; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPUnknownBinding; @@ -166,7 +166,7 @@ public class EvalMemberAccess extends CPPDependentEvaluation { } public static IType getFieldOwnerType(IType fieldOwnerExpressionType, boolean isDeref, IASTNode point, Collection functionBindings, - boolean returnUnnamed) { + boolean returnDependent) { IType type= fieldOwnerExpressionType; if (!isDeref) return type; @@ -208,8 +208,13 @@ public class EvalMemberAccess extends CPPDependentEvaluation { return glvalueType(((IPointerType) prValue).getType()); } - if (CPPTemplates.isDependentType(type)) - return returnUnnamed ? CPPUnknownMemberClass.createUnnamedInstance() : null; + if (CPPTemplates.isDependentType(type)) { + return returnDependent + // The type resulting from dereferecing 'type' + ? new TypeOfDependentExpression(new EvalUnary(IASTUnaryExpression.op_star, + new EvalFixed(type, LVALUE, Value.UNKNOWN), null, point)) + : null; + } return ProblemType.UNKNOWN_FOR_EXPRESSION; }