re PR c++/5919 (ICE when passing variable array to template function)

PR c++/5919
	* g++.dg/template/varmod1.C: New test.

	PR c++/5919
	* pt.c (unify): Use variably_modified_type_p to test validity of
	template argument types.

From-SVN: r59698
This commit is contained in:
Mark Mitchell 2002-12-01 20:46:08 +00:00 committed by Mark Mitchell
parent a82d6da5fc
commit 94fc547cec
4 changed files with 27 additions and 14 deletions

View File

@ -1,5 +1,9 @@
2002-12-01 Mark Mitchell <mark@codesourcery.com>
PR c++/5919
* pt.c (unify): Use variably_modified_type_p to test validity of
template argument types.
PR c++/8727
* cp-tree.h (lang_type_class): Add typeinfo_var.
(CLASSTYPE_TYPEINFO_VAR): New macro.

View File

@ -8852,21 +8852,17 @@ unify (tparms, targs, parm, arg, strict)
return 0;
else if (targ)
return 1;
}
/* Make sure that ARG is not a variable-sized array. (Note that
were talking about variable-sized arrays (like `int[n]'),
rather than arrays of unknown size (like `int[]').) We'll
get very confused by such a type since the bound of the array
will not be computable in an instantiation. Besides, such
types are not allowed in ISO C++, so we can do as we please
here. */
if (TREE_CODE (arg) == ARRAY_TYPE
&& !uses_template_parms (arg)
&& TYPE_DOMAIN (arg)
&& (TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (arg)))
!= INTEGER_CST))
return 1;
/* Make sure that ARG is not a variable-sized array. (Note
that were talking about variable-sized arrays (like
`int[n]'), rather than arrays of unknown size (like
`int[]').) We'll get very confused by such a type since
the bound of the array will not be computable in an
instantiation. Besides, such types are not allowed in
ISO C++, so we can do as we please here. */
if (variably_modified_type_p (arg))
return 1;
}
TREE_VEC_ELT (targs, idx) = arg;
return 0;

View File

@ -1,5 +1,8 @@
2002-12-01 Mark Mitchell <mark@codesourcery.com>
PR c++/5919
* g++.dg/template/varmod1.C: New test.
PR c++/8727
* g++.dg/inherit/typeinfo1.C: New test.

View File

@ -0,0 +1,10 @@
// { dg-options "-w" }
template<typename T> void foo(T);
void bar()
{
int i;
int A[i][i];
foo(A); // { dg-error }
}