mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-23 12:10:57 +08:00
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
This commit is contained in:
parent
d5a28db09e
commit
c08d28acf8
@ -1,3 +1,9 @@
|
||||
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>
|
||||
|
||||
PR c++/70452
|
||||
|
@ -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
|
||||
definition, and we need to fix up any variants that have already been
|
||||
made via elaborated-type-specifier so that check_qualified_type works. */
|
||||
@ -1993,6 +2008,10 @@ fixup_attribute_variants (tree t)
|
||||
tree attrs = TYPE_ATTRIBUTES (t);
|
||||
unsigned align = TYPE_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);
|
||||
variants;
|
||||
@ -2007,6 +2026,8 @@ fixup_attribute_variants (tree t)
|
||||
else
|
||||
TYPE_USER_ALIGN (variants) = user_align;
|
||||
TYPE_ALIGN (variants) = valign;
|
||||
if (may_alias)
|
||||
fixup_may_alias (variants);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1,3 +1,8 @@
|
||||
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>
|
||||
|
||||
PR c++/70336
|
||||
|
9
gcc/testsuite/g++.dg/ext/attribute-may-alias-5.C
Normal file
9
gcc/testsuite/g++.dg/ext/attribute-may-alias-5.C
Normal file
@ -0,0 +1,9 @@
|
||||
// PR c++/70512
|
||||
|
||||
struct S
|
||||
{
|
||||
S& operator= (int)
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
} __attribute__ ((__may_alias__));
|
Loading…
x
Reference in New Issue
Block a user