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 c33aabfdd9a..b0401ab272a 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 @@ -591,6 +591,26 @@ public void test14_5_4_1s2_MatchingTemplateSpecializations() throws Exception { assertSame(R3.getTemplateDefinition(), A4); } + // template constexpr bool consume_r1() { return true; } + // template class A { }; + // template class A ()> { }; + // A a1; // uses specialisation + public void testPrimitiveMatchingSpecializations() throws Exception { + IASTTranslationUnit tu = parse(getAboveComment(), CPP); + NameCollector col = new NameCollector(); + tu.accept(col); + + ICPPClassTemplate A1 = (ICPPClassTemplate) col.getName(4).resolveBinding(); + ICPPClassTemplate A2 = (ICPPClassTemplate) col.getName(6).resolveBinding(); + + assertTrue(A2 instanceof ICPPClassTemplatePartialSpecialization); + assertSame(((ICPPClassTemplatePartialSpecialization) A2).getPrimaryClassTemplate(), A1); + + ICPPTemplateInstance R1 = (ICPPTemplateInstance) col.getName(12).resolveBinding(); + + assertSame(R1.getTemplateDefinition(), A2); + } + // template void f(T); // template void f(T*); // template <> void f(int); //ok 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 c5aea790721..7d845190dfd 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 @@ -877,6 +877,9 @@ private boolean fromTemplateArgument(ICPPTemplateArgument p, ICPPTemplateArgumen } } IValue sval = a.getNonTypeValue(); + tval = CPPTemplates.instantiateValue(tval, InstantiationContext.forDeduction(fDeducedArgs), + IntegralValue.MAX_RECURSION_DEPTH); + return tval.equals(sval); }