From 3df391336b3fed78347aca82c2e345790fa8cc86 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Tue, 5 Mar 2013 04:28:41 -0500 Subject: [PATCH] Bug 402409 - Dependent expressions and auto type resolution Change-Id: I71c8f2237bf22ffd0d9e79b15dce8cd693556564 Reviewed-on: https://git.eclipse.org/r/10839 Reviewed-by: Sergey Prigogin IP-Clean: Sergey Prigogin Tested-by: Sergey Prigogin --- .../parser/tests/ast2/AST2TemplateTests.java | 21 +++++++++++++++++++ .../core/dom/parser/cpp/semantics/EvalID.java | 9 ++++++++ 2 files changed, 30 insertions(+) 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 c6e89eeb5a7..a95ce65e7da 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 @@ -42,6 +42,7 @@ import org.eclipse.cdt.core.dom.ast.IASTProblemStatement; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.IBasicType; +import org.eclipse.cdt.core.dom.ast.IBasicType.Kind; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICompositeType; import org.eclipse.cdt.core.dom.ast.IEnumerator; @@ -95,6 +96,7 @@ import org.eclipse.cdt.core.parser.util.ObjectMap; import org.eclipse.cdt.internal.core.dom.parser.Value; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPASTNameBase; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPBasicType; +import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPPointerType; import org.eclipse.cdt.internal.core.dom.parser.cpp.CPPReferenceType; import org.eclipse.cdt.internal.core.dom.parser.cpp.ClassTypeHelper; import org.eclipse.cdt.internal.core.dom.parser.cpp.ICPPDeferredClassInstance; @@ -5874,6 +5876,25 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // struct vector { + // int* begin(); + // }; + // + // template + // auto begin(Container cont) -> decltype(cont.begin()); + // + // vector v; + // auto x = begin(v); + public void testResolvingAutoTypeWithDependentExpression_402409() throws Exception { + BindingAssertionHelper helper = new BindingAssertionHelper(getAboveComment(), true); + ICPPVariable x = helper.assertNonProblem("x", ICPPVariable.class); + IType xType = x.getType(); + assertInstance(xType, CPPPointerType.class); + IType xTypeInner = ((CPPPointerType) xType).getType(); + assertInstance(xTypeInner, ICPPBasicType.class); + assertEquals(Kind.eInt, ((ICPPBasicType) xTypeInner).getKind()); + } + // void foo(int, int); // template void bar(Args... args) { // foo(1,2,args...); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java index bf6318bced9..84714260582 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalID.java @@ -324,6 +324,15 @@ public class EvalID extends CPPDependentEvaluation { if (eval != null) return eval; } + + if (fieldOwner != null && !fieldOwner.isTypeDependent()) { + IType fieldOwnerType = fieldOwner.getTypeOrFunctionSet(point); + if (fieldOwnerType instanceof ICPPClassType) { + ICPPEvaluation eval = resolveName((ICPPClassType) fieldOwnerType, templateArgs, point); + if (eval != null) + return eval; + } + } return new EvalID(fieldOwner, nameOwner, fName, fAddressOf, fQualified, templateArgs, getTemplateDefinition()); }