re PR c++/5919 (ICE when passing variable array to template function)
authorMark Mitchell <mark@codesourcery.com>
Sun, 1 Dec 2002 20:46:08 +0000 (20:46 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 1 Dec 2002 20:46:08 +0000 (20:46 +0000)
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

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/varmod1.C [new file with mode: 0644]

index 8c784806e35e08b32f299dd435c0e552bfab9600..da4f5977ddaee3f27ad71f188cb80f70a8bc273d 100644 (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.
index 77b2fd95056bf1e21a2ce64b6e0b7e5440140e67..9f1a382bfa7cafbd21ce51c4f4085809c296d09f 100644 (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;
index 844d5926731e15bf5c3519bc671626ee0189a28b..0d87d1ec168407a7067c2906a6576c78bd39a8f4 100644 (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.
        
diff --git a/gcc/testsuite/g++.dg/template/varmod1.C b/gcc/testsuite/g++.dg/template/varmod1.C
new file mode 100644 (file)
index 0000000..21fdcb6
--- /dev/null
@@ -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 } 
+}