diff options
author | Richard Guenther <rguenther@suse.de> | 2008-07-15 15:07:46 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2008-07-15 15:07:46 +0000 |
commit | ac7ee6adbe648bf0144976989030fac57798f6f9 (patch) | |
tree | 0bcb9d1a50290f889709fe4909b9f2295332dc22 /gcc/tree.c | |
parent | 96c72efecd3d87a178da3ee4b4d0eff5f83f833c (diff) | |
download | gcc-ac7ee6adbe648bf0144976989030fac57798f6f9.zip gcc-ac7ee6adbe648bf0144976989030fac57798f6f9.tar.gz gcc-ac7ee6adbe648bf0144976989030fac57798f6f9.tar.bz2 |
re PR middle-end/36369 (may_alias broken with previous uses of non attributed type in some cases)
2008-07-15 Richard Guenther <rguenther@suse.de>
PR middle-end/36369
* c-common.c (strict_aliasing_warning): Do not warn for
TYPE_REF_CAN_ALIAS_ALL pointers.
(c_common_get_alias_set): may_alias types are not special.
* tree.c (build_pointer_type_for_mode): Look up the may_alias
attribute and set can_ref_all accordingly.
(build_reference_type_for_mode): Likewise.
* doc/extend.texi (may_alias): Clarify.
* gcc.dg/Wstrict-aliasing-bogus-ref-all.c: New testcase.
From-SVN: r137843
Diffstat (limited to 'gcc/tree.c')
-rw-r--r-- | gcc/tree.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -5499,6 +5499,11 @@ build_pointer_type_for_mode (tree to_type, enum machine_mode mode, if (to_type == error_mark_node) return error_mark_node; + /* If the pointed-to type has the may_alias attribute set, force + a TYPE_REF_CAN_ALIAS_ALL pointer to be generated. */ + if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (to_type))) + can_alias_all = true; + /* In some cases, languages will have things that aren't a POINTER_TYPE (such as a RECORD_TYPE for fat pointers in Ada) as TYPE_POINTER_TO. In that case, return that type without regard to the rest of our @@ -5555,6 +5560,14 @@ build_reference_type_for_mode (tree to_type, enum machine_mode mode, { tree t; + if (to_type == error_mark_node) + return error_mark_node; + + /* If the pointed-to type has the may_alias attribute set, force + a TYPE_REF_CAN_ALIAS_ALL pointer to be generated. */ + if (lookup_attribute ("may_alias", TYPE_ATTRIBUTES (to_type))) + can_alias_all = true; + /* In some cases, languages will have things that aren't a REFERENCE_TYPE (such as a RECORD_TYPE for fat pointers in Ada) as TYPE_REFERENCE_TO. In that case, return that type without regard to the rest of our |