[COMMITTED] a68: distinguish between MODULE_INDICANT and DEFINING_MODULE_INDICANT

Jose E. Marchesi jemarch@gnu.org
Sun Nov 16 22:51:39 GMT 2025


---
 gcc/algol68/a68-exports.cc                     |  2 +-
 gcc/algol68/a68-low-clauses.cc                 |  4 ++--
 gcc/algol68/a68-low.cc                         |  2 +-
 gcc/algol68/a68-parser-attrs.def               |  3 ++-
 gcc/algol68/a68-parser-bottom-up.cc            |  8 ++++----
 gcc/algol68/a68-parser-extract.cc              | 18 +++++++++++++++---
 gcc/algol68/a68-parser-taxes.cc                |  2 +-
 .../algol68/compile/modules/module4.a68        |  4 ++++
 .../program-module-accesses-module-1.a68       |  5 +++++
 9 files changed, 35 insertions(+), 13 deletions(-)
 create mode 100644 gcc/testsuite/algol68/compile/modules/module4.a68
 create mode 100644 gcc/testsuite/algol68/compile/modules/program-module-accesses-module-1.a68

diff --git a/gcc/algol68/a68-exports.cc b/gcc/algol68/a68-exports.cc
index b28a5a28695..87501af7675 100644
--- a/gcc/algol68/a68-exports.cc
+++ b/gcc/algol68/a68-exports.cc
@@ -569,7 +569,7 @@ a68_do_exports (NODE_T *p)
 {
   for (;p != NO_NODE; FORWARD (p))
     {
-      if (IS (p, DEFINING_MODULE))
+      if (IS (p, DEFINING_MODULE_INDICANT))
 	{
 	  // XXX only do this if the defining module is to be
 	  // exported. Accessed modules without PUB are not exported.  */
diff --git a/gcc/algol68/a68-low-clauses.cc b/gcc/algol68/a68-low-clauses.cc
index e9a4f11afcc..77e07b1121b 100644
--- a/gcc/algol68/a68-low-clauses.cc
+++ b/gcc/algol68/a68-low-clauses.cc
@@ -1408,7 +1408,7 @@ a68_lower_access_clause (NODE_T *p, LOW_CTX_T ctx)
   /* Call preludes of all ACCESSed modules.  */
   for (NODE_T *q = SUB (p); q != NO_NODE; FORWARD (q))
     {
-      if (IS (q, DEFINING_MODULE))
+      if (IS (q, MODULE_INDICANT))
 	{
 	  TAG_T *tag = a68_find_tag_global (TABLE (q), MODULE_SYMBOL, NSYMBOL (q));
 	  gcc_assert (tag != NO_TAG);
@@ -1438,7 +1438,7 @@ a68_lower_access_clause (NODE_T *p, LOW_CTX_T ctx)
   /* Call postludes of all ACCESSed modules.  */
   for (NODE_T *q = SUB (p); q != NO_NODE; FORWARD (q))
     {
-      if (IS (q, DEFINING_MODULE))
+      if (IS (q, MODULE_INDICANT))
 	{
 	  TAG_T *tag = a68_find_tag_global (TABLE (q), MODULE_SYMBOL, NSYMBOL (q));
 	  gcc_assert (tag != NO_TAG);
diff --git a/gcc/algol68/a68-low.cc b/gcc/algol68/a68-low.cc
index 0062d130ee2..2d7cc9ef115 100644
--- a/gcc/algol68/a68-low.cc
+++ b/gcc/algol68/a68-low.cc
@@ -1264,7 +1264,7 @@ lower_module_declaration (NODE_T *p, LOW_CTX_T ctx)
 {
   for (; p != NO_NODE; FORWARD (p))
     {
-      if (IS (p, DEFINING_MODULE))
+      if (IS (p, DEFINING_MODULE_INDICANT))
 	{
 	  ctx.module_definition_name = NSYMBOL (p);
 	  ctx.module_definition_decls.truncate (0);
diff --git a/gcc/algol68/a68-parser-attrs.def b/gcc/algol68/a68-parser-attrs.def
index 46217a506c7..26356999804 100644
--- a/gcc/algol68/a68-parser-attrs.def
+++ b/gcc/algol68/a68-parser-attrs.def
@@ -99,7 +99,7 @@ A68_ATTR(DEF_SYMBOL, "def-symbol")
 A68_ATTR(DEFINING_IDENTIFIER, "defining identifier")
 A68_ATTR(DEFINING_INDICANT, "defining mode")
 A68_ATTR(DEFINING_OPERATOR, "defining operator")
-A68_ATTR(DEFINING_MODULE, "defining module")
+A68_ATTR(DEFINING_MODULE_INDICANT, "defining module indicant")
 A68_ATTR(DENOTATION, "denotation")
 A68_ATTR(DEPROCEDURING, "deproceduring coercion")
 A68_ATTR(DEREFERENCING, "dereferencing coercion")
@@ -252,6 +252,7 @@ A68_ATTR(MODE_LONG_REAL, "mode long real")
 A68_ATTR(MODE_NO_CHECK, "mode no check")
 A68_ATTR(MODE_REAL, "mode real")
 A68_ATTR(MODE_SYMBOL, "mode-symbol")
+A68_ATTR(MODULE_INDICANT, "module indicant")
 A68_ATTR(MODULE_DECLARATION, "module-declaration")
 A68_ATTR(MODULE_SYMBOL, "module-symbol")
 A68_ATTR(MODULE_TEXT, "module text")
diff --git a/gcc/algol68/a68-parser-bottom-up.cc b/gcc/algol68/a68-parser-bottom-up.cc
index 396e984d6fc..e34645f5676 100644
--- a/gcc/algol68/a68-parser-bottom-up.cc
+++ b/gcc/algol68/a68-parser-bottom-up.cc
@@ -450,9 +450,9 @@ reduce_prelude_packet (NODE_T *p)
 
   /* Single module declaration.  */
   reduce (p, NO_NOTE, NO_TICK,
-	  MODULE_DECLARATION, MODULE_SYMBOL, DEFINING_MODULE, EQUALS_SYMBOL, MODULE_TEXT, STOP);
+	  MODULE_DECLARATION, MODULE_SYMBOL, DEFINING_MODULE_INDICANT, EQUALS_SYMBOL, MODULE_TEXT, STOP);
   reduce (p, strange_tokens, NO_TICK,
-	  MODULE_DECLARATION, MODULE_SYMBOL, DEFINING_MODULE, EQUALS_SYMBOL, -MODULE_TEXT, STOP);
+	  MODULE_DECLARATION, MODULE_SYMBOL, DEFINING_MODULE_INDICANT, EQUALS_SYMBOL, -MODULE_TEXT, STOP);
 
   /* Joined module declarations.  */
   for (NODE_T *q = p; q != NO_NODE; FORWARD (q))
@@ -463,7 +463,7 @@ reduce_prelude_packet (NODE_T *p)
 	  siga = false;
 	  reduce (q, NO_NOTE, &siga,
 		  MODULE_DECLARATION, MODULE_DECLARATION,
-		  COMMA_SYMBOL, DEFINING_MODULE, EQUALS_SYMBOL, MODULE_TEXT, STOP);
+		  COMMA_SYMBOL, DEFINING_MODULE_INDICANT, EQUALS_SYMBOL, MODULE_TEXT, STOP);
 	}
       while (siga);
     }
@@ -2502,7 +2502,7 @@ reduce_enclosed_clauses (NODE_T *q, enum a68_attribute expect)
 	      reduce (s, NO_NOTE, NO_TICK, ENCLOSED_CLAUSE, ACCESS_CLAUSE, STOP);
 	    }
 	  reduce (p, NO_NOTE, NO_TICK,
-		  ACCESS_CLAUSE, ACCESS_SYMBOL, DEFINING_MODULE, ENCLOSED_CLAUSE, STOP);
+		  ACCESS_CLAUSE, ACCESS_SYMBOL, MODULE_INDICANT, ENCLOSED_CLAUSE, STOP);
 	}
       else if (IS (p, IF_SYMBOL))
 	{
diff --git a/gcc/algol68/a68-parser-extract.cc b/gcc/algol68/a68-parser-extract.cc
index 976384bc865..256bb931a90 100644
--- a/gcc/algol68/a68-parser-extract.cc
+++ b/gcc/algol68/a68-parser-extract.cc
@@ -116,6 +116,16 @@ find_tag_definition (TABLE_T *table, const char *name)
 	      found = true;
 	    }
 	}
+      found = false;
+      for (TAG_T *s = MODULES (table); s != NO_TAG && !found; FORWARD (s))
+	{
+	  if (NSYMBOL (NODE (s)) == name || strcmp (NSYMBOL (NODE (s)), name) == 0)
+	    {
+	      ret += MODULE_INDICANT;
+	      found = true;
+	    }
+	}
+
       if (ret == 0)
 	return find_tag_definition (PREVIOUS (table), name);
       else
@@ -125,7 +135,7 @@ find_tag_definition (TABLE_T *table, const char *name)
     return 0;
 }
 
