This commit adds support for using 'pub' in contracted declarations.
Signed-off-by: Jose E. Marchesi <[email protected]>
gcc/algol68/ChangeLog
* a68-parser-bottom-up.cc (a68_bottom_up_coalesce_pub): Do not
mark defining entities as publicized.
* a68-parser-extract.cc (a68_extract_indicants): Mark public
defining entities.
(a68_extract_priorities): Likewise.
(a68_extract_operators): Likewise.
(a68_extract_identities): Likewise.
(a68_extract_variables): Likewise.
(a68_extract_proc_identities): Likewise.
(a68_extract_proc_variables): Likewise.
gcc/testsuite/ChangeLog
* algol68/execute/modules/module1.a68: Also test contracted
forms.
* algol68/execute/modules/module3.a68: Likewise.
* algol68/execute/modules/module5.a68: Likewise.
* algol68/execute/modules/program-1.a68: Likewise.
---
gcc/algol68/a68-parser-bottom-up.cc | 23 +----
gcc/algol68/a68-parser-extract.cc | 91 +++++++++++++++++--
.../algol68/execute/modules/module1.a68 | 6 +-
.../algol68/execute/modules/module3.a68 | 8 +-
.../algol68/execute/modules/module5.a68 | 7 +-
.../algol68/execute/modules/program-1.a68 | 5 +-
6 files changed, 97 insertions(+), 43 deletions(-)
diff --git a/gcc/algol68/a68-parser-bottom-up.cc
b/gcc/algol68/a68-parser-bottom-up.cc
index a87a94007b7..703574377ec 100644
--- a/gcc/algol68/a68-parser-bottom-up.cc
+++ b/gcc/algol68/a68-parser-bottom-up.cc
@@ -2981,9 +2981,9 @@ a68_rearrange_goto_less_jumps (NODE_T *p)
}
/*
- * Coalesce PUBLIC_SYMBOLs resulting from reductions, annotating the
- * corresponding defining identifiers, indicators, operators and prios as
- * publicized.
+ * Remove PUBLIC_SYMBOLs resulting from reductions from the tree. Note that
+ * the defining indicants, identifiers and operators have been already marked
+ * as publicized or not publicized by the extract routines.
*/
void
@@ -3000,23 +3000,6 @@ a68_bottom_up_coalesce_pub (NODE_T *p)
if (SUB (p) != NO_NODE && IS (SUB (p), PUBLIC_SYMBOL))
{
NODE_T *public_symbol = SUB (p);
-
- /* Mark the defining entity as PUBlicized. */
- /* XXX handle joined declarations. */
- NODE_T *defining_entity = NEXT (NEXT (SUB (p)));
- if (!a68_is_one_of (defining_entity,
- DEFINING_INDICANT, DEFINING_IDENTIFIER,
DEFINING_OPERATOR,
- STOP))
- FORWARD (defining_entity);
- gcc_assert (defining_entity != NO_NODE
- && a68_is_one_of (defining_entity,
- DEFINING_INDICANT,
- DEFINING_IDENTIFIER,
- DEFINING_OPERATOR,
- STOP));
- PUBLICIZED (defining_entity) = true;
-
- /* Unlink the PUBLIC_SYMBOL node and get rid of it. */
SUB (p) = NEXT (public_symbol);
PREVIOUS (NEXT (public_symbol)) = NO_NODE;
}
diff --git a/gcc/algol68/a68-parser-extract.cc
b/gcc/algol68/a68-parser-extract.cc
index e6474e9c744..06f18975536 100644
--- a/gcc/algol68/a68-parser-extract.cc
+++ b/gcc/algol68/a68-parser-extract.cc
@@ -385,9 +385,17 @@ a68_extract_indicants (NODE_T *p)
}
while (siga && q != NO_NODE && IS (q, COMMA_SYMBOL));
}
- else if (IS (q, MODE_SYMBOL))
+ else if (IS (q, MODE_SYMBOL) || a68_whether (q, PUBLIC_SYMBOL,
MODE_SYMBOL, STOP))
{
bool siga = true;
+ bool is_public = false;
+
+ if (IS (q, PUBLIC_SYMBOL))
+ {
+ is_public = true;
+ FORWARD (q);
+ }
+
do
{
FORWARD (q);
@@ -402,6 +410,7 @@ a68_extract_indicants (NODE_T *p)
if (a68_add_mode (&TOP_MOID (&A68_JOB), INDICANT, 0, q,
NO_MOID, NO_PACK) == NO_MOID)
gcc_unreachable ();
ATTRIBUTE (q) = DEFINING_INDICANT;
+ PUBLICIZED (q) = is_public;
FORWARD (q);
ATTRIBUTE (q) = ALT_EQUALS_SYMBOL;
q = skip_pack_declarer (NEXT (q));
@@ -440,9 +449,17 @@ a68_extract_priorities (NODE_T *p)
NODE_T *q = p;
while (q != NO_NODE)
{
- if (IS (q, PRIO_SYMBOL))
+ if (IS (q, PRIO_SYMBOL) || a68_whether (q, PUBLIC_SYMBOL, PRIO_SYMBOL,
STOP))
{
bool siga = true;
+ bool is_public = false;
+
+ if (IS (q, PUBLIC_SYMBOL))
+ {
+ is_public = true;
+ FORWARD (q);
+ }
+
do
{
FORWARD (q);
@@ -454,6 +471,7 @@ a68_extract_priorities (NODE_T *p)
NODE_T *y = q;
a68_error (q, "invalid operator tag");
ATTRIBUTE (q) = DEFINING_OPERATOR;
+ PUBLICIZED (q) = is_public;
/* Remove one superfluous operator, and hope it was only
one. */
NEXT (q) = NEXT_NEXT (q);
@@ -473,6 +491,7 @@ a68_extract_priorities (NODE_T *p)
{
NODE_T *y = q;
ATTRIBUTE (q) = DEFINING_OPERATOR;
+ PUBLICIZED (q) = is_public;
FORWARD (q);
ATTRIBUTE (q) = ALT_EQUALS_SYMBOL;
FORWARD (q);
@@ -491,6 +510,7 @@ a68_extract_priorities (NODE_T *p)
{
NODE_T *y = q;
ATTRIBUTE (q) = DEFINING_OPERATOR;
+ PUBLICIZED (q) = is_public;
FORWARD (q);
ATTRIBUTE (q) = ALT_EQUALS_SYMBOL;
FORWARD (q);
@@ -517,6 +537,7 @@ a68_extract_priorities (NODE_T *p)
if (len > 2 && NSYMBOL (q)[len - 2] == ':' && NSYMBOL
(q)[len - 3] != '=')
a68_error (q, "probably a missing symbol near invalid
operator S");
ATTRIBUTE (q) = DEFINING_OPERATOR;
+ PUBLICIZED (q) = is_public;
insert_alt_equals (q);
q = NEXT_NEXT (q);
int k;
@@ -548,12 +569,18 @@ a68_extract_operators (NODE_T *p)
while (q != NO_NODE)
{
- if (!IS (q, OP_SYMBOL))
- FORWARD (q);
- else
+ if (IS (q, OP_SYMBOL) || a68_whether (q, PUBLIC_SYMBOL, OP_SYMBOL, STOP))
{
bool siga = true;
bool in_proc = true;
+ bool is_public = false;
+
+ if (IS (q, PUBLIC_SYMBOL))
+ {
+ is_public = true;
+ FORWARD (q);
+ }
+
/* Skip operator plan. */
if (NEXT (q) != NO_NODE && IS (NEXT (q), OPEN_SYMBOL))
{
@@ -573,6 +600,7 @@ a68_extract_operators (NODE_T *p)
{
a68_error (q, "invalid operator tag");
ATTRIBUTE (q) = DEFINING_OPERATOR;
+ PUBLICIZED (q) = is_public;
TAG_T *t = a68_add_tag (TABLE (p), OP_SYMBOL, q, NO_MOID,
STOP);
if (t == NO_TAG)
gcc_unreachable ();
@@ -588,6 +616,7 @@ a68_extract_operators (NODE_T *p)
|| a68_whether (q, EQUALS_SYMBOL, EQUALS_SYMBOL,
STOP))
{
ATTRIBUTE (q) = DEFINING_OPERATOR;
+ PUBLICIZED (q) = is_public;
TAG_T *t = a68_add_tag (TABLE (p), OP_SYMBOL, q, NO_MOID,
STOP);
if (t == NO_TAG)
gcc_unreachable ();
@@ -603,6 +632,7 @@ a68_extract_operators (NODE_T *p)
else if (a68_whether (q, BOLD_TAG, EQUALS_SYMBOL, STOP))
{
ATTRIBUTE (q) = DEFINING_OPERATOR;
+ PUBLICIZED (q) = is_public;
TAG_T *t = a68_add_tag (TABLE (p), OP_SYMBOL, q, NO_MOID,
STOP);
if (t == NO_TAG)
gcc_unreachable ();
@@ -625,6 +655,7 @@ a68_extract_operators (NODE_T *p)
if (len > 2 && NSYMBOL (q)[len - 2] == ':' && NSYMBOL
(q)[len - 3] != '=')
a68_error (q, "probably a missing symbol near
invalid operator S");
ATTRIBUTE (q) = DEFINING_OPERATOR;
+ PUBLICIZED (q) = is_public;
insert_alt_equals (q);
TAG_T *t = a68_add_tag (TABLE (p), OP_SYMBOL, q,
NO_MOID, STOP);
if (t == NO_TAG)
@@ -642,6 +673,8 @@ a68_extract_operators (NODE_T *p)
while (siga && q != NO_NODE && IS (q, COMMA_SYMBOL));
}
}
+ else
+ FORWARD (q);
}
}
@@ -674,9 +707,18 @@ extract_identities (NODE_T *p)
while (q != NO_NODE)
{
- if (a68_whether (q, DECLARER, IDENTIFIER, EQUALS_SYMBOL, STOP))
+ if (a68_whether (q, DECLARER, IDENTIFIER, EQUALS_SYMBOL, STOP)
+ || a68_whether (q, PUBLIC_SYMBOL, DECLARER, IDENTIFIER,
EQUALS_SYMBOL, STOP))
{
bool siga = true;
+ bool is_public = false;
+
+ if (IS (q, PUBLIC_SYMBOL))
+ {
+ is_public = true;
+ FORWARD (q);
+ }
+
do
{
if (a68_whether ((FORWARD (q)), IDENTIFIER, EQUALS_SYMBOL, STOP))
@@ -685,6 +727,7 @@ extract_identities (NODE_T *p)
if (tag == NO_TAG)
gcc_unreachable ();
ATTRIBUTE (q) = DEFINING_IDENTIFIER;
+ PUBLICIZED (q) = is_public;
FORWARD (q);
ATTRIBUTE (q) = ALT_EQUALS_SYMBOL;
q = skip_unit (q);
@@ -696,6 +739,7 @@ extract_identities (NODE_T *p)
if (a68_add_tag (TABLE (p), IDENTIFIER, q, NO_MOID,
NORMAL_IDENTIFIER) == NO_TAG)
gcc_unreachable ();
ATTRIBUTE (q) = DEFINING_IDENTIFIER;
+ PUBLICIZED (q) = is_public;
ATTRIBUTE (FORWARD (q)) = ALT_EQUALS_SYMBOL;
q = skip_unit (q);
}
@@ -720,9 +764,13 @@ extract_variables (NODE_T *p)
{
if (a68_whether (q, HEAP_SYMBOL, DECLARER, IDENTIFIER, STOP)
|| a68_whether (q, LOC_SYMBOL, DECLARER, IDENTIFIER, STOP)
- || a68_whether (q, DECLARER, IDENTIFIER, STOP))
+ || a68_whether (q, DECLARER, IDENTIFIER, STOP)
+ || a68_whether (q, PUBLIC_SYMBOL, HEAP_SYMBOL, DECLARER, IDENTIFIER,
STOP)
+ || a68_whether (q, PUBLIC_SYMBOL, LOC_SYMBOL, DECLARER, IDENTIFIER,
STOP)
+ || a68_whether (q, PUBLIC_SYMBOL, DECLARER, IDENTIFIER, STOP))
{
- if (!IS (q, DECLARER))
+ bool is_public = IS (q, PUBLIC_SYMBOL);
+ while (!IS (q, DECLARER))
FORWARD (q);
bool siga = true;
@@ -742,6 +790,7 @@ extract_variables (NODE_T *p)
gcc_unreachable ();
VARIABLE (tag) = true;
ATTRIBUTE (q) = DEFINING_IDENTIFIER;
+ PUBLICIZED (q) = is_public;
q = skip_unit (q);
}
else
@@ -763,9 +812,18 @@ extract_proc_identities (NODE_T *p)
while (q != NO_NODE)
{
- if (a68_whether (q, PROC_SYMBOL, IDENTIFIER, EQUALS_SYMBOL, STOP))
+ if (a68_whether (q, PROC_SYMBOL, IDENTIFIER, EQUALS_SYMBOL, STOP)
+ || a68_whether (q, PUBLIC_SYMBOL, PROC_SYMBOL, IDENTIFIER,
EQUALS_SYMBOL, STOP))
{
bool siga = true;
+ bool is_public = false;
+
+ if (IS (q, PUBLIC_SYMBOL))
+ {
+ is_public = true;
+ FORWARD (q);
+ }
+
do
{
FORWARD (q);
@@ -774,6 +832,7 @@ extract_proc_identities (NODE_T *p)
TAG_T *t = a68_add_tag (TABLE (p), IDENTIFIER, q, NO_MOID,
NORMAL_IDENTIFIER);
IN_PROC (t) = true;
ATTRIBUTE (q) = DEFINING_IDENTIFIER;
+ PUBLICIZED (q) = is_public;
ATTRIBUTE (FORWARD (q)) = ALT_EQUALS_SYMBOL;
q = skip_unit (q);
}
@@ -784,6 +843,7 @@ extract_proc_identities (NODE_T *p)
if (a68_add_tag (TABLE (p), IDENTIFIER, q, NO_MOID,
NORMAL_IDENTIFIER) == NO_TAG)
gcc_unreachable ();
ATTRIBUTE (q) = DEFINING_IDENTIFIER;
+ PUBLICIZED (q) = is_public;
ATTRIBUTE (FORWARD (q)) = ALT_EQUALS_SYMBOL;
q = skip_unit (q);
}
@@ -806,9 +866,18 @@ extract_proc_variables (NODE_T *p)
while (q != NO_NODE)
{
- if (a68_whether (q, PROC_SYMBOL, IDENTIFIER, STOP))
+ if (a68_whether (q, PROC_SYMBOL, IDENTIFIER, STOP)
+ || a68_whether (q, PUBLIC_SYMBOL, PROC_SYMBOL, IDENTIFIER, STOP))
{
bool siga = true;
+ bool is_public = false;
+
+ if (IS (q, PUBLIC_SYMBOL))
+ {
+ is_public = true;
+ FORWARD (q);
+ }
+
do
{
FORWARD (q);
@@ -818,6 +887,7 @@ extract_proc_variables (NODE_T *p)
gcc_assert (tag != NO_TAG);
VARIABLE (tag) = true;
ATTRIBUTE (q) = DEFINING_IDENTIFIER;
+ PUBLICIZED (q) = is_public;
q = skip_unit (FORWARD (q));
}
else if (a68_whether (q, IDENTIFIER, EQUALS_SYMBOL, STOP))
@@ -827,6 +897,7 @@ extract_proc_variables (NODE_T *p)
TAG_T *tag = a68_add_tag (TABLE (p), IDENTIFIER, q, NO_MOID,
NORMAL_IDENTIFIER);
gcc_assert (tag != NO_TAG);
ATTRIBUTE (q) = DEFINING_IDENTIFIER;
+ PUBLICIZED (q) = is_public;
ATTRIBUTE (FORWARD (q)) = ASSIGN_SYMBOL;
q = skip_unit (q);
} else
diff --git a/gcc/testsuite/algol68/execute/modules/module1.a68
b/gcc/testsuite/algol68/execute/modules/module1.a68
index f49a747033e..7fad6e54cf7 100644
--- a/gcc/testsuite/algol68/execute/modules/module1.a68
+++ b/gcc/testsuite/algol68/execute/modules/module1.a68
@@ -1,8 +1,8 @@
module Module1 =
def
- pub mode MyInt = int;
- pub int beast_number := 666;
- pub string who = "jemarch";
+ pub mode MyInt = int, MyOtherInt = int;
+ pub int beast_number := 666, angelic_number := 777;
+ pub string who = "jemarch", whoelse = "pietro";
puts ("Hello from module'n")
postlude
puts ("Bye from module'n")
diff --git a/gcc/testsuite/algol68/execute/modules/module3.a68
b/gcc/testsuite/algol68/execute/modules/module3.a68
index d4d2066f2b2..6ba73fff0e9 100644
--- a/gcc/testsuite/algol68/execute/modules/module3.a68
+++ b/gcc/testsuite/algol68/execute/modules/module3.a68
@@ -1,9 +1,9 @@
module Module_3 =
def
- { variable = 0 in_proc = 1 } pub proc bump = void: counter +:= 1;
- { variable = 0 in_proc = 1 } pub proc bumptimes = (int n) void: to n do
bump od;
- { variable = 1 in_proc = 0 } pub proc vbump := void: counter +:= 1;
- { variable = 1 in_proc = 0 } pub proc vbumptimes := (int n) void: to n do
vbump od;
+ { variable = 0 in_proc = 1 } pub proc bump = void: counter +:= 1,
+ { variable = 0 in_proc = 1 } bumptimes = (int n) void: to n do
bump od;
+ { variable = 1 in_proc = 0 } pub proc vbump := void: counter +:= 1,
+ { variable = 1 in_proc = 0 } vbumptimes := (int n) void: to n do
vbump od;
{ variable = 0 in_proc = 1 } pub proc getcounter = int: counter;
{ variable = 0 in_proc = 0 } pub proc int anothergetcounter = getcounter;
int counter := 10;
diff --git a/gcc/testsuite/algol68/execute/modules/module5.a68
b/gcc/testsuite/algol68/execute/modules/module5.a68
index d0b009aa795..cec2832a3e8 100644
--- a/gcc/testsuite/algol68/execute/modules/module5.a68
+++ b/gcc/testsuite/algol68/execute/modules/module5.a68
@@ -1,7 +1,6 @@
module Module_5 =
-def pub prio // = 9;
- pub op // = (int a, b) int: a + b;
- pub prio LALA = 9;
- pub op LALA = (int a, b) int: a - b;
+def pub prio // = 9, LALA = 9, LELE = 9;
+ pub op // = (int a, b) int: a + b,
+ LALA = (int a, b) int: a - b;
skip
fed
diff --git a/gcc/testsuite/algol68/execute/modules/program-1.a68
b/gcc/testsuite/algol68/execute/modules/program-1.a68
index b385c5698a4..4b3616b743e 100644
--- a/gcc/testsuite/algol68/execute/modules/program-1.a68
+++ b/gcc/testsuite/algol68/execute/modules/program-1.a68
@@ -15,6 +15,7 @@ begin string je = access Module1 begin who end;
assert (aa = "jemarch");
assert (bb = "jemarch");
assert (cc = "jemarch");
- access Module1 to 1 do assert (who = "jemarch") od;
- access Module1 (assert (beast_number = 666))
+ access Module1 to 1 do assert (who = "jemarch" AND whoelse = "pietro")
od;
+ access Module1 (assert (beast_number = 666 AND angelic_number = 777));
+ access Module1 (MyInt a = 1; MyOtherInt b = 1; assert (a + b = 2))
end
--
2.30.2