Skip to content

Commit

Permalink
PR c++/6620
Browse files Browse the repository at this point in the history
	* 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.


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53517 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
lerdsuwa committed May 16, 2002
1 parent 664dca4 commit 66da0ae
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 23 deletions.
8 changes: 8 additions & 0 deletions gcc/cp/ChangeLog
@@ -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.
Expand Down
33 changes: 10 additions & 23 deletions gcc/cp/pt.c
Expand Up @@ -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
Expand Down Expand Up @@ -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))
Expand Down
36 changes: 36 additions & 0 deletions gcc/testsuite/g++.dg/template/partial1.C
@@ -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();
}

0 comments on commit 66da0ae

Please sign in to comment.