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;