diff options
author | Jakub Jelinek <jakub@redhat.com> | 2019-04-12 23:45:54 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2019-04-12 23:45:54 +0200 |
commit | 60a2c64519087972b16d94f6cca209fa6a3f0940 (patch) | |
tree | 8b402ce47953b06b0ba0f3744ac961fa763a6ce3 | |
parent | bb50312e027994bb5260163a9c021b5444f86257 (diff) | |
download | gcc-60a2c64519087972b16d94f6cca209fa6a3f0940.zip gcc-60a2c64519087972b16d94f6cca209fa6a3f0940.tar.gz gcc-60a2c64519087972b16d94f6cca209fa6a3f0940.tar.bz2 |
re PR c/89933 (ICE in merge_decls, at c/c-decl.c:2517)
PR c/89933
c/
* 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.
cp/
* 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.
testsuite/
* c-c++-common/pr89933.c: New test.
From-SVN: r270329
-rw-r--r-- | gcc/c/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/c/c-decl.c | 17 | ||||
-rw-r--r-- | gcc/cp/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cp/decl.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/c-c++-common/pr89933.c | 5 |
6 files changed, 44 insertions, 14 deletions
diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 076a9a2..c8e5e1a 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,3 +1,10 @@ +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-04-01 Richard Biener <rguenther@suse.de> PR c/71598 diff --git a/gcc/c/c-decl.c b/gcc/c/c-decl.c index 8d5c35a..ef9b874 100644 --- a/gcc/c/c-decl.c +++ b/gcc/c/c-decl.c @@ -2512,13 +2512,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; + } } } diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 212318e..67baed6 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2019-04-12 Jakub Jelinek <jakub@redhat.com> + + PR c/89933 + * 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. + 2019-04-12 Martin Sebor <msebor@redhat.com> PR c/88383 diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c index 2528a8c..67d9244 100644 --- a/gcc/cp/decl.c +++ b/gcc/cp/decl.c @@ -2132,13 +2132,16 @@ next_arg:; 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; + } } } else if (merge_attr) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ed6f731..2951fc8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-04-12 Jakub Jelinek <jakub@redhat.com> + + PR c/89933 + * c-c++-common/pr89933.c: New test. + 2019-04-12 Martin Sebor <msebor@redhat.com> PR c/88383 diff --git a/gcc/testsuite/c-c++-common/pr89933.c b/gcc/testsuite/c-c++-common/pr89933.c new file mode 100644 index 0000000..870504d --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr89933.c @@ -0,0 +1,5 @@ +/* PR c/89933 */ +/* { dg-do compile } */ + +typedef unsigned int a __attribute__ ((__aligned__(8), __may_alias__)); +typedef unsigned int a __attribute__ ((__aligned__(8), __may_alias__)); |