> 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
> 

Reply via email to