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:
parent
2605d809d9
commit
e2005c8d2f
3 changed files with 54 additions and 23 deletions
|
@ -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.
|
||||
|
|
33
gcc/cp/pt.c
33
gcc/cp/pt.c
|
@ -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))
|
||||
|
|
36
gcc/testsuite/g++.dg/template/partial1.C
Normal file
36
gcc/testsuite/g++.dg/template/partial1.C
Normal 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();
|
||||
}
|
Loading…
Add table
Reference in a new issue