From: Fritz Reese Date: Fri, 30 Sep 2016 11:37:23 +0000 (+0000) Subject: Fix ICE caused by union types comparing equal to structures. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=00074dd8e31adf8bd445e4af7ed27dda77985ab4;p=gcc.git Fix ICE caused by union types comparing equal to structures. 2016-09-30 Fritz Reese Fix ICE caused by union types comparing equal to structures. PR fortran/77782 * gcc/fortran/interface.c (gfc_compare_derived_types): Use gfc_compare_union_types to compare union types. PR fortran/77782 * gcc/testsuite/gfortran.dg/dec_structure_16.f90: New testcase. From-SVN: r240651 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ea28ae55f93..03955d6ab96 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2016-09-30 Fritz Reese + + PR fortran/77782 + * interface.c (gfc_compare_derived_types): Use gfc_compare_union_types + to compare union types. + 2016-09-30 Andre Vehreschild * trans-array.c (gfc_array_allocate): Use the token from coarray's diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 5883e390d31..3f6774e630b 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -589,6 +589,10 @@ gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2) gcc_assert (derived1 && derived2); + /* Compare UNION types specially. */ + if (derived1->attr.flavor == FL_UNION || derived2->attr.flavor == FL_UNION) + return gfc_compare_union_types (derived1, derived2); + /* Special case for comparing derived types across namespaces. If the true names and module names are the same and the module name is nonnull, then they are equal. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9e8204174bc..841a6ef6e7f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-09-30 Fritz Reese + + PR fortran/77782 + * gfortran.dg/dec_structure_16.f90: New testcase. + 2016-09-30 Andre Vehreschild * gfortran.dg/coarray_allocate_10.f08: New test. diff --git a/gcc/testsuite/gfortran.dg/dec_structure_16.f90 b/gcc/testsuite/gfortran.dg/dec_structure_16.f90 new file mode 100644 index 00000000000..f9b267110e8 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/dec_structure_16.f90 @@ -0,0 +1,35 @@ +! { dg-do compile } +! { dg-options "-fdec-structure" } +! +! PR fortran/77782 +! +! Test an ICE where a union might be considered equal to a structure, +! causing the union's backend_decl to be replaced with that of the structure. +! + +program p + +structure /s1/ + union + map + integer(4) a + end map + map + real(4) b + end map + end union +end structure + +structure /s2/ + union ! regression: if this union == s1, we ICE in gfc_get_union_type + map + integer(2) x, y + integer(4) z + end map + end union +end structure + +record /s1/ r1 +r1.a = 0 + +end