[gcc r16-9341] a68: fix brackets parser diagnostics

"Jose E. Marchesi via Gcc-cvs" <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:5b6adea959c0fdf1abfab5cc9c6a630fbed1cc79

commit r16-9341-g5b6adea959c0fdf1abfab5cc9c6a630fbed1cc79
Author: Jose E. Marchesi <[email protected]>
Date:   Sun Jun 14 01:42:02 2026 +0200

    a68: fix brackets parser diagnostics
    
    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'.
    
    (cherry picked from commit 191fa9195ff05aa6a97d744d863c04416df9c6cf)

Diff:
---
 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 d66ac655e54f..70efb4cad087 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>
+
 #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);
 	}
     }
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.