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:
Jakub Jelinek 2019-08-30 14:38:31 +02:00 committed by Jakub Jelinek
parent 08924d873b
commit 79797c9781
6 changed files with 61 additions and 2 deletions

View File

@ -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

View File

@ -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))

View File

@ -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

View File

@ -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))

View File

@ -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

View File

@ -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__));