re PR c++/16129 (g++.old-deja/g++.eh/catch[35679]*.C)
authorMark Mitchell <mark@codesourcery.com>
Fri, 25 Jun 2004 19:17:49 +0000 (19:17 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Fri, 25 Jun 2004 19:17:49 +0000 (19:17 +0000)
PR wrong-code/16129
* alias.c (get_alias_set): Adjust setting of
DECL_POINTER_ALIAS_SET for pointers to aggregates.

From-SVN: r83674

gcc/ChangeLog
gcc/alias.c

index 1544bd23cf4ae550812092a1c59c712a1b1624cb..4de541bbb6c9a83bbac9f63c8d85990b2dd03199 100644 (file)
@@ -1,3 +1,9 @@
+2004-06-25  Mark Mitchell  <mark@codesourcery.com>
+
+       PR wrong-code/16129
+       * alias.c (get_alias_set): Adjust setting of
+       DECL_POINTER_ALIAS_SET for pointers to aggregates.
+
 2004-06-24  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
 
        * tree-inline.c (remap_type): Arrange to have just one pointer type
index b8661d7b6bdbe98cabc1042afa983bd004e4c93c..ce358c41d359f23b6ba3728b3e0b85eb7dae8d04 100644 (file)
@@ -507,6 +507,8 @@ get_alias_set (tree t)
              /* If we haven't computed the actual alias set, do it now.  */
              if (DECL_POINTER_ALIAS_SET (decl) == -2)
                {
+                 tree pointed_to_type = TREE_TYPE (TREE_TYPE (decl));
+
                  /* No two restricted pointers can point at the same thing.
                     However, a restricted pointer can point at the same thing
                     as an unrestricted pointer, if that unrestricted pointer
@@ -515,11 +517,22 @@ get_alias_set (tree t)
                     alias set for the type pointed to by the type of the
                     decl.  */
                  HOST_WIDE_INT pointed_to_alias_set
-                   = get_alias_set (TREE_TYPE (TREE_TYPE (decl)));
+                   = get_alias_set (pointed_to_type);
 
                  if (pointed_to_alias_set == 0)
                    /* It's not legal to make a subset of alias set zero.  */
                    DECL_POINTER_ALIAS_SET (decl) = 0;
+                 else if (AGGREGATE_TYPE_P (pointed_to_type))
+                   /* For an aggregate, we must treat the restricted
+                      pointer the same as an ordinary pointer.  If we
+                      were to make the type pointed to by the
+                      restricted pointer a subset of the pointed-to
+                      type, then we would believe that other subsets
+                      of the pointed-to type (such as fields of that
+                      type) do not conflict with the type pointed to
+                      by the restricted pointer.   */
+                   DECL_POINTER_ALIAS_SET (decl)
+                     = pointed_to_alias_set;
                  else
                    {
                      DECL_POINTER_ALIAS_SET (decl) = new_alias_set ();