]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
a68: handling of PUB in contracted declarations
authorJose E. Marchesi <jose.marchesi@oracle.com>
Sat, 13 Dec 2025 12:01:41 +0000 (13:01 +0100)
committerJose E. Marchesi <jose.marchesi@oracle.com>
Sat, 13 Dec 2025 12:09:32 +0000 (13:09 +0100)
This commit adds support for using 'pub' in contracted declarations.

Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>
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
gcc/algol68/a68-parser-extract.cc
gcc/testsuite/algol68/execute/modules/module1.a68
gcc/testsuite/algol68/execute/modules/module3.a68
gcc/testsuite/algol68/execute/modules/module5.a68
gcc/testsuite/algol68/execute/modules/program-1.a68

index a87a94007b77cc2aee6752322a623ad1c792aed3..703574377ec943551ff5905b6146856c0cd220d8 100644 (file)
@@ -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;
            }
index e6474e9c744ca8064201828f62b9430b4ff54a59..06f18975536ea8254c113d3d17507450ce24b4c5 100644 (file)
@@ -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
index f49a747033e008b6765f767563e4175cfdc271d6..7fad6e54cf703f7978bb5b2309f047e2df1aa29c 100644 (file)
@@ -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")
index d4d2066f2b235678c714200cf19475e5f8b5b37d..6ba73fff0e9a112e52b3416e10c8ef86ae7daf52 100644 (file)
@@ -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;
index d0b009aa7954f3c774e112a7e06473e18a3abc8d..cec2832a3e851ff123b5abd1e2cdb8984cfb1f78 100644 (file)
@@ -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
index b385c5698a4e19547d2d3bcafc79c37046a786dc..4b3616b743e3e82ce1c6ee7d4e340319f02a68d0 100644 (file)
@@ -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