OSDN Git Service

PR c++/54038
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Jul 2012 16:11:58 +0000 (16:11 +0000)
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 20 Jul 2012 16:11:58 +0000 (16:11 +0000)
* tree.c (build_cplus_array_type): Use build_cplus_array_type to build
canonical array type rather than mess with its TYPE_*_VARIANT.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_7-branch@189720 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/tree.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/other/array7.C [new file with mode: 0644]

index 8560c88..ba3d482 100644 (file)
@@ -1,3 +1,9 @@
+2012-07-20  Jason Merrill  <jason@redhat.com>
+
+       PR c++/54038
+       * tree.c (build_cplus_array_type): Use build_cplus_array_type to build
+       canonical array type rather than mess with its TYPE_*_VARIANT.
+
 2012-07-19  Jason Merrill  <jason@redhat.com>
 
        PR c++/54026
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
index efaf1dc..00d9656 100644 (file)
@@ -1,3 +1,8 @@
+2012-07-20  Jason Merrill  <jason@redhat.com>
+
+       PR c++/54038
+       * g++.dg/other/array7.C: New.
+
 2012-07-19  Jason Merrill  <jason@redhat.com>
 
        PR c++/54026
diff --git a/gcc/testsuite/g++.dg/other/array7.C b/gcc/testsuite/g++.dg/other/array7.C
new file mode 100644 (file)
index 0000000..72322f0
--- /dev/null
@@ -0,0 +1,9 @@
+// PR c++/54038
+
+extern const char *const v[];
+typedef char T;
+void foo (const T *const[]);
+struct A
+{
+  static const char *const a[];
+};