> Am 14.06.2026 um 01:43 schrieb Jose E. Marchesi <[email protected]>:
>
> Signed-off-by: Jose E. Marchesi <[email protected]>
>
> gcc/algol68/ChangeLog
>
> * a68-parser-brackets.cc: Include <string>.
> (bracket_check_error): Get additional argument `item'.
> (bracket_check_diagnose): Likewise.
> (bracket_check_parse): Fix call to a68_error passing the `item'.
> ---
> gcc/algol68/a68-parser-brackets.cc | 56 +++++++++++++++++++++---------
> 1 file changed, 39 insertions(+), 17 deletions(-)
>
> diff --git a/gcc/algol68/a68-parser-brackets.cc
> b/gcc/algol68/a68-parser-brackets.cc
> index d66ac655e54..70efb4cad08 100644
> --- a/gcc/algol68/a68-parser-brackets.cc
> +++ b/gcc/algol68/a68-parser-brackets.cc
> @@ -24,6 +24,8 @@
> #include "system.h"
> #include "coretypes.h"
>
> +#include <string>
> +
Please use INCLUDE_STRING define before system.h
> #include "a68.h"
> #include "a68-pretty-print.h"
>
> @@ -37,7 +39,8 @@
> /* Intelligible diagnostics for the bracket checker. */
>
> static void
> -bracket_check_error (char *txt, int n, const char *bra, const char *ket)
> +bracket_check_error (char *txt, int n, const char *bra, const char *ket,
> + char **item)
> {
> BUFFER buf;
>
> @@ -48,10 +51,12 @@ bracket_check_error (char *txt, int n, const char *bra,
> const char *ket)
> const char *strop_bra = a68_strop_keyword (bra);
>
> BUFCLR (buf);
> - if (snprintf (buf, SNPRINTF_SIZE, "missing matching %%<%s%%>",
> + if (snprintf (buf, SNPRINTF_SIZE, "missing matching %<%s%>",
> (n > 0 ? strop_ket : strop_bra)) < 0)
> gcc_unreachable ();
>
> + *item = (n > 0 ? xstrdup (strop_ket) : xstrdup (strop_bra));
> +
> if (strlen (txt) > 0)
> a68_bufcat (txt, " or ", BUFFER_SIZE);
> a68_bufcat (txt, buf, BUFFER_SIZE);
> @@ -60,7 +65,7 @@ bracket_check_error (char *txt, int n, const char *bra,
> const char *ket)
> /* Diagnose brackets in local branch of the tree. */
>
> static char *
> -bracket_check_diagnose (NODE_T *p)
> +bracket_check_diagnose (NODE_T *p, char **item)
> {
> int begins = 0, opens = 0, format_delims = 0, format_opens = 0;
> int subs = 0, ifs = 0, cases = 0, dos = 0;
> @@ -123,14 +128,14 @@ bracket_check_diagnose (NODE_T *p)
> }
>
> A68 (edit_line)[0] = '\0';
> - bracket_check_error (A68 (edit_line), begins, "BEGIN", "END");
> - bracket_check_error (A68 (edit_line), opens, "(", ")");
> - bracket_check_error (A68 (edit_line), format_opens, "(", ")");
> - bracket_check_error (A68 (edit_line), format_delims, "$", "$");
> - bracket_check_error (A68 (edit_line), subs, "[", "]");
> - bracket_check_error (A68 (edit_line), ifs, "IF", "FI");
> - bracket_check_error (A68 (edit_line), cases, "CASE", "ESAC");
> - bracket_check_error (A68 (edit_line), dos, "DO", "OD");
> + bracket_check_error (A68 (edit_line), begins, "BEGIN", "END", item);
> + bracket_check_error (A68 (edit_line), opens, "(", ")", item);
> + bracket_check_error (A68 (edit_line), format_opens, "(", ")", item);
> + bracket_check_error (A68 (edit_line), format_delims, "$", "$", item);
> + bracket_check_error (A68 (edit_line), subs, "[", "]", item);
> + bracket_check_error (A68 (edit_line), ifs, "IF", "FI", item);
> + bracket_check_error (A68 (edit_line), cases, "CASE", "ESAC", item);
> + bracket_check_error (A68 (edit_line), dos, "DO", "OD", item);
> return A68 (edit_line);
> }
>
> @@ -193,18 +198,35 @@ bracket_check_parse (NODE_T *top, NODE_T *p)
> p = q;
> else if (q == NO_NODE)
> {
> - char *diag = bracket_check_diagnose (top);
> - a68_error (p, "incorrect nesting, check for %s",
> - (strlen (diag) > 0 ? diag : "missing or unmatched keyword"));
> + char *item = NULL;
> + char *diag = bracket_check_diagnose (top, &item);
> + if (strlen (diag) == 0)
> + a68_error (p, "incorrect nesting, check for missing or unmatched
> keyword");
> + else
> + {
> + std::string fmt1 = diag;
> + std::string fmt2 = "incorrect nesting, check for " + fmt1;
> + a68_error (p, fmt2.c_str (), item);
> + free (item);
> + }
> longjmp (A68_PARSER (top_down_crash_exit), 1);
> }
> else
> {
> - char *diag = bracket_check_diagnose (top);
> + char *item = NULL;
> + char *diag = bracket_check_diagnose (top, &item);
> a68_attr_format_token a (ATTRIBUTE (q));
>
> - a68_error (q, "unexpected %e, check for %s", &a,
> - (strlen (diag) > 0 ? diag : "missing or unmatched keyword"));
> + if (strlen (diag) == 0)
> + a68_error (q, "unexpected %e, check for missing or unmatched
> keyword",
> + &a);
> + else
> + {
> + std::string fmt1 = diag;
> + std::string fmt2 = "unexpected %e, check for " + fmt1;
> + a68_error (q, fmt2.c_str (), &a, item);
> + free (item);
> + }
> longjmp (A68_PARSER (top_down_crash_exit), 1);
> }
> }
> --
> 2.39.5
>