re PR c++/6620 (partial template specialization on int)

PR c++/6620
	* pt.c (verify_class_unification): Don't check if PARM is template
	parameter dependent.  Simplify.
	(unify) [TEMPLATE_PARM_INDEX]: Handle when ARG is a template
	parameter dependent expression.

From-SVN: r53517
This commit is contained in:
Kriang Lerdsuwanakij 2002-05-16 13:43:50 +00:00 committed by Kriang Lerdsuwanakij
parent 2605d809d9
commit e2005c8d2f
3 changed files with 54 additions and 23 deletions

View File

@ -1,3 +1,11 @@
2002-05-15 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
PR c++/6620
* pt.c (verify_class_unification): Don't check if PARM is template
parameter dependent. Simplify.
(unify) [TEMPLATE_PARM_INDEX]: Handle when ARG is a template
parameter dependent expression.
2002-05-14 Jason Merrill <jason@redhat.com>
* rtti.c (get_tinfo_decl): Don't call comdat_linkage.

View File

@ -8307,29 +8307,12 @@ static int
verify_class_unification (targs, parms, args)
tree targs, parms, args;
{
int i;
int nparms = TREE_VEC_LENGTH (parms);
tree new_parms = tsubst (parms, add_outermost_template_args (args, targs),
tf_none, NULL_TREE);
if (new_parms == error_mark_node)
parms = tsubst (parms, add_outermost_template_args (args, targs),
tf_none, NULL_TREE);
if (parms == error_mark_node)
return 1;
args = INNERMOST_TEMPLATE_ARGS (args);
for (i = 0; i < nparms; i++)
{
tree parm = TREE_VEC_ELT (new_parms, i);
tree arg = TREE_VEC_ELT (args, i);
/* In case we are deducing from a function argument of a function
templates, some parameters may not be deduced yet. So we
make sure that only fully substituted elements of PARM are
compared below. */
if (!uses_template_parms (parm) && !template_args_equal (parm, arg))
return 1;
}
return 0;
return !comp_template_args (parms, INNERMOST_TEMPLATE_ARGS (args));
}
/* PARM is a template class (perhaps with unbound template
@ -8812,8 +8795,12 @@ unify (tparms, targs, parm, arg, strict)
deduced from an array bound may be of any integral type.
The non-type parameter might use already deduced type parameters. */
tparm = tsubst (TREE_TYPE (parm), targs, 0, NULL_TREE);
if (same_type_p (TREE_TYPE (arg), tparm))
/* OK */;
if (!TREE_TYPE (arg))
/* Template-parameter dependent expression. Just accept it for now.
It will later be processed in convert_template_argument. */
;
else if (same_type_p (TREE_TYPE (arg), tparm))
/* OK */;
else if ((strict & UNIFY_ALLOW_INTEGER)
&& (TREE_CODE (tparm) == INTEGER_TYPE
|| TREE_CODE (tparm) == BOOLEAN_TYPE))

View File

@ -0,0 +1,36 @@
// { dg-do run }
// Origin: Jo Totland <jototland@hotmail.com>
// PR c++/6620
// Partial specialization involving expression of non-type template
// parameter causes ICE.
extern "C" void abort();
template <int N> struct HoldInt
{
};
template <class A, class B> struct Add
{
};
template <int N> struct Add<HoldInt<N>, HoldInt<-N> >
{
typedef int type;
int f() { return 0; }
};
template <int N, int M>
struct Add<HoldInt<N>, HoldInt<M> >
{
typedef HoldInt<N+M> type;
int f() { return 1; }
};
int main() {
Add<HoldInt<1>, HoldInt<-1> > a;
Add<HoldInt<1>, HoldInt<-2> > b;
if (a.f() != 0 || b.f() != 1)
abort();
}