https://gcc.gnu.org/g:c43d4a3f51c1b6dc06cc7ffe1d4912ce3828ea12
commit r16-6106-gc43d4a3f51c1b6dc06cc7ffe1d4912ce3828ea12 Author: Jose E. Marchesi <[email protected]> Date: Sat Dec 13 13:01:41 2025 +0100 a68: handling of PUB in contracted declarations 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. Diff: --- gcc/algol68/a68-parser-bottom-up.cc | 23 +----- gcc/algol68/a68-parser-extract.cc | 91 +++++++++++++++++++--- gcc/testsuite/algol68/execute/modules/module1.a68 | 6 +- gcc/testsuite/algol68/execute/modules/module3.a68 | 8 +- gcc/testsuite/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 a87a94007b77..703574377ec9 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 e6474e9c744c..06f18975536e 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 f49a747033e0..7fad6e54cf70 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 d4d2066f2b23..6ba73fff0e9a 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 d0b009aa7954..cec2832a3e85 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 b385c5698a4e..4b3616b743e3 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
