re PR c++/13494 (ICE on bidimensional array subscription in template function.)
authorNathan Sidwell <nathan@codesourcery.com>
Tue, 30 Dec 2003 10:07:13 +0000 (10:07 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Tue, 30 Dec 2003 10:07:13 +0000 (10:07 +0000)
cp:
PR c++/13494
* tree.c (build_cplus_array_type_1): Only build a minimal array
type for dependent types or domains.
testsuite:
PR c++/13494
* g++.dg/template/array2-1.C: New test.
* g++.dg/template/array2-2.C: New test.

From-SVN: r75225

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/array2-1.C [new file with mode: 0644]
gcc/testsuite/g++.dg/template/array2-2.C [new file with mode: 0644]

index 1d61141af0423f3a11db200607282e94fad2b3a2..15947ba7a3b3c400b4c14264238dfef07e0c3e13 100644 (file)
@@ -1,3 +1,9 @@
+2003-12-30  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/13494
+       * tree.c (build_cplus_array_type_1): Only build a minimal array
+       type for dependent types or domains.
+
 2003-12-29  Nathan Sidwell  <nathan@codesourcery.com>
 
        PR c++/12774
index 426c3d7c9ed09b4c9485cfe1a23c5ca42b6ae1b0..bedbbe96b444bfdbd0ca65a5fb8ecc883fcf3808 100644 (file)
@@ -363,14 +363,9 @@ build_cplus_array_type_1 (tree elt_type, tree index_type)
   if (elt_type == error_mark_node || index_type == error_mark_node)
     return error_mark_node;
 
-  /* Don't do the minimal thing just because processing_template_decl is
-     set; we want to give string constants the right type immediately, so
-     we don't have to fix them up at instantiation time.  */
-  if ((processing_template_decl
-       && index_type && TYPE_MAX_VALUE (index_type)
-       && TREE_CODE (TYPE_MAX_VALUE (index_type)) != INTEGER_CST)
-      || uses_template_parms (elt_type) 
-      || (index_type && uses_template_parms (index_type)))
+  if (dependent_type_p (elt_type)
+      || (index_type
+         && value_dependent_expression_p (TYPE_MAX_VALUE (index_type))))
     {
       t = make_node (ARRAY_TYPE);
       TREE_TYPE (t) = elt_type;
index 879d4ee88ca48c350639a628d3cf6f4aaebf5477..992e6f4345a892d2bb94fe4256b6f6eb6d95f028 100644 (file)
@@ -1,3 +1,9 @@
+2003-12-30  Nathan Sidwell  <nathan@codesourcery.com>
+
+       PR c++/13494
+       * g++.dg/template/array2-1.C: New test.
+       * g++.dg/template/array2-2.C: New test.
+
 2003-12-29  Mark Mitchell  <mark@codesourcery.com>
 
        * g++.old-deja/g++.pt/static11.C: Correct XFAIL syntax.
diff --git a/gcc/testsuite/g++.dg/template/array2-1.C b/gcc/testsuite/g++.dg/template/array2-1.C
new file mode 100644 (file)
index 0000000..2980a1f
--- /dev/null
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=1" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2003 <nathan@codesourcery.com>
+
+// PR c++/13494. ICE
+
+template<typename T>
+int foo(int d[][4])
+{
+  return d[0][0];
+}
+
diff --git a/gcc/testsuite/g++.dg/template/array2-2.C b/gcc/testsuite/g++.dg/template/array2-2.C
new file mode 100644 (file)
index 0000000..dd3e7f0
--- /dev/null
@@ -0,0 +1,14 @@
+// { dg-do compile }
+// { dg-options "-fabi-version=2" }
+
+// Copyright (C) 2003 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 29 Dec 2003 <nathan@codesourcery.com>
+
+// PR c++/13494. ICE
+
+template<typename T>
+int foo(int d[][4])
+{
+  return d[0][0];
+}
+