1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-04-29 19:45:01 +02:00

Bug 352859: Matching of template template parameters.

This commit is contained in:
Markus Schorn 2011-07-27 16:37:01 +02:00
parent df4c17ffdc
commit 947aacd42b
2 changed files with 49 additions and 25 deletions

View file

@ -4532,8 +4532,8 @@ public class AST2TemplateTests extends AST2BaseTest {
// X<A> xa; // okay
// X<B> xb; // ill-formed: default arguments for the parameters of a template template argument are ignored
// X<C> xc; // ill-formed: a template parameter pack does not match a template parameter
// Y<A> ya; // ill-formed: a template parameter pack does not match a template parameter
// Y<B> yb; // ill-formed: a template parameter pack does not match a template parameter
// Y<A> ya; // okay
// Y<B> yb; // okay
// Y<C> yc; // okay
public void testVariadicTemplateExamples_280909f() throws Exception {
final String code= getAboveComment();
@ -4541,8 +4541,8 @@ public class AST2TemplateTests extends AST2BaseTest {
bh.assertNonProblem("X<A>", 4);
bh.assertProblem("X<B>", 4);
bh.assertProblem("X<C>", 4);
bh.assertProblem("Y<A>", 4);
bh.assertProblem("Y<B>", 4);
bh.assertNonProblem("Y<A>", 4);
bh.assertNonProblem("Y<B>", 4);
bh.assertNonProblem("Y<C>", 4);
}
@ -5439,4 +5439,19 @@ public class AST2TemplateTests extends AST2BaseTest {
public void testTemplateParameterWithoutName_352266() throws Exception {
parseAndCheckBindings();
}
// template<template<typename, typename...> class T> struct CTTP{ };
//
// template<typename T> struct CT1{ };
// template<typename T1, typename T2> struct CT2{ };
// template<typename T1, typename T2, typename T3> struct CT3{ };
// template<typename T1, typename T2, typename T3, typename... T4> struct CT4{ };
//
// typedef CTTP<CT1> a;
// typedef CTTP<CT2> b;
// typedef CTTP<CT3> c;
// typedef CTTP<CT4> d;
public void testTemplateTemplateParameterMatching_352859() throws Exception {
parseAndCheckBindings();
}
}

View file

@ -1981,7 +1981,7 @@ public class CPPTemplates {
try {
pParams = ((ICPPTemplateTemplateParameter) param).getTemplateParameters();
aParams = ((ICPPTemplateDefinition) t).getTemplateParameters();
if (!compareTemplateParameters(pParams, aParams))
if (!matchTemplateTemplateParameters(pParams, aParams))
return null;
} catch (DOMException e) {
return null;
@ -2015,48 +2015,57 @@ public class CPPTemplates {
return null;
}
private static boolean compareTemplateParameters(ICPPTemplateParameter[] params1,
ICPPTemplateParameter[] params2) throws DOMException {
int size = params1.length;
if (params2.length != size) {
return false;
}
for (int i = 0; i < size; i++) {
final ICPPTemplateParameter p1 = params1[i];
final ICPPTemplateParameter p2 = params2[i];
if (p1.isParameterPack() != p2.isParameterPack())
private static boolean matchTemplateTemplateParameters(ICPPTemplateParameter[] pParams,
ICPPTemplateParameter[] aParams) throws DOMException {
int pi=0;
int ai=0;
while (pi < pParams.length && ai < aParams.length) {
final ICPPTemplateParameter pp = pParams[pi];
final ICPPTemplateParameter ap = aParams[ai];
// A parameter pack does not match a regular template parameter.
if (ap.isParameterPack() && !pp.isParameterPack())
return false;
boolean pb= p1 instanceof ICPPTemplateTypeParameter;
boolean ab= p2 instanceof ICPPTemplateTypeParameter;
boolean pb= pp instanceof ICPPTemplateTypeParameter;
boolean ab= ap instanceof ICPPTemplateTypeParameter;
if (pb != ab)
return false;
if (pb) {
// Both are template type parameters
} else {
pb= p1 instanceof ICPPTemplateNonTypeParameter;
ab= p2 instanceof ICPPTemplateNonTypeParameter;
pb= pp instanceof ICPPTemplateNonTypeParameter;
ab= ap instanceof ICPPTemplateNonTypeParameter;
if (pb != ab)
return false;
if (pb) {
// Both are non-type parameters
} else {
if (!(p1 instanceof ICPPTemplateTemplateParameter) ||
!(p2 instanceof ICPPTemplateTemplateParameter)) {
if (!(pp instanceof ICPPTemplateTemplateParameter) ||
!(ap instanceof ICPPTemplateTemplateParameter)) {
assert false;
return false;
}
if (!compareTemplateParameters(((ICPPTemplateTemplateParameter) p1).getTemplateParameters(),
((ICPPTemplateTemplateParameter) p2).getTemplateParameters()) )
if (!matchTemplateTemplateParameters(((ICPPTemplateTemplateParameter) pp).getTemplateParameters(),
((ICPPTemplateTemplateParameter) ap).getTemplateParameters()) )
return false;
}
}
if (!pp.isParameterPack())
pi++;
ai++;
}
return true;
if (pi < pParams.length) {
if (pi == pParams.length - 1 && pParams[pi].isParameterPack())
return true;
return false;
}
return ai == aParams.length;
}
/**