-/* Fill in whether bold tag is operator or indicant.  */
+/* Fill in whether bold tag is operator, indicant or module indicant.  */
 
 void
 a68_elaborate_bold_tags (NODE_T *p)
@@ -145,6 +155,9 @@ a68_elaborate_bold_tags (NODE_T *p)
 	    case OPERATOR:
 	      ATTRIBUTE (q) = OPERATOR;
 	      break;
+	    case MODULE_INDICANT:
+	      ATTRIBUTE (q) = MODULE_INDICANT;
+	      break;
 	    }
 	}
     }
@@ -196,7 +209,6 @@ a68_extract_indicants (NODE_T *p)
 	      if (IS (q, BOLD_TAG))
 		{
 		  /* Store in the symbol table.  */
-		  ATTRIBUTE (q) = DEFINING_MODULE;
 		  TAG_T *tag = a68_add_tag (TABLE (p), MODULE_SYMBOL, q, NO_MOID, STOP);
 		  gcc_assert (tag != NO_TAG);
 		  EXPORTED (tag) = false; // XXX depends on PUB!
@@ -351,7 +363,7 @@ a68_extract_indicants (NODE_T *p)
 		     XXX also add to global list of modules?
 		     Position of definition (q) connects to this lexical
 		     level!  */
-		  ATTRIBUTE (q) = DEFINING_MODULE;
+		  ATTRIBUTE (q) = DEFINING_MODULE_INDICANT;
 		  TAG_T *tag = a68_add_tag (TABLE (p), MODULE_SYMBOL, q, NO_MOID, STOP);
 		  gcc_assert (tag != NO_TAG);
 		  EXPORTED (tag) = true;
diff --git a/gcc/algol68/a68-parser-taxes.cc b/gcc/algol68/a68-parser-taxes.cc
index 106c59d362c..9e08e74b8e4 100644
--- a/gcc/algol68/a68-parser-taxes.cc
+++ b/gcc/algol68/a68-parser-taxes.cc
@@ -1143,7 +1143,7 @@ tax_module_dec (NODE_T *p)
 	{
 	  tax_module_dec (NEXT (p));
 	}
-      else if (IS (p, DEFINING_MODULE))
+      else if (IS (p, DEFINING_MODULE_INDICANT))
 	{
 	  TAG_T *entry = MODULES (TABLE (p));
 	  while (entry != NO_TAG && NODE (entry) != p)
diff --git a/gcc/testsuite/algol68/compile/modules/module4.a68 b/gcc/testsuite/algol68/compile/modules/module4.a68
new file mode 100644
index 00000000000..f0ae6e689b4
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/modules/module4.a68
@@ -0,0 +1,4 @@
+module Module_4 =
+def access Module_3 (foo (10, "foo"));
+    skip
+fed
diff --git a/gcc/testsuite/algol68/compile/modules/program-module-accesses-module-1.a68 b/gcc/testsuite/algol68/compile/modules/program-module-accesses-module-1.a68
new file mode 100644
index 00000000000..7ba7804636c
--- /dev/null
+++ b/gcc/testsuite/algol68/compile/modules/program-module-accesses-module-1.a68
@@ -0,0 +1,5 @@
+{ dg-modules "module3 module4" }
+{ This test accesses a Module4 that itself accesses a Module3.  }
+
+access Module_4 (skip)
+      
-- 
2.30.2



More information about the Algol68 mailing list