[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