aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorFritz Reese <fritzoreese@gmail.com>2016-09-30 11:37:23 +0000
committerFritz Reese <foreese@gcc.gnu.org>2016-09-30 11:37:23 +0000
commit00074dd8e31adf8bd445e4af7ed27dda77985ab4 (patch)
tree3521e5546753b47fbef1a3f3a00dd267561893de /gcc
parent26f391e8067e96e4fba7b531eda9fb80023f2fd2 (diff)
downloadgcc-00074dd8e31adf8bd445e4af7ed27dda77985ab4.zip
gcc-00074dd8e31adf8bd445e4af7ed27dda77985ab4.tar.gz
gcc-00074dd8e31adf8bd445e4af7ed27dda77985ab4.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/interface.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/dec_structure_16.f9035
4 files changed, 50 insertions, 0 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index ea28ae5..03955d6 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 5883e39..3f6774e 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 9e82041..841a6ef 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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.
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 0000000..f9b2671
--- /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