]> granicus.if.org Git - graphviz/commitdiff
fix: re-align dotlex’s 'yyerror' with that expected by Bison
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 12 Sep 2021 21:44:02 +0000 (14:44 -0700)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sun, 12 Sep 2021 22:50:39 +0000 (15:50 -0700)
Bison 3.8 now emits a prototype for `yyerror`:¹

  To comply with the latest POSIX standard, in Yacc compatibility mode
  (options `-y`/`--yacc`) Bison now generates prototypes for yyerror and
  yylex.  In some situations, this is breaking compatibility: if the user
  has already declared these functions but with some differences (e.g., to
  declare them as static, or to use specific attributes), the generated
  parser will fail to compile.  To disable these prototypes, #define yyerror
  (to `yyerror`), and likewise for yylex.

Because the generated prototype takes a const parameter,² this prototype
conflicts with the implementation in dotlex.c causing a compilation error.
Rather than the work around suggested by the Bison notes, this change simply
re-aligns `yyerror` with the Bison default.

Fixed #2127.

¹ https://github.com/akimd/bison/blob/master/NEWS
² https://www.gnu.org/software/bison/manual/html_node/Error-Reporting-Function.html

CHANGELOG.md
cmd/lefty/dot2l/dotlex.c
cmd/lefty/dot2l/dotparse.y

index 48c0ad7d722e683a091a786177e4f77cb7040e02..d137b08c0ae03187d6896dc994b0e9fd070c356d 100644 (file)
@@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 - Ensure correct file-level dependency for generated file in cmake generated
   projects #2119
 - compile failures with a C++20-compatible toolchain #2122
+- compile errors on macOS when using Bison 3.8 #2127
 
 ## [2.49.0] – 2021-08-28
 
index 7e1ecfa72976147f47e51b34176657beb16a7ebf..13803bafa9ec563b74660aabebb38f556cab1410 100644 (file)
@@ -123,8 +123,7 @@ int yylex (void) {
     return token;
 }
 
-void
-yyerror (char *fmt, char *s) {
+static void yyerror_text(const char *fmt, const char *s) {
     if (syntax_errors++)
         return;
     fprintf (stderr, "graph parser: ");
@@ -133,6 +132,10 @@ yyerror (char *fmt, char *s) {
     error_context ();
 }
 
+void yyerror(const char *message) {
+  yyerror_text(message, "");
+}
+
 static char *lex_gets (int curlen) {
     char *clp;
     int len;
@@ -284,7 +287,7 @@ static char *scan_num (char *p) {
     }
     *q = '\0';
     if (saw_digit && *z && (isalpha (*z)))
-        yyerror ("badly formed number %s", lexbuf);
+        yyerror_text("badly formed number %s", lexbuf);
 
     if (saw_digit == FALSE)
         z = NULL;
@@ -309,7 +312,7 @@ static char *quoted_string (char *p) {
         *q++ = *p++;
     }
     if (strcmp(p, "") == 0)
-        yyerror ("string ran past end of line", "");
+        yyerror("string ran past end of line");
     else
         p++;
     *q = 0;
index 34fd3b9aaff2c0c624e09a5e05ebff42f293afb3..cd2ad740fe02bcdc62bf2072bd06e5182f5a416e 100644 (file)
@@ -21,7 +21,7 @@ typedef void *Tobj;
 
 static char portstr[SMALLBUF];
 
-extern void yyerror(const char *fmt, ...);
+extern void yyerror(const char *message);
 %}
 
 %union {