From d652858b3a3bf0b60477b02050c5703e0e1c7439 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Sun, 25 Sep 2016 11:26:41 -0700 Subject: [PATCH] Bug 502109 - Name resolution problem with alias template Change-Id: I1475ae9aef468f0f3075ed4a9689b15788be4d42 --- .../parser/tests/ast2/AST2TemplateTests.java | 65 ++++++++++++++++++- .../dom/parser/cpp/semantics/EvalTypeId.java | 7 +- 2 files changed, 67 insertions(+), 5 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 e045a57ba43..78245d1ce22 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 @@ -6267,7 +6267,7 @@ public class AST2TemplateTests extends AST2TestBase { public void testTemplateIDAmbiguity_445177() throws Exception { parseAndCheckBindings(); } - + // template // struct EnableIf; // @@ -6281,7 +6281,7 @@ public class AST2TemplateTests extends AST2TestBase { // template struct TupleSize; // // template - // struct TupleSize> { + // struct TupleSize> { // static constexpr int value = sizeof...(E); // }; // @@ -7482,6 +7482,65 @@ public class AST2TemplateTests extends AST2TestBase { parseAndCheckBindings(); } + // struct true_type { + // constexpr operator bool() const { return true; } + // }; + // + // struct false_type { + // constexpr operator bool() const { return false; } + // }; + // + // template + // struct enable_if {}; + // + // template + // struct enable_if { + // typedef T type; + // }; + // + // template + // struct C { + // T* ptr(); + // }; + // + // struct A {}; + // + // struct B { + // B(A a); + // }; + // + // template + // auto ptr1(T t) -> decltype(t.ptr()); + // + // template + // struct E { + // template + // using G = decltype(ptr1(U())); + // template + // using H = decltype(*U()); + // + // using type1 = H>; + // }; + // + // template + // struct D { + // typedef true_type type2; + // }; + // + // template + // using F = typename D::type1>::type2; + // + // template {}>::type> + // void waldo(T p); + // + // void test() { + // C a; + // waldo(a); + // } + public void testAliasTemplate_502109() throws Exception { + parseAndCheckBindings(); + } + // template // struct Struct {}; // @@ -9687,7 +9746,7 @@ public class AST2TemplateTests extends AST2TestBase { public void testBraceInitialization_490475b() throws Exception { BindingAssertionHelper helper = getAssertionHelper(); IVariable waldo = helper.assertNonProblem("waldo"); - // TODO(nathanridge): + // TODO(nathanridge): // Actually test that we get the correct value. // For this, we need to add support for aggregate initialization in EvalTypeId. // For now, just test that attempting to evaluate doesn't throw an exception. diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalTypeId.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalTypeId.java index c0fe9c09e09..9e2591e1ce0 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalTypeId.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/EvalTypeId.java @@ -13,6 +13,8 @@ package org.eclipse.cdt.internal.core.dom.parser.cpp.semantics; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.typeFromReturnType; import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.ExpressionTypes.valueCategoryFromReturnType; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.CVTYPE; +import static org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.SemanticUtil.TDEF; import org.eclipse.cdt.core.CCorePlugin; import org.eclipse.cdt.core.dom.ast.DOMException; @@ -30,8 +32,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPFunction; import org.eclipse.cdt.core.dom.ast.cpp.ICPPMethod; import org.eclipse.cdt.core.dom.ast.cpp.ICPPSpecialization; import org.eclipse.cdt.core.dom.ast.cpp.ICPPTemplateParameterMap; -import org.eclipse.cdt.internal.core.dom.parser.CompositeValue; import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.internal.core.dom.parser.CompositeValue; 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.IntegralValue; @@ -77,6 +79,8 @@ public class EvalTypeId extends CPPDependentEvaluation { if (arguments == null) throw new NullPointerException("arguments"); //$NON-NLS-1$ + if (!CPPTemplates.isDependentType(type)) + type = SemanticUtil.getNestedType(type, TDEF | CVTYPE); fInputType= type; fArguments= arguments; fRepresentsNewExpression = forNewExpression; @@ -179,7 +183,6 @@ public class EvalTypeId extends CPPDependentEvaluation { default: return IntegralValue.UNKNOWN; } - } } if (fArguments.length == 1) {