tree.c (build_qualified_type): Chain the new type to the original type's TYPE_NEXT_PT...
authorEric Botcazou <ebotcazou@adacore.com>
Wed, 9 Nov 2005 23:13:08 +0000 (23:13 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 9 Nov 2005 23:13:08 +0000 (23:13 +0000)
* tree.c (build_qualified_type): Chain the new type to the original
type's TYPE_NEXT_PTR_TO or TYPE_NEXT_REF_TO linked lists if it is
a POINTER_TYPE or a REFERENCE_TYPE respectively.
(build_pointer_type_for_mode): Only return unqualified types.
(build_reference_type_for_mode): Likewise.

From-SVN: r106716

gcc/ChangeLog
gcc/tree.c

index 44efa5b89b45f3764b5cd8416eb54f80300d5c79..b3e05f39c125c6509cb8b8f62e9a3a40eff0581a 100644 (file)
@@ -1,3 +1,11 @@
+2005-11-09  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * tree.c (build_qualified_type): Chain the new type to the original
+       type's TYPE_NEXT_PTR_TO or TYPE_NEXT_REF_TO linked lists if it is
+       a POINTER_TYPE or a REFERENCE_TYPE respectively.
+       (build_pointer_type_for_mode): Only return unqualified types.
+       (build_reference_type_for_mode): Likewise.
+
 2005-11-09  Jakub Jelinek  <jakub@redhat.com>
 
        * Makefile.in (gnucompare): Do comparison of all files using one of
index ccd6cf538ccb0334622f80b369371aa486523ae3..4edccd5c2322a8e63c7c7b08d76458b538e2e49a 100644 (file)
@@ -3702,6 +3702,20 @@ build_qualified_type (tree type, int type_quals)
     {
       t = build_variant_type_copy (type);
       set_type_quals (t, type_quals);
+
+      /* If it's a pointer type, the new variant points to the same type.  */
+      if (TREE_CODE (type) == POINTER_TYPE)
+       {
+         TYPE_NEXT_PTR_TO (t) = TYPE_NEXT_PTR_TO (type);
+         TYPE_NEXT_PTR_TO (type) = t;
+       }
+
+      /* Same for a reference type.  */
+      else if (TREE_CODE (type) == REFERENCE_TYPE)
+       {
+         TYPE_NEXT_REF_TO (t) = TYPE_NEXT_REF_TO (type);
+         TYPE_NEXT_REF_TO (type) = t;
+       }
     }
 
   return t;
@@ -4817,10 +4831,12 @@ build_pointer_type_for_mode (tree to_type, enum machine_mode mode,
       && TREE_CODE (TYPE_POINTER_TO (to_type)) != POINTER_TYPE)
     return TYPE_POINTER_TO (to_type);
 
-  /* First, if we already have a type for pointers to TO_TYPE and it's
-     the proper mode, use it.  */
+  /* First, if we already have an unqualified type for pointers to TO_TYPE
+     and it's the proper mode, use it.  */
   for (t = TYPE_POINTER_TO (to_type); t; t = TYPE_NEXT_PTR_TO (t))
-    if (TYPE_MODE (t) == mode && TYPE_REF_CAN_ALIAS_ALL (t) == can_alias_all)
+    if (TYPE_MODE (t) == mode
+       && !TYPE_QUALS (t)
+       && TYPE_REF_CAN_ALIAS_ALL (t) == can_alias_all)
       return t;
 
   t = make_node (POINTER_TYPE);
@@ -4866,10 +4882,12 @@ build_reference_type_for_mode (tree to_type, enum machine_mode mode,
       && TREE_CODE (TYPE_REFERENCE_TO (to_type)) != REFERENCE_TYPE)
     return TYPE_REFERENCE_TO (to_type);
 
-  /* First, if we already have a type for pointers to TO_TYPE and it's
-     the proper mode, use it.  */
+  /* First, if we already have an unqualified type for references to TO_TYPE
+     and it's the proper mode, use it.  */
   for (t = TYPE_REFERENCE_TO (to_type); t; t = TYPE_NEXT_REF_TO (t))
-    if (TYPE_MODE (t) == mode && TYPE_REF_CAN_ALIAS_ALL (t) == can_alias_all)
+    if (TYPE_MODE (t) == mode
+       && !TYPE_QUALS (t)
+       && TYPE_REF_CAN_ALIAS_ALL (t) == can_alias_all)
       return t;
 
   t = make_node (REFERENCE_TYPE);