Commit c08d28ac by Nathan Sidwell Committed by Nathan Sidwell

re PR c++/70512 (ICE on valid code on x86_64-linux-gnu: canonical types differ for identical types)

	PR c++/70512
	* class.c (fixup_may_alias): New.
	(fixup_attribute_variants): Call it.

	* g++.dg/ext/attribute-may-alias-5.C: New.

From-SVN: r234768
parent d5a28db0
2016-04-05 Nathan Sidwell <nathan@acm.org>
PR c++/70512
* class.c (fixup_may_alias): New.
(fixup_attribute_variants): Call it.
2016-04-05 Patrick Palka <ppalka@gcc.gnu.org> 2016-04-05 Patrick Palka <ppalka@gcc.gnu.org>
PR c++/70452 PR c++/70452
......
...@@ -1978,6 +1978,21 @@ fixup_type_variants (tree t) ...@@ -1978,6 +1978,21 @@ fixup_type_variants (tree t)
} }
} }
/* KLASS is a class that we're applying may_alias to after the body is
parsed. Fixup any POINTER_TO and REFERENCE_TO types. The
canonical type(s) will be implicitly updated. */
static void
fixup_may_alias (tree klass)
{
tree t;
for (t = TYPE_POINTER_TO (klass); t; t = TYPE_NEXT_PTR_TO (t))
TYPE_REF_CAN_ALIAS_ALL (t) = true;
for (t = TYPE_REFERENCE_TO (klass); t; t = TYPE_NEXT_REF_TO (t))
TYPE_REF_CAN_ALIAS_ALL (t) = true;
}
/* Early variant fixups: we apply attributes at the beginning of the class /* Early variant fixups: we apply attributes at the beginning of the class
definition, and we need to fix up any variants that have already been definition, and we need to fix up any variants that have already been
made via elaborated-type-specifier so that check_qualified_type works. */ made via elaborated-type-specifier so that check_qualified_type works. */
...@@ -1993,6 +2008,10 @@ fixup_attribute_variants (tree t) ...@@ -1993,6 +2008,10 @@ fixup_attribute_variants (tree t)
tree attrs = TYPE_ATTRIBUTES (t); tree attrs = TYPE_ATTRIBUTES (t);
unsigned align = TYPE_ALIGN (t); unsigned align = TYPE_ALIGN (t);
bool user_align = TYPE_USER_ALIGN (t); bool user_align = TYPE_USER_ALIGN (t);
bool may_alias = lookup_attribute ("may_alias", attrs);
if (may_alias)
fixup_may_alias (t);
for (variants = TYPE_NEXT_VARIANT (t); for (variants = TYPE_NEXT_VARIANT (t);
variants; variants;
...@@ -2007,6 +2026,8 @@ fixup_attribute_variants (tree t) ...@@ -2007,6 +2026,8 @@ fixup_attribute_variants (tree t)
else else
TYPE_USER_ALIGN (variants) = user_align; TYPE_USER_ALIGN (variants) = user_align;
TYPE_ALIGN (variants) = valign; TYPE_ALIGN (variants) = valign;
if (may_alias)
fixup_may_alias (variants);
} }
} }
......
2016-04-05 Nathan Sidwell <nathan@acm.org>
PR c++/70512
* g++.dg/ext/attribute-may-alias-5.C: New.
2016-04-05 Jakub Jelinek <jakub@redhat.com> 2016-04-05 Jakub Jelinek <jakub@redhat.com>
PR c++/70336 PR c++/70336
......
// PR c++/70512
struct S
{
S& operator= (int)
{
return *this;
}
} __attribute__ ((__may_alias__));
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment