aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2019-08-30 14:36:05 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2019-08-30 14:36:05 +0200
commita779fe47e602f02495793bb7d9c7d84e925fedfa (patch)
treef28493908fc84714d78197a9e6f051d4c24007fc /gcc/c
parenta460e19cedd852a33ef440be455274ed887b4f91 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/c/c-decl.c17
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;
+ }
}
}