]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c++/41144 (ice for legal code with -O2 in get_alias_set)
authorRichard Guenther <rguenther@suse.de>
Sun, 6 Sep 2009 16:49:48 +0000 (16:49 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sun, 6 Sep 2009 16:49:48 +0000 (16:49 +0000)
2009-09-06  Richard Guenther  <rguenther@suse.de>

PR middle-end/41144
* tree.c (build_array_type): Do not record types marked
with structural equality in the canonical type hashtable.

* g++.dg/torture/pr41144.C: New testcase.

From-SVN: r151461

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr41144.C [new file with mode: 0644]
gcc/tree.c

index 80be0453ef36a563d11986443577546537da9447..76d93f60fd729b441dfb7bf83ea765aba0e14551 100644 (file)
@@ -1,3 +1,9 @@
+2009-09-06  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/41144
+       * tree.c (build_array_type): Do not record types marked
+       with structural equality in the canonical type hashtable.
+
 2009-09-06  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/41261
index 4712bc5e9b50ef18f6e615870023b2ae73d32db5..b14aaf087bd80bcf630f1ad51615202f741642a4 100644 (file)
@@ -1,3 +1,8 @@
+2009-09-06  Richard Guenther  <rguenther@suse.de>
+
+       PR middle-end/41144
+       * g++.dg/torture/pr41144.C: New testcase.
+
 2009-09-06  Richard Guenther  <rguenther@suse.de>
 
        PR middle-end/41261
diff --git a/gcc/testsuite/g++.dg/torture/pr41144.C b/gcc/testsuite/g++.dg/torture/pr41144.C
new file mode 100644 (file)
index 0000000..64dc117
--- /dev/null
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+
+struct rgba8;
+template<class ColorT> class span_gouraud     {
+public:
+    struct coord_type { };
+    coord_type m_coord[3];
+};
+template<class ColorT> class span_gouraud_rgba : public span_gouraud<ColorT>   
+{
+  typedef ColorT color_type;
+  typedef span_gouraud<color_type> base_type;
+  typedef typename base_type::coord_type coord_type;
+public:
+  void prepare()         {
+      coord_type coord[3];
+  }
+};
+void the_application() {
+    typedef span_gouraud_rgba<rgba8> gouraud_span_gen_type;
+    gouraud_span_gen_type span_gouraud;
+    span_gouraud.prepare();
+}
index 1db7d0a86c33b97bac93b0f7e9f61863fdfba136..a036439cc3f7f9b97e272ae3d48e26ea5ef7b5b9 100644 (file)
@@ -6906,44 +6906,29 @@ build_array_type (tree elt_type, tree index_type)
   t = make_node (ARRAY_TYPE);
   TREE_TYPE (t) = elt_type;
   TYPE_DOMAIN (t) = index_type;
-  
-  if (index_type == 0)
-    {
-      tree save = t;
-      hashcode = iterative_hash_object (TYPE_HASH (elt_type), hashcode);
-      t = type_hash_canon (hashcode, t);
-      if (save == t)
-       layout_type (t);
-
-      if (TYPE_CANONICAL (t) == t)
-       {
-         if (TYPE_STRUCTURAL_EQUALITY_P (elt_type))
-           SET_TYPE_STRUCTURAL_EQUALITY (t);
-         else if (TYPE_CANONICAL (elt_type) != elt_type)
-           TYPE_CANONICAL (t) 
-             = build_array_type (TYPE_CANONICAL (elt_type), index_type);
-       }
+  layout_type (t);
 
-      return t;
-    }
+  /* If the element type is incomplete at this point we get marked for
+     structural equality.  Do not record these types in the canonical
+     type hashtable.  */
+  if (TYPE_STRUCTURAL_EQUALITY_P (t))
+    return t;
 
   hashcode = iterative_hash_object (TYPE_HASH (elt_type), hashcode);
-  hashcode = iterative_hash_object (TYPE_HASH (index_type), hashcode);
+  if (index_type)
+    hashcode = iterative_hash_object (TYPE_HASH (index_type), hashcode);
   t = type_hash_canon (hashcode, t);
 
-  if (!COMPLETE_TYPE_P (t))
-    layout_type (t);
-
   if (TYPE_CANONICAL (t) == t)
     {
       if (TYPE_STRUCTURAL_EQUALITY_P (elt_type)
-         || TYPE_STRUCTURAL_EQUALITY_P (index_type))
+         || (index_type && TYPE_STRUCTURAL_EQUALITY_P (index_type)))
        SET_TYPE_STRUCTURAL_EQUALITY (t);
       else if (TYPE_CANONICAL (elt_type) != elt_type
-              || TYPE_CANONICAL (index_type) != index_type)
+              || (index_type && TYPE_CANONICAL (index_type) != index_type))
        TYPE_CANONICAL (t) 
          = build_array_type (TYPE_CANONICAL (elt_type),
-                             TYPE_CANONICAL (index_type));
+                             index_type ? TYPE_CANONICAL (index_type) : NULL);
     }
 
   return t;