diff options
Diffstat (limited to 'core')
2 files changed, 29 insertions, 3 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 48a9cd6539a..96af705566e 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 @@ -10934,4 +10934,24 @@ public class AST2TemplateTests extends AST2CPPTestBase { public void testMetaprogrammingWithAliasTemplates_534126() throws Exception { parseAndCheckBindings(); } + + // template <class> + // struct hhh { + // using type = int; + // }; + // + // template <template <class> class TT> + // struct iii { + // using type = typename TT<int>::type; + // }; + // + // template <class A> + // using hhh_d = hhh<A>; + // + // using waldo = typename iii<hhh_d>::type; + public void testAliasTemplateAsTemplateTemplateArg_539076() throws Exception { + BindingAssertionHelper helper = getAssertionHelper(); + IType waldo = helper.assertNonProblem("waldo"); + assertSameType(SemanticUtil.getSimplifiedType(waldo), CommonCPPTypes.int_); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java index 56f7c837cd7..89c30f2a77c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/semantics/CPPTemplates.java @@ -3113,9 +3113,15 @@ public class CPPTemplates { boolean changed= arguments != newArgs; IType classTemplateSpecialization= instantiateType(classTemplate, context); - if (classTemplateSpecialization != classTemplate && classTemplateSpecialization instanceof ICPPClassTemplate) { - classTemplate= (ICPPClassTemplate) classTemplateSpecialization; - changed= true; + if (classTemplateSpecialization != classTemplate) { + if (classTemplateSpecialization instanceof ICPPClassTemplate) { + classTemplate= (ICPPClassTemplate) classTemplateSpecialization; + changed= true; + } else if (classTemplateSpecialization instanceof ICPPAliasTemplate) { + IBinding inst = instantiateAliasTemplate((ICPPAliasTemplate) classTemplateSpecialization, newArgs); + if (inst != null) + return inst; + } } if (changed) { |