[COMMITTED 5/6] a68: fix handling of & in C formal hole symbols

Jose E. Marchesi jemarch@gnu.org
Sat Feb 21 19:24:26 GMT 2026


Signed-off-by: Jose E. Marchesi <jemarch@gnu.org>

gcc/algol68/ChangeLog

	* a68-low.cc (a68_make_formal_hole_decl): Get a boolean indicating
	whether the declaration is for the address of the given symbol.
	* a68.h: Update prototype of a68_make_formal_hole_decl.
	* a68-low-holes.cc (a68_wrap_formal_var_hole): Pass a boolean to
	a68_make_formal_hole_decl indicating whether an address is
	required.
---
 gcc/algol68/a68-low-holes.cc |  5 +++--
 gcc/algol68/a68-low.cc       | 19 +++++++++++--------
 gcc/algol68/a68.h            |  2 +-
 3 files changed, 15 insertions(+), 11 deletions(-)

diff --git a/gcc/algol68/a68-low-holes.cc b/gcc/algol68/a68-low-holes.cc
index a1c5073c3b2..156cbe46f46 100644
--- a/gcc/algol68/a68-low-holes.cc
+++ b/gcc/algol68/a68-low-holes.cc
@@ -75,8 +75,9 @@ tree
 a68_wrap_formal_var_hole (NODE_T *p)
 {
   gcc_assert (!IS (MOID (p), PROC_SYMBOL));
-  const char *symbol = get_hole_symbol (p, NULL /* addrp */);
-  return a68_make_formal_hole_decl (p, symbol);
+  bool addrp;
+  const char *symbol = get_hole_symbol (p, &addrp);
+  return a68_make_formal_hole_decl (p, symbol, addrp);
 }
 
 /* Build the body for a wrapper to the formal hole in P, which is of a proc
diff --git a/gcc/algol68/a68-low.cc b/gcc/algol68/a68-low.cc
index e4c4355ea88..09cd5339b68 100644
--- a/gcc/algol68/a68-low.cc
+++ b/gcc/algol68/a68-low.cc
@@ -634,29 +634,32 @@ a68_make_variable_declaration_decl (NODE_T *identifier,
 
 /* Make an extern declaration for a formal hole.
 
+   If ADDRP is true then it is the address of the external symbol we are
+   interested in.  In that case the mode of P shall be a ref.
+   
    Note that this function is not used for formal holes with proc modes, called
    from a68_wrap_formal_var_hole.  See a68_wrap_formal_proc_hole.  */
 
 tree
-a68_make_formal_hole_decl (NODE_T *p, const char *extern_symbol)
+a68_make_formal_hole_decl (NODE_T *p, const char *extern_symbol,
+			   bool addrp)
 {
   gcc_assert (!IS (MOID (p), PROC_SYMBOL));
 
   tree type = CTYPE (MOID (p));
-  const char *sym = (strlen (extern_symbol) > 0 && extern_symbol[0] == '&'
-		     ? extern_symbol + 1
-		     : extern_symbol);
-
   tree decl = build_decl (a68_get_node_location (p),
 			  VAR_DECL,
-			  get_identifier (sym),
+			  get_identifier (extern_symbol),
 			  type);
   DECL_EXTERNAL (decl) = 1;
   TREE_PUBLIC (decl) = 1;
   DECL_INITIAL (decl) = a68_get_skip_tree (MOID (p));
 
-  if (extern_symbol[0] == '&')
-    decl = fold_build1 (ADDR_EXPR, type, decl);
+  if (addrp)
+    {
+      gcc_assert (IS_REF (MOID (p)));
+      decl = fold_build1 (ADDR_EXPR, type, decl);
+    }
   return decl;
 }
 
diff --git a/gcc/algol68/a68.h b/gcc/algol68/a68.h
index d3cf81d05c7..66088efa3b2 100644
--- a/gcc/algol68/a68.h
+++ b/gcc/algol68/a68.h
@@ -798,7 +798,7 @@ tree a68_make_variable_declaration_decl (NODE_T *identifier, const char *module_
 tree a68_make_proc_identity_declaration_decl (NODE_T *identifier, const char *module_name = NULL,
 					      bool indicant = false, bool external = false,
 					      const char *extern_symbol = NULL);
-tree a68_make_formal_hole_decl (NODE_T *p, const char *extern_symbol);
+tree a68_make_formal_hole_decl (NODE_T *p, const char *extern_symbol, bool addrp);
 tree a68_make_anonymous_routine_decl (MOID_T *mode);
 tree a68_get_skip_tree (MOID_T *m);
 tree a68_get_empty (void);
-- 
2.39.5



More information about the Algol68 mailing list