Fix ICE caused by union types comparing equal to structures.

2016-09-30  Fritz Reese  <fritzoreese@gmail.com>

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
This commit is contained in:
Fritz Reese 2016-09-30 11:37:23 +00:00 committed by Fritz Reese
parent 26f391e806
commit 00074dd8e3
4 changed files with 50 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2016-09-30 Fritz Reese <fritzoreese@gmail.com>
PR fortran/77782
* interface.c (gfc_compare_derived_types): Use gfc_compare_union_types
to compare union types.
2016-09-30 Andre Vehreschild <vehre@gcc.gnu.org>
* trans-array.c (gfc_array_allocate): Use the token from coarray's

View file

@ -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. */

View file

@ -1,3 +1,8 @@
2016-09-30 Fritz Reese <fritzoreese@gmail.com>
PR fortran/77782
* gfortran.dg/dec_structure_16.f90: New testcase.
2016-09-30 Andre Vehreschild <vehre@gcc.gnu.org>
* gfortran.dg/coarray_allocate_10.f08: New test.

View file

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