diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-08-30 14:36:05 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-08-30 14:36:05 +0200 |
commit | a779fe47e602f02495793bb7d9c7d84e925fedfa (patch) | |
tree | f28493908fc84714d78197a9e6f051d4c24007fc /gcc/c | |
parent | a460e19cedd852a33ef440be455274ed887b4f91 (diff) | |
download | gcc-a779fe47e602f02495793bb7d9c7d84e925fedfa.zip gcc-a779fe47e602f02495793bb7d9c7d84e925fedfa.tar.gz gcc-a779fe47e602f02495793bb7d9c7d84e925fedfa.tar.bz2 |
backport: re PR c/89933 (ICE in merge_decls, at c/c-decl.c:2517)
Backported from mainline
2019-04-12 Jakub Jelinek <jakub@redhat.com>
PR c/89933
* c-decl.c (merge_decls): When newdecl's type is its main variant,
don't try to remove it from the variant list, but instead assert
it has no variants.
* decl.c (duplicate_decls): When newdecl's type is its main variant,
don't try to remove it from the variant list, but instead assert
it has no variants.
* c-c++-common/pr89933.c: New test.
From-SVN: r275147
Diffstat (limited to 'gcc/c')
-rw-r--r-- | gcc/c/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c/c-decl.c | 17 |
2 files changed, 17 insertions, 7 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index e6108f1..a861fee 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,6 +1,13 @@ 2019-08-30 Jakub Jelinek <jakub@redhat.com> Backported from mainline + 2019-04-12 Jakub Jelinek <jakub@redhat.com> + + PR c/89933 + * c-decl.c (merge_decls): When newdecl's type is its main variant, + don't try to remove it from the variant list, but instead assert + it has no variants. + 2019-03-19 Jakub Jelinek <jakub@redhat.com> PR c/89734 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 8342094..11c63af 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -2348,13 +2348,16 @@ merge_decls (tree newdecl, tree olddecl, tree newtype, tree oldtype) if (TYPE_NAME (TREE_TYPE (newdecl)) == newdecl) { tree remove = TREE_TYPE (newdecl); - for (tree t = TYPE_MAIN_VARIANT (remove); ; - t = TYPE_NEXT_VARIANT (t)) - if (TYPE_NEXT_VARIANT (t) == remove) - { - TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (remove); - break; - } + if (TYPE_MAIN_VARIANT (remove) == remove) + gcc_assert (TYPE_NEXT_VARIANT (remove) == NULL_TREE); + else + for (tree t = TYPE_MAIN_VARIANT (remove); ; + t = TYPE_NEXT_VARIANT (t)) + if (TYPE_NEXT_VARIANT (t) == remove) + { + TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (remove); + break; + } } } |