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:
parent
26f391e806
commit
00074dd8e3
4 changed files with 50 additions and 0 deletions
|
@ -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
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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.
|
||||
|
|
35
gcc/testsuite/gfortran.dg/dec_structure_16.f90
Normal file
35
gcc/testsuite/gfortran.dg/dec_structure_16.f90
Normal 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
|
Loading…
Add table
Reference in a new issue