Commit 00074dd8 by Fritz Reese Committed by Fritz Reese

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
parent 26f391e8
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> 2016-09-30 Andre Vehreschild <vehre@gcc.gnu.org>
* trans-array.c (gfc_array_allocate): Use the token from coarray's * trans-array.c (gfc_array_allocate): Use the token from coarray's
......
...@@ -589,6 +589,10 @@ gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2) ...@@ -589,6 +589,10 @@ gfc_compare_derived_types (gfc_symbol *derived1, gfc_symbol *derived2)
gcc_assert (derived1 && 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 /* Special case for comparing derived types across namespaces. If the
true names and module names are the same and the module name is true names and module names are the same and the module name is
nonnull, then they are equal. */ nonnull, then they are equal. */
......
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> 2016-09-30 Andre Vehreschild <vehre@gcc.gnu.org>
* gfortran.dg/coarray_allocate_10.f08: New test. * gfortran.dg/coarray_allocate_10.f08: New test.
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment