backport: re PR c++/90108 (ICE: Segmentation fault (in c_tree_chain_next))
Backported from mainline 2019-04-19 Jakub Jelinek <jakub@redhat.com> PR c++/90108 * c-decl.c (merge_decls): If remove is main variant and DECL_ORIGINAL_TYPE is some other type, remove a DECL_ORIGINAL_TYPE variant that has newdecl as TYPE_NAME if any. * decl.c (duplicate_decls): If remove is main variant and DECL_ORIGINAL_TYPE is some other type, remove a DECL_ORIGINAL_TYPE variant that has newdecl as TYPE_NAME if any. * c-c++-common/pr90108.c: New test. From-SVN: r275150
This commit is contained in:
parent
08924d873b
commit
79797c9781
|
@ -1,6 +1,13 @@
|
|||
2019-08-30 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
Backported from mainline
|
||||
2019-04-19 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/90108
|
||||
* c-decl.c (merge_decls): If remove is main variant and
|
||||
DECL_ORIGINAL_TYPE is some other type, remove a DECL_ORIGINAL_TYPE
|
||||
variant that has newdecl as TYPE_NAME if any.
|
||||
|
||||
2019-04-12 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/89933
|
||||
|
|
|
@ -2349,7 +2349,24 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype)
|
|||
{
|
||||
tree remove = TREE_TYPE (newdecl);
|
||||
if (TYPE_MAIN_VARIANT (remove) == remove)
|
||||
gcc_assert (TYPE_NEXT_VARIANT (remove) == NULL_TREE);
|
||||
{
|
||||
gcc_assert (TYPE_NEXT_VARIANT (remove) == NULL_TREE);
|
||||
/* If remove is the main variant, no need to remove that
|
||||
from the list. One of the DECL_ORIGINAL_TYPE
|
||||
variants, e.g. created for aligned attribute, might still
|
||||
refer to the newdecl TYPE_DECL though, so remove that one
|
||||
in that case. */
|
||||
if (DECL_ORIGINAL_TYPE (newdecl)
|
||||
&& DECL_ORIGINAL_TYPE (newdecl) != remove)
|
||||
for (tree t = TYPE_MAIN_VARIANT (DECL_ORIGINAL_TYPE (newdecl));
|
||||
t; t = TYPE_MAIN_VARIANT (t))
|
||||
if (TYPE_NAME (TYPE_NEXT_VARIANT (t)) == newdecl)
|
||||
{
|
||||
TYPE_NEXT_VARIANT (t)
|
||||
= TYPE_NEXT_VARIANT (TYPE_NEXT_VARIANT (t));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
for (tree t = TYPE_MAIN_VARIANT (remove); ;
|
||||
t = TYPE_NEXT_VARIANT (t))
|
||||
|
|
|
@ -1,6 +1,13 @@
|
|||
2019-08-30 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
Backported from mainline
|
||||
2019-04-19 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/90108
|
||||
* decl.c (duplicate_decls): If remove is main variant and
|
||||
DECL_ORIGINAL_TYPE is some other type, remove a DECL_ORIGINAL_TYPE
|
||||
variant that has newdecl as TYPE_NAME if any.
|
||||
|
||||
2019-04-12 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c/89933
|
||||
|
|
|
@ -2131,7 +2131,24 @@ duplicate_decls (tree newdecl, tree olddecl, bool newdecl_is_friend)
|
|||
{
|
||||
tree remove = TREE_TYPE (newdecl);
|
||||
if (TYPE_MAIN_VARIANT (remove) == remove)
|
||||
gcc_assert (TYPE_NEXT_VARIANT (remove) == NULL_TREE);
|
||||
{
|
||||
gcc_assert (TYPE_NEXT_VARIANT (remove) == NULL_TREE);
|
||||
/* If remove is the main variant, no need to remove that
|
||||
from the list. One of the DECL_ORIGINAL_TYPE
|
||||
variants, e.g. created for aligned attribute, might still
|
||||
refer to the newdecl TYPE_DECL though, so remove that one
|
||||
in that case. */
|
||||
if (tree orig = DECL_ORIGINAL_TYPE (newdecl))
|
||||
if (orig != remove)
|
||||
for (tree t = TYPE_MAIN_VARIANT (orig); t;
|
||||
t = TYPE_MAIN_VARIANT (t))
|
||||
if (TYPE_NAME (TYPE_NEXT_VARIANT (t)) == newdecl)
|
||||
{
|
||||
TYPE_NEXT_VARIANT (t)
|
||||
= TYPE_NEXT_VARIANT (TYPE_NEXT_VARIANT (t));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
for (tree t = TYPE_MAIN_VARIANT (remove); ;
|
||||
t = TYPE_NEXT_VARIANT (t))
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
2019-08-30 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
Backported from mainline
|
||||
2019-04-19 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR c++/90108
|
||||
* c-c++-common/pr90108.c: New test.
|
||||
|
||||
2019-04-16 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR rtl-optimization/90082
|
||||
|
|
|
@ -0,0 +1,6 @@
|
|||
/* PR c++/90108 */
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "--param ggc-min-heapsize=0" } */
|
||||
|
||||
typedef unsigned int a __attribute__ ((__aligned__(8), __may_alias__));
|
||||
typedef unsigned int a __attribute__ ((__aligned__(8), __may_alias__));
|
Loading…
Reference in New Issue