Fix ICE for maps with zero components.
authorFritz Reese <fritzoreese@gmail.com>
Fri, 30 Sep 2016 11:42:31 +0000 (11:42 +0000)
committerFritz Reese <foreese@gcc.gnu.org>
Fri, 30 Sep 2016 11:42:31 +0000 (11:42 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/interface.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dec_union_8.f90 [new file with mode: 0644]

index 03955d6ab960caad815d53841e6269a050a5f15a..19349a1a82b27901b08b82ed419fd06978dd355b 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-30  Fritz Reese  <fritzoreese@gmail.com>
+
+       PR fortran/77764
+       * interface.c (gfc_compare_union_types): Null-guard map components.
+
 2016-09-30  Fritz Reese  <fritzoreese@gmail.com>
 
        PR fortran/77782
index 3f6774e630b93ff4c23fb757d7ec97c88f2706fa..04ad0e295f7687013d1a5a9e37c22f81b0b8c8dd 100644 (file)
@@ -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;
index 841a6ef6e7fab486322d664b8156c047eabd571b..3a359ba53aca55bb7b309277325ba74bb00ec2f7 100644 (file)
@@ -1,3 +1,8 @@
+2016-09-30  Fritz Reese  <fritzoreese@gmail.com>
+
+       PR fortran/77764
+       * gfortran.dg/dec_union_8.f90: New testcase.
+
 2016-09-30  Fritz Reese  <fritzoreese@gmail.com>
 
        PR fortran/77782
diff --git a/gcc/testsuite/gfortran.dg/dec_union_8.f90 b/gcc/testsuite/gfortran.dg/dec_union_8.f90
new file mode 100644 (file)
index 0000000..2d856fc
--- /dev/null
@@ -0,0 +1,21 @@
+! { dg-do compile }
+! { dg-options "-fdec-structure" }
+!
+! PR fortran/77764
+!
+! Test an ICE due to a map with zero components.
+!
+
+program p
+
+structure /s1/
+  union
+    map
+    end map
+    map
+      real :: a = 2.0
+    end map
+  end union
+end structure
+
+end