aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/interface.c
diff options
context:
space:
mode:
authorFritz Reese <fritzoreese@gmail.com>2016-09-30 11:42:31 +0000
committerFritz Reese <foreese@gcc.gnu.org>2016-09-30 11:42:31 +0000
commitc39747d24b7bc8b589393b5bf3e791cbe0176c7b (patch)
treed0d437c53defc235cbbb78ba79cff3acd78a352b /gcc/fortran/interface.c
parent00074dd8e31adf8bd445e4af7ed27dda77985ab4 (diff)
downloadgcc-c39747d24b7bc8b589393b5bf3e791cbe0176c7b.zip
gcc-c39747d24b7bc8b589393b5bf3e791cbe0176c7b.tar.gz
gcc-c39747d24b7bc8b589393b5bf3e791cbe0176c7b.tar.bz2
Fix ICE for maps with zero components.
2016-09-30 Fritz Reese <fritzoreese@gmail.com> Fix ICE for maps with zero components. PR fortran/77764 * gcc/fortran/interface.c (gfc_compare_union_types): Null-guard map components. PR fortran/77764 * gcc/testsuite/gfortran.dg/dec_union_8.f90: New testcase. From-SVN: r240652
Diffstat (limited to 'gcc/fortran/interface.c')
-rw-r--r--gcc/fortran/interface.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c
index 3f6774e..04ad0e2 100644
--- a/gcc/fortran/interface.c
+++ b/gcc/fortran/interface.c
@@ -526,6 +526,7 @@ int
gfc_compare_union_types (gfc_symbol *un1, gfc_symbol *un2)
{
gfc_component *map1, *map2, *cmp1, *cmp2;
+ gfc_symbol *map1_t, *map2_t;
if (un1->attr.flavor != FL_UNION || un2->attr.flavor != FL_UNION)
return 0;
@@ -541,16 +542,26 @@ gfc_compare_union_types (gfc_symbol *un1, gfc_symbol *un2)
we compare the maps sequentially. */
for (;;)
{
- cmp1 = map1->ts.u.derived->components;
- cmp2 = map2->ts.u.derived->components;
+ map1_t = map1->ts.u.derived;
+ map2_t = map2->ts.u.derived;
+
+ cmp1 = map1_t->components;
+ cmp2 = map2_t->components;
+
+ /* Protect against null components. */
+ if (map1_t->attr.zero_comp != map2_t->attr.zero_comp)
+ return 0;
+
+ if (map1_t->attr.zero_comp)
+ return 1;
+
for (;;)
{
/* No two fields will ever point to the same map type unless they are
the same component, because one map field is created with its type
declaration. Therefore don't worry about recursion here. */
/* TODO: worry about recursion into parent types of the unions? */
- if (compare_components (cmp1, cmp2,
- map1->ts.u.derived, map2->ts.u.derived) == 0)
+ if (compare_components (cmp1, cmp2, map1_t, map2_t) == 0)
return 0;
cmp1 = cmp1->next;