OSDN Git Service

PR c++/54038
[pf3gnuchains/gcc-fork.git] / gcc / cp / tree.c
index 1e98f85..de9e0f6 100644 (file)
@@ -786,7 +786,18 @@ build_cplus_array_type (tree elt_type, tree index_type)
        }
     }
   else
-    t = build_array_type (elt_type, index_type);
+    {
+      if (!TYPE_STRUCTURAL_EQUALITY_P (elt_type)
+         && !(index_type && TYPE_STRUCTURAL_EQUALITY_P (index_type))
+         && (TYPE_CANONICAL (elt_type) != elt_type
+             || (index_type && TYPE_CANONICAL (index_type) != index_type)))
+       /* Make sure that the canonical type is on the appropriate
+          variants list.  */
+       build_cplus_array_type
+         (TYPE_CANONICAL (elt_type),
+          index_type ? TYPE_CANONICAL (index_type) : index_type);
+      t = build_array_type (elt_type, index_type);
+    }
 
   /* We want TYPE_MAIN_VARIANT of an array to strip cv-quals from the
      element type as well, so fix it up if needed.  */
@@ -794,7 +805,6 @@ build_cplus_array_type (tree elt_type, tree index_type)
     {
       tree m = build_cplus_array_type (TYPE_MAIN_VARIANT (elt_type),
                                       index_type);
-      tree c = TYPE_CANONICAL (t);
 
       if (TYPE_MAIN_VARIANT (t) != m)
        {
@@ -802,15 +812,6 @@ build_cplus_array_type (tree elt_type, tree index_type)
          TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (m);
          TYPE_NEXT_VARIANT (m) = t;
        }
-
-      /* If we built a new array type for TYPE_CANONICAL, add
-        that to the list of variants as well.  */
-      if (c && c != t && TYPE_MAIN_VARIANT (c) != m)
-       {
-         TYPE_MAIN_VARIANT (c) = m;
-         TYPE_NEXT_VARIANT (c) = t;
-         TYPE_NEXT_VARIANT (m) = c;
-       }
     }
 
   /* Push these needs up so that initialization takes place