Of course I got the in-MOIF deduplication of modes wrong due to a
stupid thinko.  This patch fixes the thinko and also adds a little
extra sanity check.

Signed-off-by: Jose E. Marchesi <[email protected]>

gcc/algol68/ChangeLog

        * a68-imports.cc (a68_replace_equivalent_mode): Get a moif and
        check extracts.
        (a68_open_packet): Fix deduplication of in-moif modes and move
        extract replacement code to a68_replace_equivalent_mode.
        * a68-low-moids.cc (a68_lower_moids): Check that all known modes
        have an associated ctype as part of the sanity checks.
---
 gcc/algol68/a68-imports.cc   | 50 ++++++++++++++++++------------------
 gcc/algol68/a68-low-moids.cc |  1 +
 2 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/gcc/algol68/a68-imports.cc b/gcc/algol68/a68-imports.cc
index e7b5580eec5..37b0b9a209f 100644
--- a/gcc/algol68/a68-imports.cc
+++ b/gcc/algol68/a68-imports.cc
@@ -986,9 +986,11 @@ a68_replace_submode (MOID_T *t, MOID_T *m, MOID_T *r)
    The entry for M in MODES_LIST is set to NO_MOID.  */
 
 static void
-a68_replace_equivalent_mode (vec<MOID_T*,va_gc> *mode_list,
+a68_replace_equivalent_mode (MOIF_T *moif,
                             MOID_T *m, MOID_T *r)
 {
+  /* Handle the mode to be replaced.  */
+  vec<MOID_T*,va_gc> *mode_list = MODES (moif);
   for (size_t i = 0; i < mode_list->length (); ++i)
     {
       if ((*mode_list)[i] == m)
@@ -996,6 +998,25 @@ a68_replace_equivalent_mode (vec<MOID_T*,va_gc> *mode_list,
       else if ((*mode_list)[i] != NO_MOID)
        a68_replace_submode ((*mode_list)[i], m, r);
     }
+
+  /* Update extracts to reflect the replacement.  */
+  for (EXTRACT_T *e : INDICANTS (moif))
+    {
+      if (EXTRACT_MODE (e) == m)
+       EXTRACT_MODE (e) = r;
+    }
+
+  for (EXTRACT_T *e : IDENTIFIERS (moif))
+    {
+      if (EXTRACT_MODE (e) == m)
+       EXTRACT_MODE (e) = r;
+    }
+
+  for (EXTRACT_T *e : OPERATORS (moif))
+    {
+      if (EXTRACT_MODE (e) == m)
+       EXTRACT_MODE (e) = r;
+    }
 }
 
 /* Decode a modes table at DATA + POS.  */
@@ -1488,7 +1509,7 @@ a68_open_packet (const char *module, const char *basename)
                {
                  if (a68_prove_moid_equivalence (m, known_moids[i]))
                    {
-                     r =  m;
+                     r = known_moids[i];
                      break;
                    }
                }
@@ -1496,29 +1517,8 @@ a68_open_packet (const char *module, const char 
*basename)
 
          if (r == NO_MOID)
            known_moids.push_back (m);
-         else
-           {
-             a68_replace_equivalent_mode (MODES (moif), m, r);
-
-             /* Update extracts to reflect the replacement.  */
-             for (EXTRACT_T *e : INDICANTS (moif))
-               {
-                 if (EXTRACT_MODE (e) == m)
-                   EXTRACT_MODE (e) = r;
-               }
-
-             for (EXTRACT_T *e : IDENTIFIERS (moif))
-               {
-                 if (EXTRACT_MODE (e) == m)
-                   EXTRACT_MODE (e) = r;
-               }
-
-             for (EXTRACT_T *e : OPERATORS (moif))
-               {
-                 if (EXTRACT_MODE (e) == m)
-                   EXTRACT_MODE (e) = r;
-               }
-           }
+         else if (r != m)
+           a68_replace_equivalent_mode (moif, m, r);
        }
     }
 
diff --git a/gcc/algol68/a68-low-moids.cc b/gcc/algol68/a68-low-moids.cc
index 5c1fda6d1c8..27b28173003 100644
--- a/gcc/algol68/a68-low-moids.cc
+++ b/gcc/algol68/a68-low-moids.cc
@@ -723,6 +723,7 @@ a68_lower_moids (MOID_T *mode)
   /* Sanity check.  */
   for (MOID_T *m = mode; m != NO_MOID; FORWARD (m))
     {
+      gcc_assert (CTYPE (m) != NULL_TREE);
       gcc_assert (COMPLETE_TYPE_P (CTYPE (m)));
       if (IS_UNION (m))
        {
-- 
2.39.5

Reply via email to