From d5e518217a512b7833755dea98d9743dcdf570c7 Mon Sep 17 00:00:00 2001 From: Nathan Ridge Date: Thu, 18 Feb 2016 19:26:35 -0500 Subject: [PATCH] Bug 487698 - Use fully simplified type during deduction (while still preserving typedefs in the result) Change-Id: Ic2b7fbe62317660af218a722d2a113f5ab0d9b4b --- .../parser/tests/ast2/AST2TemplateTests.java | 24 +++++++++++++++++++ .../semantics/TemplateArgumentDeduction.java | 5 ++-- 2 files changed, 27 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 b9411fa92e6..de01117ab86 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 @@ -7853,6 +7853,30 @@ public class AST2TemplateTests extends AST2TestBase { public void testPartialSpecializationForRefQualifiedFunctionType_485888() throws Exception { parseAndCheckBindings(); } + + // template + // struct term_traits; + // + // template + // struct term_traits { + // typedef T value_type; + // }; + // + // template + // struct term_traits { + // typedef T value_type[N]; + // }; + // + // using T = const char(&)[4]; + // using ActualType = term_traits::value_type; + // + // using ExpectedType = char[4]; + public void testQualifierTypeThatCollapsesAfterTypedefSubstitution_487698() throws Exception { + BindingAssertionHelper helper = getAssertionHelper(); + ITypedef actualType = helper.assertNonProblem("ActualType"); + ITypedef expectedType = helper.assertNonProblem("ExpectedType"); + assertSameType(actualType, expectedType); + } // template // struct meta { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java index d113fa2fa15..c5a4eb7b71e 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/TemplateArgumentDeduction.java @@ -840,8 +840,9 @@ public class TemplateArgumentDeduction { } private boolean fromType(IType p, IType a, boolean allowCVQConversion, IASTNode point) throws DOMException { + IType originalArgType = a; + a = SemanticUtil.getSimplifiedType(a); while (p != null) { - IType argumentTypeBeforeTypedefResolution = a; while (a instanceof ITypedef) a = ((ITypedef) a).getType(); while (p instanceof ITypedef) @@ -945,7 +946,7 @@ public class TemplateArgumentDeduction { if (a == null) return false; return deduce(((ICPPTemplateParameter) p).getParameterID(), - new CPPTemplateTypeArgument(a, argumentTypeBeforeTypedefResolution)); + new CPPTemplateTypeArgument(a, ExpressionTypes.restoreTypedefs(a, originalArgType))); } else if (p instanceof ICPPTemplateInstance) { if (!(a instanceof ICPPTemplateInstance)) return false;