RE: Getting involved in Bison

"Morales Cayuela, Victor (NSB - CN/Hangzhou)" <[email protected]>
Newsgroups gmane.comp.parsers.bison.patches,gmane.comp.parsers.bison.bugs
Message-ID <[email protected]>
Hello Akim,

It did not ruin my will to continue contributing! It took me more time than expected to finish it because I did not know how to retest cases fast and it became quite tiresome (at the beginning I even copied the failing input.y code to a temporary file and then ran bison manually XD). I must also thank you for helping me fixing the remaining bugs in the code and in the testcases.

What could I do next? :)
Victor

-----Original Message-----
From: Akim Demaille <[email protected]> 
Sent: 2020年2月15日 15:34
To: Morales Cayuela, Victor (NSB - CN/Hangzhou) <[email protected]>
Cc: Bison Bugs <[email protected]>; Bison Patches <[email protected]>
Subject: Re: Getting involved in Bison

Hi Victor, hi all,

> Le 28 oct. 2019 à 03:20, Morales Cayuela, Victor (NSB - CN/Hangzhou) <[email protected]> a écrit :
> 
> Hello Akim, Paul,
> 
> Please see attached a draft version of the indentation removal. I have removed the function which indented the output and substituted all its calls with the non-indenting one.
> I can add today "note: " with colors if this modification is correct.

For the records, Victor and I have continued this thread privately.  Eventually Victor sent me the following commit, which fully implements this.

Victor, many thanks for your contribution.  Installed in master.

I'm sorry I underestimated how much effort it would be for a first contribution :(  I hope I did not ruin your desire to contribute to Bison.

Cheers!

commit e09a72eeb0429ee1eee9b0bdc986ab046d8d2532
Author: Victor Morales Cayuela <[email protected]>
Date:   Fri Feb 14 18:41:55 2020 +0100

    diagnostics: modernize the display of submessages
    
    Since Bison 2.7, output was indented four spaces for explanatory
    statements.  For example:
    
        input.y:2.7-13: error: %type redeclaration for exp
        input.y:1.7-11:     previous declaration
    
    Since the introduction of caret-diagnostics, it became less clear.
    Remove the indentation and display submessages as in GCC:
    
        input.y:2.7-13: error: %type redeclaration for exp
            2 | %type <float> exp
              |       ^~~~~~~
        input.y:1.7-11: note: previous declaration
            1 | %type <int> exp
              |       ^~~~~
    
    * src/complain.h (SUB_INDENT): Remove.
    (warnings): Add "note" to the enum.
    * src/complain.h, src/complain.c (complain_indent): Replace by...
    (subcomplain): this.
    Adjust all dependencies.
    * tests/actions.at, tests/diagnostics.at, tests/glr-regression.at,
    * tests/input.at, tests/named-refs.at, tests/regression.at:
    Adjust expectations.

diff --git a/NEWS b/NEWS
index c107d652..0daa3048 100644
--- a/NEWS
+++ b/NEWS
@@ -75,6 +75,27 @@ GNU Bison NEWS
   the translated symbol (i.e., it returns '_("variable")' rather that
   '"variable"').
 
+*** Modernize display of explanatory statements in diagnostics
+
+  Since Bison 2.7, output was indented four spaces for explanatory
+  statements.  For example:
+
+    input.y:2.7-13: error: %type redeclaration for exp
+    input.y:1.7-11:     previous declaration
+
+  Since the introduction of caret-diagnostics, it became less clear.  This
+  indentation has been removed and submessages are displayed similarly as in
+  GCC:
+
+    input.y:2.7-13: error: %type redeclaration for exp
+        2 | %type <float> exp
+          |       ^~~~~~~
+    input.y:1.7-11: note: previous declaration
+        1 | %type <int> exp
+          |       ^~~~~
+
+  Contributed by Victor Morales Cayuela.
+
 ** Documentation
 
   There are now two examples in examples/java: a very simple calculator, and
diff --git a/TODO b/TODO
index 0a7905b4..a14292e8 100644
--- a/TODO
+++ b/TODO
@@ -95,52 +95,6 @@ and https://research.swtch.com/yyerror.
 ** consistency
 token vs terminal, variable vs non terminal.
 
-** Stop indentation in diagnostics
-Before Bison 2.7, we printed "flatly" the dependencies in long diagnostics:
-
-    input.y:2.7-12: %type redeclaration for exp
-    input.y:1.7-12: previous declaration
-
-In Bison 2.7, we indented them
-
-    input.y:2.7-12: error: %type redeclaration for exp
-    input.y:1.7-12:     previous declaration
-
-Later we quoted the source in the diagnostics, and today we have:
-
-    /tmp/foo.y:1.12-14: warning: symbol FOO redeclared [-Wother]
-        1 | %token FOO FOO
-          |            ^~~
-    /tmp/foo.y:1.8-10:      previous declaration
-        1 | %token FOO FOO
-          |        ^~~
-
-The indentation is no longer helping.  We should probably get rid of it, or
-maybe keep it only when -fno-caret. GCC displays this as a "note":
-
-    $ g++-mp-9 -Wall /tmp/foo.c -c
-    /tmp/foo.c:1:10: error: redefinition of 'int foo'
-        1 | int foo, foo;
-          |          ^~~
-    /tmp/foo.c:1:5: note: 'int foo' previously declared here
-        1 | int foo, foo;
-          |     ^~~
-
-Likewise for Clang, contrary to what I believed (because "note:" is written
-in black, so it doesn't show in my terminal :-)
-
-    $ clang++-mp-8.0 -Wall /tmp/foo.c -c
-    clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated [-Wdeprecated]
-    /tmp/foo.c:1:10: error: redefinition of 'foo'
-    int foo, foo;
-             ^
-    /tmp/foo.c:1:5: note: previous definition is here
-    int foo, foo;
-        ^
-    1 error generated.
-
-See also the item "Complaint submessage indentation" below.
-
 ** api.token.raw
 Maybe we should exhibit the YYUNDEFTOK token.  It could also be assigned a
 semantic value so that yyerror could be used to report invalid lexemes.
diff --git a/src/complain.c b/src/complain.c
index dbf243e7..9696dfaf 100644
--- a/src/complain.c
+++ b/src/complain.c
@@ -424,7 +424,6 @@ warnings_print_categories (warnings warn_flags, FILE *out)
  *
  * \param loc     the location, defaulting to the current file,
  *                or the program name.
- * \param indent  optional indentation for the error message.
  * \param flags   the category for this message.
  * \param sever   to decide the prefix to put before the message
  *                (e.g., "warning").
@@ -436,51 +435,46 @@ warnings_print_categories (warnings warn_flags, FILE *out)
  */
 static
 void
-error_message (const location *loc, int *indent, warnings flags,
+error_message (const location *loc, warnings flags,
                severity sever, const char *message, va_list args)
 {
-  int pos = 0;
+  const char* style = flags & note ? "note" : severity_style (sever);
 
   if (loc)
-    pos += location_print (*loc, stderr);
+    location_print (*loc, stderr);
   else
-    pos += fprintf (stderr, "%s", grammar_file ? grammar_file : program_name);
-  pos += fprintf (stderr, ": ");
+    fprintf (stderr, "%s", grammar_file ? grammar_file : program_name);
+  fprintf (stderr, ": ");
 
-  if (indent)
+  if (sever != severity_disabled)
     {
-      if (*indent)
-        sever = severity_disabled;
-      if (!*indent)
-        *indent = pos;
-      else if (*indent > pos)
-        fprintf (stderr, "%*s", *indent - pos, "");
+      begin_use_class (style, stderr);
+      fprintf (stderr, "%s:", flags & note ? _("note") : severity_prefix (sever));
+      end_use_class (style, stderr);
+      fputc (' ', stderr);
     }
 
-  severity_print (sever, stderr);
   vfprintf (stderr, message, args);
   /* Print the type of warning, only if this is not a sub message
      (in which case the prefix is null).  */
   if (! (flags & silent) && sever != severity_disabled)
     warnings_print_categories (flags, stderr);
 
-  {
-    size_t l = strlen (message);
-    if (l < 2 || message[l - 2] != ':' || message[l - 1] != ' ')
-      {
-        putc ('\n', stderr);
-        flush (stderr);
-        if (loc && !(flags & no_caret))
-          location_caret (*loc, severity_style (sever), stderr);
-      }
-  }
+  size_t l = strlen (message);
+  if (l < 2 || message[l - 2] != ':' || message[l - 1] != ' ')
+    {
+      putc ('\n', stderr);
+      flush (stderr);
+      if (loc && !(flags & no_caret))
+        location_caret (*loc, style, stderr);
+    }
   flush (stderr);
 }
 
 /** Raise a complaint (fatal error, error or just warning).  */
 
 static void
-complains (const location *loc, int *indent, warnings flags,
+complains (const location *loc, warnings flags,
            const char *message, va_list args)
 {
   if ((flags & complaint) && complaint_status < status_complaint)
@@ -491,7 +485,7 @@ complains (const location *loc, int *indent, warnings flags,
     {
       if (severity_error <= s && ! complaint_status)
         complaint_status = status_warning_as_error;
-      error_message (loc, indent, flags, s, message, args);
+      error_message (loc, flags, s, message, args);
     }
 
   if (flags & fatal)
@@ -503,41 +497,39 @@ complain (location const *loc, warnings flags, const char *message, ...)
 {
   va_list args;
   va_start (args, message);
-  complains (loc, NULL, flags, message, args);
+  complains (loc, flags, message, args);
   va_end (args);
 }
 
 void
-complain_indent (location const *loc, warnings flags, int *indent,
-                 const char *message, ...)
+subcomplain (location const *loc, warnings flags, const char *message, ...)
 {
   va_list args;
   va_start (args, message);
-  complains (loc, indent, flags, message, args);
+  complains (loc, flags | note | silent, message, args);
   va_end (args);
 }
 
 void
-complain_args (location const *loc, warnings w, int *indent,
+complain_args (location const *loc, warnings w,
                int argc, char *argv[])
 {
   switch (argc)
   {
   case 1:
-    complain_indent (loc, w, indent, "%s", _(argv[0]));
+    complain (loc, w, "%s", _(argv[0]));
     break;
   case 2:
-    complain_indent (loc, w, indent, _(argv[0]), argv[1]);
+    complain (loc, w, _(argv[0]), argv[1]);
     break;
   case 3:
-    complain_indent (loc, w, indent, _(argv[0]), argv[1], argv[2]);
+    complain (loc, w, _(argv[0]), argv[1], argv[2]);
     break;
   case 4:
-    complain_indent (loc, w, indent, _(argv[0]), argv[1], argv[2], argv[3]);
+    complain (loc, w, _(argv[0]), argv[1], argv[2], argv[3]);
     break;
   case 5:
-    complain_indent (loc, w, indent, _(argv[0]), argv[1], argv[2], argv[3],
-                     argv[4]);
+    complain (loc, w, _(argv[0]), argv[1], argv[2], argv[3], argv[4]);
     break;
   default:
     complain (loc, fatal, "too many arguments for complains");
@@ -571,13 +563,11 @@ void
 duplicate_directive (char const *directive,
                      location first, location second)
 {
-  int i = 0;
   if (feature_flag & feature_caret)
-    complain_indent (&second, Wother, &i, _("duplicate directive"));
+    complain (&second, Wother, _("duplicate directive"));
   else
-    complain_indent (&second, Wother, &i, _("duplicate directive: %s"), quote (directive));
-  i += SUB_INDENT;
-  complain_indent (&first, Wother, &i, _("previous declaration"));
+    complain (&second, Wother, _("duplicate directive: %s"), quote (directive));
+  subcomplain (&first, Wother, _("previous declaration"));
   fixits_register (&second, "");
 }
 
@@ -585,12 +575,8 @@ void
 duplicate_rule_directive (char const *directive,
                           location first, location second)
 {
-  int i = 0;
-  complain_indent (&second, complaint, &i,
-                   _("only one %s allowed per rule"), directive);
-  i += SUB_INDENT;
-  complain_indent (&first, complaint, &i,
-                   _("previous declaration"));
+  complain (&second, complaint, _("only one %s allowed per rule"), directive);
+  subcomplain (&first, complaint, _("previous declaration"));
   fixits_register (&second, "");
 }
 
diff --git a/src/complain.h b/src/complain.h
index 37e652d1..65204ce0 100644
--- a/src/complain.h
+++ b/src/complain.h
@@ -21,9 +21,6 @@
 
 # include "location.h"
 
-/* Sub-messages indent. */
-# define SUB_INDENT (4)
-
 /*---------------.
 | Error stream.  |
 `---------------*/
@@ -119,6 +116,7 @@ typedef enum
     fatal             = 1 << 12, /**< All fatal errors.  */
     silent            = 1 << 13, /**< Do not display the warning type.  */
     no_caret          = 1 << 14, /**< Do not display caret location.  */
+    note              = 1 << 15, /**< Display as a note.  */
 
     /**< All above warnings.  */
     Weverything       = ~complaint & ~fatal & ~silent,
@@ -137,13 +135,13 @@ void complain (location const *loc, warnings flags, char const *message, ...)
   __attribute__ ((__format__ (__printf__, 3, 4)));
 
 /** Likewise, but with an \a argc/argv interface.  */
-void complain_args (location const *loc, warnings w, int *indent,
+void complain_args (location const *loc, warnings w,
                     int argc, char *arg[]);
 
-/** Make a complaint with location and some indentation.  */
-void complain_indent (location const *loc, warnings flags, int *indent,
-                      char const *message, ...)
-  __attribute__ ((__format__ (__printf__, 4, 5)));
+/** Make a subcomplain with location and note.  */
+void subcomplain (location const *loc, warnings flags,
+                  char const *message, ...)
+  __attribute__ ((__format__ (__printf__, 3, 4)));
 
 
 /** GNU Bison extension not valid with POSIX Yacc.  */
diff --git a/src/muscle-tab.c b/src/muscle-tab.c
index 36773eb6..b5dc0f69 100644
--- a/src/muscle-tab.c
+++ b/src/muscle-tab.c
@@ -525,15 +525,13 @@ muscle_percent_define_insert (char const *var, location variable_loc,
             = atoi (muscle_find_const (how_name));
           if (how_old == MUSCLE_PERCENT_DEFINE_F)
             goto end;
-          int i = 0;
           /* If assigning the same value, make it a warning.  */
           warnings warn = STREQ (value, current_value) ? Wother : complaint;
-          complain_indent (&variable_loc, warn, &i,
-                           _("%%define variable %s redefined"),
-                           quote (variable));
-          i += SUB_INDENT;
+          complain (&variable_loc, warn,
+                    _("%%define variable %s redefined"),
+                    quote (variable));
           location loc = muscle_percent_define_get_loc (variable);
-          complain_indent (&loc, warn, &i, _("previous definition"));
+          subcomplain (&loc, warn, _("previous definition"));
           fixits_register (&variable_loc, "");
           warned = true;
         }
@@ -739,14 +737,12 @@ muscle_percent_define_check_values (char const * const *values)
           if (!*values)
             {
               location loc = muscle_percent_define_get_loc (*variablep);
-              int i = 0;
-              complain_indent (&loc, complaint, &i,
-                               _("invalid value for %%define variable %s: %s"),
-                               quote (*variablep), quote_n (1, value));
-              i += SUB_INDENT;
+              complain (&loc, complaint,
+                        _("invalid value for %%define variable %s: %s"),
+                        quote (*variablep), quote_n (1, value));
               for (values = variablep + 1; *values; ++values)
-                complain_indent (&loc, complaint | no_caret | silent, &i,
-                                 _("accepted value: %s"), quote (*values));
+                subcomplain (&loc, complaint | no_caret | silent,
+                             _("accepted value: %s"), quote (*values));
             }
           else
             while (*values)
diff --git a/src/parse-gram.y b/src/parse-gram.y
index 05c67d5d..e3bff55a 100644
--- a/src/parse-gram.y
+++ b/src/parse-gram.y
@@ -756,14 +756,11 @@ id:
         }
       if (muscle_percent_define_ifdef (var))
         {
-          int indent = 0;
-          complain_indent (&@1, complaint, &indent,
-                           _("character literals cannot be used together"
-                             " with %s"), var);
-          indent += SUB_INDENT;
+          complain (&@1, complaint,
+                    _("character literals cannot be used together"
+                    " with %s"), var);
           location loc = muscle_percent_define_get_loc (var);
-          complain_indent (&loc, complaint, &indent,
-                           _("definition of %s"), var);
+          subcomplain (&loc, complaint, _("definition of %s"), var);
         }
       $$ = symbol_get (char_name ($1), @1);
       symbol_class_set ($$, token_sym, @1, false);
diff --git a/src/reader.c b/src/reader.c
index 954b0cc0..63029436 100644
--- a/src/reader.c
+++ b/src/reader.c
@@ -124,16 +124,13 @@ record_merge_function_type (int merger, uniqstr type, location declaration_loc)
   aver (merge_function != NULL && merger_find == merger);
   if (merge_function->type != NULL && !UNIQSTR_EQ (merge_function->type, type))
     {
-      int indent = 0;
-      complain_indent (&declaration_loc, complaint, &indent,
-                       _("result type clash on merge function %s: "
-                         "<%s> != <%s>"),
-                       quote (merge_function->name), type,
-                       merge_function->type);
-      indent += SUB_INDENT;
-      complain_indent (&merge_function->type_declaration_loc, complaint,
-                       &indent,
-                       _("previous declaration"));
+      complain (&declaration_loc, complaint,
+                _("result type clash on merge function %s: "
+                "<%s> != <%s>"),
+                quote (merge_function->name), type,
+                merge_function->type);
+      subcomplain (&merge_function->type_declaration_loc, complaint,
+                   _("previous declaration"));
     }
   merge_function->type = uniqstr_new (type);
   merge_function->type_declaration_loc = declaration_loc;
diff --git a/src/scan-code.l b/src/scan-code.l
index 658c25b1..20242857 100644
--- a/src/scan-code.l
+++ b/src/scan-code.l
@@ -321,14 +321,14 @@ static void
 show_sub_message (warnings warning,
                   const char* cp, bool explicit_bracketing,
                   int midrule_rhs_index, char dollar_or_at,
-                  int indent, const variant *var)
+                  const variant *var)
 {
   const char *at_spec = get_at_spec (var->symbol_index);
 
   if (var->err == 0)
-    complain_indent (&var->loc, warning, &indent,
-                     _("refers to: %c%s at %s"), dollar_or_at,
-                     var->id, at_spec);
+    subcomplain (&var->loc, warning,
+                 _("refers to: %c%s at %s"), dollar_or_at,
+                 var->id, at_spec);
   else
     {
       const char *id;
@@ -375,8 +375,8 @@ show_sub_message (warnings warning,
                         _(", cannot be accessed from midrule action at $%d"),
                         midrule_rhs_index);
 
-      complain_indent (&id_loc, warning, &indent, "%s",
-                        obstack_finish0 (&msg_buf));
+      subcomplain (&id_loc, warning, "%s",
+                   obstack_finish0 (&msg_buf));
       obstack_free (&msg_buf, 0);
     }
 }
@@ -384,14 +384,13 @@ show_sub_message (warnings warning,
 static void
 show_sub_messages (warnings warning,
                    const char* cp, bool explicit_bracketing,
-                   int midrule_rhs_index, char dollar_or_at,
-                   int indent)
+                   int midrule_rhs_index, char dollar_or_at)
 {
   for (int i = 0; i < variant_count; ++i)
     show_sub_message (warning | silent,
                       cp, explicit_bracketing,
                       midrule_rhs_index, dollar_or_at,
-                      indent, &variant_table[i]);
+                      &variant_table[i]);
 }
 
 /* Returned from "parse_ref" when the reference
@@ -492,47 +491,44 @@ parse_ref (char *cp, symbol_list *rule, int rule_length,
       {
         int len = (explicit_bracketing || !ref_tail_fields) ?
           cp_end - cp : ref_tail_fields - cp;
-        int indent = 0;
 
-        complain_indent (text_loc, complaint, &indent,
-                         _("invalid reference: %s"), quote (text));
-        indent += SUB_INDENT;
+        complain (text_loc, complaint,
+                     _("invalid reference: %s"), quote (text));
         if (len == 0)
           {
             location sym_loc = *text_loc;
             sym_loc.start.column += 1;
             sym_loc.end = sym_loc.start;
-            complain_indent (&sym_loc, complaint, &indent,
-                             _("syntax error after '%c', expecting integer, "
-                               "letter, '_', '[', or '$'"),
-                             dollar_or_at);
+            subcomplain (&sym_loc, complaint,
+                         _("syntax error after '%c', expecting integer, "
+                         "letter, '_', '[', or '$'"),
+                         dollar_or_at);
           }
         else if (midrule_rhs_index)
-          complain_indent (&rule->rhs_loc, complaint, &indent,
-                           _("symbol not found in production before $%d: "
-                             "%.*s"),
-                           midrule_rhs_index, len, cp);
+          subcomplain (&rule->rhs_loc, complaint,
+                       _("symbol not found in production before $%d: "
+                       "%.*s"),
+                       midrule_rhs_index, len, cp);
         else
-          complain_indent (&rule->rhs_loc, complaint, &indent,
-                           _("symbol not found in production: %.*s"),
-                           len, cp);
+          subcomplain (&rule->rhs_loc, complaint,
+                       _("symbol not found in production: %.*s"),
+                       len, cp);
 
         if (variant_count > 0)
           show_sub_messages (complaint,
                              cp, explicit_bracketing, midrule_rhs_index,
-                             dollar_or_at, indent);
+                             dollar_or_at);
         return INVALID_REF;
       }
     case 1:
       {
-        int indent = 0;
         if (variant_count > 1)
           {
-            complain_indent (text_loc, Wother, &indent,
-                             _("misleading reference: %s"), quote (text));
+            complain (text_loc, Wother,
+                         _("misleading reference: %s"), quote (text));
             show_sub_messages (Wother,
                                cp, explicit_bracketing, midrule_rhs_index,
-                               dollar_or_at, indent + SUB_INDENT);
+                               dollar_or_at);
           }
         {
           int symbol_index =
@@ -543,12 +539,11 @@ parse_ref (char *cp, symbol_list *rule, int rule_length,
     case 2:
     default:
       {
-        int indent = 0;
-        complain_indent (text_loc, complaint, &indent,
-                         _("ambiguous reference: %s"), quote (text));
+        complain (text_loc, complaint,
+                  _("ambiguous reference: %s"), quote (text));
         show_sub_messages (complaint,
                            cp, explicit_bracketing, midrule_rhs_index,
-                           dollar_or_at, indent + SUB_INDENT);
+                           dollar_or_at);
         return INVALID_REF;
       }
     }
diff --git a/src/scan-skel.l b/src/scan-skel.l
index 0cd308a8..2ffdcfc2 100644
--- a/src/scan-skel.l
+++ b/src/scan-skel.l
@@ -189,7 +189,7 @@ flag (const char *arg)
   else if (STREQ (arg, "fatal"))
     return fatal;
   else if (STREQ (arg, "note"))
-    return silent | complaint | no_caret;
+    return silent | complaint | no_caret | note;
   else if (STREQ (arg, "warn"))
     return Wother;
   else
@@ -225,14 +225,7 @@ at_complain (int argc, char *argv[], char **out_namep, int *out_linenop)
       boundary_set_from_string (&loc.end, argv[3]);
       locp = &loc;
     }
-  static int indent;
-  if (w & silent)
-    indent += SUB_INDENT;
-  else
-    indent = 0;
-  complain_args (locp, w, &indent, argc - 4, argv + 4);
-  if (w & silent)
-    indent -= SUB_INDENT;
+  complain_args (locp, w, argc - 4, argv + 4);
 }
 
 static void
diff --git a/src/symtab.c b/src/symtab.c
index 72833653..4c7af925 100644
--- a/src/symtab.c
+++ b/src/symtab.c
@@ -295,42 +295,29 @@ static void
 complain_symbol_redeclared (symbol *s, const char *what, location first,
                             location second)
 {
-  int i = 0;
   locations_sort (&first, &second);
-  complain_indent (&second, complaint, &i,
-                   _("%s redeclaration for %s"), what, s->tag);
-  i += SUB_INDENT;
-  complain_indent (&first, complaint, &i,
-                   _("previous declaration"));
+  complain (&second, complaint, _("%s redeclaration for %s"), what, s->tag);
+  subcomplain (&first, complaint, _("previous declaration"));
 }
 
 static void
 complain_semantic_type_redeclared (semantic_type *s, const char *what, location first,
                                    location second)
 {
-  int i = 0;
   locations_sort (&first, &second);
-  complain_indent (&second, complaint, &i,
-                   _("%s redeclaration for <%s>"), what, s->tag);
-  i += SUB_INDENT;
-  complain_indent (&first, complaint, &i,
-                   _("previous declaration"));
+  complain (&second, complaint, _("%s redeclaration for <%s>"), what, s->tag);
+  subcomplain (&first, complaint, _("previous declaration"));
 }
 
 static void
 complain_class_redeclared (symbol *sym, symbol_class class, location second)
 {
-  int i = 0;
-  complain_indent (&second, complaint, &i,
-                   class == token_sym
-                   ? _("symbol %s redeclared as a token")
-                   : _("symbol %s redeclared as a nonterminal"), sym->tag);
+  complain (&second, complaint,
+            class == token_sym
+            ? _("symbol %s redeclared as a token")
+            : _("symbol %s redeclared as a nonterminal"), sym->tag);
   if (!location_empty (sym->location))
-    {
-      i += SUB_INDENT;
-      complain_indent (&sym->location, complaint, &i,
-                       _("previous definition"));
-    }
+    subcomplain (&sym->location, complaint, _("previous definition"));
 }
 
 static const symbol *
@@ -546,12 +533,10 @@ symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring)
         {
           if (s->status == declared)
             {
-              int i = 0;
-              complain_indent (&loc, Wother, &i,
-                               _("symbol %s redeclared"), sym->tag);
-              i += SUB_INDENT;
-              complain_indent (&sym->location, Wother, &i,
-                               _("previous declaration"));
+              complain (&loc, Wother,
+                        _("symbol %s redeclared"), sym->tag);
+              subcomplain (&sym->location, Wother,
+                           _("previous declaration"));
             }
           else
             s->status = declared;
@@ -731,15 +716,13 @@ symbol_pack (symbol *this)
 static void
 complain_user_token_number_redeclared (int num, symbol *first, symbol *second)
 {
-  int i = 0;
   symbols_sort (&first, &second);
-  complain_indent (&second->location, complaint, &i,
-                   _("user token number %d redeclaration for %s"),
-                   num, second->tag);
-  i += SUB_INDENT;
-  complain_indent (&first->location, complaint, &i,
-                   _("previous declaration for %s"),
-                   first->tag);
+  complain (&second->location, complaint,
+            _("user token number %d redeclaration for %s"),
+            num, second->tag);
+  subcomplain (&first->location, complaint,
+               _("previous declaration for %s"),
+               first->tag);
 }
 
 /*--------------------------------------------------.
diff --git a/tests/actions.at b/tests/actions.at
index b7ad64ca..9fa630df 100644
--- a/tests/actions.at
+++ b/tests/actions.at
@@ -183,7 +183,7 @@ AT_BISON_CHECK([-fcaret one.y], [1], [],
 [[one.y:11.13-18: error: only one %empty allowed per rule
    11 |   %empty {} %empty
       |             ^~~~~~
-one.y:11.3-8:       previous declaration
+one.y:11.3-8: note: previous declaration
    11 |   %empty {} %empty
       |   ^~~~~~
 one.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
@@ -193,7 +193,7 @@ AT_BISON_CHECK([-fcaret -u one.y], [1], [],
 [[one.y:11.13-18: error: only one %empty allowed per rule
    11 |   %empty {} %empty
       |             ^~~~~~
-one.y:11.3-8:       previous declaration
+one.y:11.3-8: note: previous declaration
    11 |   %empty {} %empty
       |   ^~~~~~
 bison: file 'one.y' was updated (backup: 'one.y~')
diff --git a/tests/diagnostics.at b/tests/diagnostics.at
index 425de411..63d0133b 100644
--- a/tests/diagnostics.at
+++ b/tests/diagnostics.at
@@ -77,31 +77,31 @@ exp: %empty;
 [[input.y:9.12-14: <warning>warning:</warning> symbol FOO redeclared [<warning>-Wother</warning>]
     9 | %token FOO <warning>FOO</warning> FOO
       |            <warning>^~~</warning>
-input.y:9.8-10:      previous declaration
+input.y:9.8-10: <note>note:</note> previous declaration
     9 | %token <note>FOO</note> FOO FOO
       |        <note>^~~</note>
 input.y:9.16-18: <warning>warning:</warning> symbol FOO redeclared [<warning>-Wother</warning>]
     9 | %token FOO FOO <warning>FOO</warning>
       |                <warning>^~~</warning>
-input.y:9.8-10:      previous declaration
+input.y:9.8-10: <note>note:</note> previous declaration
     9 | %token <note>FOO</note> FOO FOO
       |        <note>^~~</note>
 input.y:10.8-10: <warning>warning:</warning> symbol FOO redeclared [<warning>-Wother</warning>]
    10 | %token <warning>FOO</warning>  FOO  FOO
       |        <warning>^~~</warning>
-input.y:9.8-10:      previous declaration
+input.y:9.8-10: <note>note:</note> previous declaration
     9 | %token <note>FOO</note> FOO FOO
       |        <note>^~~</note>
 input.y:10.13-15: <warning>warning:</warning> symbol FOO redeclared [<warning>-Wother</warning>]
    10 | %token FOO  <warning>FOO</warning>  FOO
       |             <warning>^~~</warning>
-input.y:9.8-10:       previous declaration
+input.y:9.8-10: <note>note:</note> previous declaration
     9 | %token <note>FOO</note> FOO FOO
       |        <note>^~~</note>
 input.y:10.18-20: <warning>warning:</warning> symbol FOO redeclared [<warning>-Wother</warning>]
    10 | %token FOO  FOO  <warning>FOO</warning>
       |                  <warning>^~~</warning>
-input.y:9.8-10:       previous declaration
+input.y:9.8-10: <note>note:</note> previous declaration
     9 | %token <note>FOO</note> FOO FOO
       |        <note>^~~</note>
 ]])
@@ -296,7 +296,7 @@ exp:^M
 [[input.y:11.9-11: <warning>warning:</warning> symbol FOO redeclared [<warning>-Wother</warning>]
    11 | %token 
 <warning>FOO</warning>
       |         <warning>^~~</warning>
-input.y:10.9-11:     previous declaration
+input.y:10.9-11: <note>note:</note> previous declaration
    10 | %token 
 <note>FOO</note>
       |         <note>^~~</note>
 input.y:13.5: <warning>warning:</warning> empty rule without %empty [<warning>-Wempty-rule</warning>]
@@ -322,19 +322,19 @@ exp: ABCDEFGHIJKLMNOPQRSTUVWXYZ
 [[input.y:9.36-61: <warning>warning:</warning> symbol ABCDEFGHIJKLMNOPQRSTUVWXYZ redeclared [<warning>-Wother</warning>]
     9 | %token ABCDEFGHIJKLMNOPQRSTUVWXYZ  <warning>ABCDEFGHIJKLMNOPQRSTUVWXYZ</warning>  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ
       |                                    <warning>^~~~~~~~~~~~~~~~~~~~~~~~~~</warning>
-input.y:9.8-33:      previous declaration
+input.y:9.8-33: <note>note:</note> previous declaration
     9 | %token <note>ABCDEFGHIJKLMNOPQRSTUVWXYZ</note>  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ
       |        <note>^~~~~~~~~~~~~~~~~~~~~~~~~~</note>
 input.y:9.64-89: <warning>warning:</warning> symbol ABCDEFGHIJKLMNOPQRSTUVWXYZ redeclared [<warning>-Wother</warning>]
     9 | %token ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ  <warning>ABCDEFGHIJKLMNOPQRSTUVWXYZ</warning>  ABCDEFGHIJKLMNOPQRSTUVWXYZ
       |                                                                <warning>^~~~~~~~~~~~~~~~~~~~~~~~~~</warning>
-input.y:9.8-33:      previous declaration
+input.y:9.8-33: <note>note:</note> previous declaration
     9 | %token <note>ABCDEFGHIJKLMNOPQRSTUVWXYZ</note>  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ
       |        <note>^~~~~~~~~~~~~~~~~~~~~~~~~~</note>
 input.y:9.92-117: <warning>warning:</warning> symbol ABCDEFGHIJKLMNOPQRSTUVWXYZ redeclared [<warning>-Wother</warning>]
     9 | %token ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ  <warning>ABCDEFGHIJKLMNOPQRSTUVWXYZ</warning>
       |                                                                                            <warning>^~~~~~~~~~~~~~~~~~~~~~~~~~</warning>
-input.y:9.8-33:       previous declaration
+input.y:9.8-33: <note>note:</note> previous declaration
     9 | %token <note>ABCDEFGHIJKLMNOPQRSTUVWXYZ</note>  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ
       |        <note>^~~~~~~~~~~~~~~~~~~~~~~~~~</note>
 input.y:10.56-69: <warning>warning:</warning> deprecated directive: '%error-verbose', use '%define parse.error verbose' [<warning>-Wdeprecated</warning>]
@@ -355,19 +355,19 @@ exp: ABCDEFGHIJKLMNOPQRSTUVWXYZ
 [[input.y:9.36-61: <warning>warning:</warning> symbol ABCDEFGHIJKLMNOPQRSTUVWXYZ redeclared [<warning>-Wother</warning>]
     9 | %token ABCDEFGHIJKLMNOPQRSTUVWXYZ  <warning>ABCDEFGHIJKLMNOPQRSTUVWXYZ</warning>  ABCDEF...
       |                                    <warning>^~~~~~~~~~~~~~~~~~~~~~~~~~</warning>
-input.y:9.8-33:      previous declaration
+input.y:9.8-33: <note>note:</note> previous declaration
     9 | %token <note>ABCDEFGHIJKLMNOPQRSTUVWXYZ</note>  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEF...
       |        <note>^~~~~~~~~~~~~~~~~~~~~~~~~~</note>
 input.y:9.64-89: <warning>warning:</warning> symbol ABCDEFGHIJKLMNOPQRSTUVWXYZ redeclared [<warning>-Wother</warning>]
     9 | %token ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEFGHIJKLMNOPQRSTUVWXYZ  <warning>ABCDEF</warning>...
       |                                                                <warning>^~~~~~</warning>
-input.y:9.8-33:      previous declaration
+input.y:9.8-33: <note>note:</note> previous declaration
     9 | %token <note>ABCDEFGHIJKLMNOPQRSTUVWXYZ</note>  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEF...
       |        <note>^~~~~~~~~~~~~~~~~~~~~~~~~~</note>
 input.y:9.92-117: <warning>warning:</warning> symbol ABCDEFGHIJKLMNOPQRSTUVWXYZ redeclared [<warning>-Wother</warning>]
     9 | ...TUVWXYZ  <warning>ABCDEFGHIJKLMNOPQRSTUVWXYZ</warning>
       |             <warning>^~~~~~~~~~~~~~~~~~~~~~~~~~</warning>
-input.y:9.8-33:       previous declaration
+input.y:9.8-33: <note>note:</note> previous declaration
     9 | %token <note>ABCDEFGHIJKLMNOPQRSTUVWXYZ</note>  ABCDEFGHIJKLMNOPQRSTUVWXYZ  ABCDEF...
       |        <note>^~~~~~~~~~~~~~~~~~~~~~~~~~</note>
 input.y:10.56-69: <warning>warning:</warning> deprecated directive: '%error-verbose', use '%define parse.error verbose' [<warning>-Wdeprecated</warning>]
@@ -388,19 +388,19 @@ exp: ABCDEFGHIJKLMNOPQRSTUVWXYZ
 [[input.y:9.36-61: <warning>warning:</warning> symbol ABCDEFGHIJKLMNOPQRSTUVWXYZ redeclared [<warning>-Wother</warning>]
     9 | %token ABCDEFGHIJKLMNOPQRSTUVWXYZ  <warning>ABCDEFGHIJKLMN</warning>...
       |                                    <warning>^~~~~~~~~~~~~~</warning>
-input.y:9.8-33:      previous declaration
+input.y:9.8-33: <note>note:</note> previous declaration
     9 | %token <note>ABCDEFGHIJKLMNOPQRSTUVWXYZ</note>  ABCDEFGHIJKLMN...
       |        <note>^~~~~~~~~~~~~~~~~~~~~~~~~~</note>
 input.y:9.64-89: <warning>warning:</warning> symbol ABCDEFGHIJKLMNOPQRSTUVWXYZ redeclared [<warning>-Wother</warning>]
     9 | ...TUVWXYZ  <warning>ABCDEFGHIJKLMNOPQRSTUVWXYZ</warning>  ABCDEFGHI...
       |             <warning>^~~~~~~~~~~~~~~~~~~~~~~~~~</warning>
-input.y:9.8-33:      previous declaration
+input.y:9.8-33: <note>note:</note> previous declaration
     9 | %token <note>ABCDEFGHIJKLMNOPQRSTUVWXYZ</note>  ABCDEFGHIJKLMN...
       |        <note>^~~~~~~~~~~~~~~~~~~~~~~~~~</note>
 input.y:9.92-117: <warning>warning:</warning> symbol ABCDEFGHIJKLMNOPQRSTUVWXYZ redeclared [<warning>-Wother</warning>]
     9 | ...TUVWXYZ  <warning>ABCDEFGHIJKLMNOPQRSTUVWXYZ</warning>
       |             <warning>^~~~~~~~~~~~~~~~~~~~~~~~~~</warning>
-input.y:9.8-33:       previous declaration
+input.y:9.8-33: <note>note:</note> previous declaration
     9 | %token <note>ABCDEFGHIJKLMNOPQRSTUVWXYZ</note>  ABCDEFGHIJKLMN...
       |        <note>^~~~~~~~~~~~~~~~~~~~~~~~~~</note>
 input.y:10.56-69: <warning>warning:</warning> deprecated directive: '%error-verbose', use '%define parse.error verbose' [<warning>-Wdeprecated</warning>]
diff --git a/tests/glr-regression.at b/tests/glr-regression.at
index 7a8ca76f..78baee89 100644
--- a/tests/glr-regression.at
+++ b/tests/glr-regression.at
@@ -1661,9 +1661,9 @@ AT_BISON_OPTION_POPDEFS
 
 AT_BISON_CHECK([[-o glr-regr18.c -rall glr-regr18.y]], 1, [],
 [[glr-regr18.y:28.18-24: error: result type clash on merge function 'merge': <type2> != <type1>
-glr-regr18.y:27.18-24:     previous declaration
+glr-regr18.y:27.18-24: note: previous declaration
 glr-regr18.y:29.13-19: error: result type clash on merge function 'merge': <type3> != <type2>
-glr-regr18.y:28.18-24:     previous declaration
+glr-regr18.y:28.18-24: note: previous declaration
 ]])
 
 AT_CLEANUP
diff --git a/tests/input.at b/tests/input.at
index 29c74e4d..e7971267 100644
--- a/tests/input.at
+++ b/tests/input.at
@@ -707,19 +707,19 @@ AT_BISON_CHECK([-fcaret input.y], [0], [],
 [[input.y:1.12-14: warning: symbol FOO redeclared [-Wother]
     1 | %token FOO FOO
       |            ^~~
-input.y:1.8-10:      previous declaration
+input.y:1.8-10: note: previous declaration
     1 | %token FOO FOO
       |        ^~~
 input.y:2.15-17: warning: symbol BAR redeclared [-Wother]
     2 | %token BAR 12 BAR 12
       |               ^~~
-input.y:2.8-10:      previous declaration
+input.y:2.8-10: note: previous declaration
     2 | %token BAR 12 BAR 12
       |        ^~~
 input.y:3.14-16: warning: symbol EOF redeclared [-Wother]
     3 | %token EOF 0 EOF 0
       |              ^~~
-input.y:3.8-10:      previous declaration
+input.y:3.8-10: note: previous declaration
     3 | %token EOF 0 EOF 0
       |        ^~~
 ]])
@@ -747,13 +747,13 @@ AT_BISON_CHECK([-fcaret input.y], [1], [],
 [[input.y:2.8-10: error: symbol FOO redeclared as a nonterminal
     2 | %nterm FOO BAR
       |        ^~~
-input.y:1.8-10:     previous definition
+input.y:1.8-10: note: previous definition
     1 | %token FOO
       |        ^~~
 input.y:3.8-10: error: symbol BAR redeclared as a token
     3 | %token BAR
       |        ^~~
-input.y:2.12-14:    previous definition
+input.y:2.12-14: note: previous definition
     2 | %nterm FOO BAR
       |            ^~~
 input.y:4.8-12: error: symbol error redeclared as a nonterminal
@@ -795,37 +795,37 @@ AT_BISON_CHECK([-fcaret input.y], [1], [],
 [[input.y:1.13-29: error: %destructor redeclaration for <>
     1 | %destructor { destroy ($$); } <> <>
       |             ^~~~~~~~~~~~~~~~~
-input.y:1.13-29:     previous declaration
+input.y:1.13-29: note: previous declaration
     1 | %destructor { destroy ($$); } <> <>
       |             ^~~~~~~~~~~~~~~~~
 input.y:2.10-24: error: %printer redeclaration for <>
     2 | %printer { print ($$); } <> <>
       |          ^~~~~~~~~~~~~~~
-input.y:2.10-24:     previous declaration
+input.y:2.10-24: note: previous declaration
     2 | %printer { print ($$); } <> <>
       |          ^~~~~~~~~~~~~~~
 input.y:4.13-29: error: %destructor redeclaration for <>
     4 | %destructor { destroy ($$); } <>
       |             ^~~~~~~~~~~~~~~~~
-input.y:1.13-29:     previous declaration
+input.y:1.13-29: note: previous declaration
     1 | %destructor { destroy ($$); } <> <>
       |             ^~~~~~~~~~~~~~~~~
 input.y:5.10-24: error: %printer redeclaration for <>
     5 | %printer { print ($$); } <>
       |          ^~~~~~~~~~~~~~~
-input.y:2.10-24:     previous declaration
+input.y:2.10-24: note: previous declaration
     2 | %printer { print ($$); } <> <>
       |          ^~~~~~~~~~~~~~~
 input.y:11.13-29: error: %destructor redeclaration for <>
    11 | %destructor { destroy ($$); } <>;
       |             ^~~~~~~~~~~~~~~~~
-input.y:1.13-29:      previous declaration
+input.y:1.13-29: note: previous declaration
     1 | %destructor { destroy ($$); } <> <>
       |             ^~~~~~~~~~~~~~~~~
 input.y:12.10-24: error: %printer redeclaration for <>
    12 | %printer { print ($$); } <>;
       |          ^~~~~~~~~~~~~~~
-input.y:2.10-24:      previous declaration
+input.y:2.10-24: note: previous declaration
     2 | %printer { print ($$); } <> <>
       |          ^~~~~~~~~~~~~~~
 ]])
@@ -861,21 +861,21 @@ start: %empty;
 
 AT_BISON_CHECK([input.y], [1], [],
 [[input.y:4.13-29: error: %destructor redeclaration for <field1>
-input.y:1.13-29:     previous declaration
+input.y:1.13-29: note: previous declaration
 input.y:4.13-29: error: %destructor redeclaration for <field1>
-input.y:1.13-29:     previous declaration
+input.y:1.13-29: note: previous declaration
 input.y:5.10-24: error: %printer redeclaration for <field2>
-input.y:2.10-24:     previous declaration
+input.y:2.10-24: note: previous declaration
 input.y:5.10-24: error: %printer redeclaration for <field2>
-input.y:2.10-24:     previous declaration
+input.y:2.10-24: note: previous declaration
 input.y:11.13-29: error: %destructor redeclaration for <field2>
-input.y:1.13-29:      previous declaration
+input.y:1.13-29: note: previous declaration
 input.y:11.13-29: error: %destructor redeclaration for <field1>
-input.y:1.13-29:      previous declaration
+input.y:1.13-29: note: previous declaration
 input.y:12.10-24: error: %printer redeclaration for <field2>
-input.y:2.10-24:      previous declaration
+input.y:2.10-24: note: previous declaration
 input.y:12.10-24: error: %printer redeclaration for <field1>
-input.y:2.10-24:      previous declaration
+input.y:2.10-24: note: previous declaration
 ]])
 
 AT_CLEANUP
@@ -1135,7 +1135,7 @@ AT_BISON_CHECK([-fcaret input.y], [1], [],
 input.y:2.10-12: error: user token number 42 redeclaration for BAR
     2 |          BAR 42 "foo"
       |          ^~~
-input.y:1.15-19:     previous declaration for "foo"
+input.y:1.15-19: note: previous declaration for "foo"
     1 | %token FOO 42 "foo"
       |               ^~~~~
 ]])
@@ -1166,7 +1166,7 @@ exp: foo;
 [[input.y:3.7-11: error: %type redeclaration for foo
     3 | %type <baz> foo
       |       ^~~~~
-input.y:2.7-11:     previous declaration
+input.y:2.7-11: note: previous declaration
     2 | %type <bar> "foo"
       |       ^~~~~
 ]])
@@ -1180,7 +1180,7 @@ exp: foo;
 [[input.y:3.10-14: error: %printer redeclaration for foo
     3 | %printer {baz} foo
       |          ^~~~~
-input.y:2.10-14:     previous declaration
+input.y:2.10-14: note: previous declaration
     2 | %printer {bar} "foo"
       |          ^~~~~
 ]])
@@ -1194,7 +1194,7 @@ exp: foo;
 [[input.y:3.13-17: error: %destructor redeclaration for foo
     3 | %destructor {baz} foo
       |             ^~~~~
-input.y:2.13-17:     previous declaration
+input.y:2.13-17: note: previous declaration
     2 | %destructor {bar} "foo"
       |             ^~~~~
 ]])
@@ -1208,7 +1208,7 @@ exp: foo;
 [[input.y:3.1-5: error: %left redeclaration for foo
     3 | %left foo
       | ^~~~~
-input.y:2.1-5:     previous declaration
+input.y:2.1-5: note: previous declaration
     2 | %left "foo"
       | ^~~~~
 ]])
@@ -1225,7 +1225,7 @@ exp: foo;
 [[input.y:2.1-5: error: %left redeclaration for foo
     2 | %left foo
       | ^~~~~
-input.y:1.1-5:     previous declaration
+input.y:1.1-5: note: previous declaration
     1 | %left "foo"
       | ^~~~~
 ]])
@@ -1240,7 +1240,7 @@ exp: foo;
 [[input.y:2.10-11: error: %printer redeclaration for foo
     2 | %printer {} foo
       |          ^~
-input.y:1.10-11:     previous declaration
+input.y:1.10-11: note: previous declaration
     1 | %printer {} "foo"
       |          ^~
 ]])
@@ -1255,7 +1255,7 @@ exp: foo;
 [[input.y:2.13-14: error: %destructor redeclaration for foo
     2 | %destructor {} foo
       |             ^~
-input.y:1.13-14:     previous declaration
+input.y:1.13-14: note: previous declaration
     1 | %destructor {} "foo"
       |             ^~
 ]])
@@ -1582,9 +1582,9 @@ start: DECIMAL_1 HEXADECIMAL_2;
 
 AT_BISON_CHECK([redecl.y], [1], [],
 [[redecl.y:10.10-22: error: user token number 11259375 redeclaration for HEXADECIMAL_1
-redecl.y:9.8-16:       previous declaration for DECIMAL_1
+redecl.y:9.8-16: note: previous declaration for DECIMAL_1
 redecl.y:12.10-18: error: user token number 16702650 redeclaration for DECIMAL_2
-redecl.y:11.10-22:     previous declaration for HEXADECIMAL_2
+redecl.y:11.10-22: note: previous declaration for HEXADECIMAL_2
 ]])
 
 AT_DATA_GRAMMAR([too-large.y],
@@ -1870,9 +1870,9 @@ start: %empty;
 
 AT_BISON_CHECK([[input-redefined.y]], [[1]], [],
 [[input-redefined.y:2.1-20: warning: %define variable 'var' redefined [-Wother]
-input-redefined.y:1.1-20:     previous definition
+input-redefined.y:1.1-20: note: previous definition
 input-redefined.y:3.2-21: error: %define variable 'var' redefined
-input-redefined.y:2.1-20:     previous definition
+input-redefined.y:2.1-20: note: previous definition
 input-redefined.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
 
@@ -1928,7 +1928,7 @@ start: %empty;
 ]])
 AT_BISON_CHECK([[-Dvar=cmd-d input-dg.y]], [[1]], [],
 [[input-dg.y:1.1-18: error: %define variable 'var' redefined
-<command line>:3:      previous definition
+<command line>:3: note: previous definition
 input-dg.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
 
@@ -1941,7 +1941,7 @@ AT_BISON_CHECK([[-fcaret -Dvar=cmd-d input-dg.y]], [[1]], [],
 [[input-dg.y:1.1-18: error: %define variable 'var' redefined
     1 | %define var "gram"
       | ^~~~~~~~~~~~~~~~~~
-<command line>:4:      previous definition
+<command line>:4: note: previous definition
 input-dg.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
 
@@ -2064,9 +2064,9 @@ AT_BISON_CHECK([[-fcaret input.y]], [[1]], [[]],
 [[input.y:1.1-34: error: invalid value for %define variable 'lr.default-reduction': 'bogus'
     1 | %define lr.default-reduction bogus
       | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-input.y:1.1-34:     accepted value: 'most'
-input.y:1.1-34:     accepted value: 'consistent'
-input.y:1.1-34:     accepted value: 'accepting'
+input.y:1.1-34: note: accepted value: 'most'
+input.y:1.1-34: note: accepted value: 'consistent'
+input.y:1.1-34: note: accepted value: 'accepting'
 ]])
 
 # Back-end.
@@ -2079,9 +2079,9 @@ AT_BISON_CHECK([[-fcaret input.y]], [[1]], [[]],
 [[input.y:1.1-29: error: invalid value for %define variable 'api.push-pull': 'neither'
     1 | %define api.push-pull neither
       | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-input.y:1.1-29:     accepted value: 'pull'
-input.y:1.1-29:     accepted value: 'push'
-input.y:1.1-29:     accepted value: 'both'
+input.y:1.1-29: note: accepted value: 'pull'
+input.y:1.1-29: note: accepted value: 'push'
+input.y:1.1-29: note: accepted value: 'both'
 ]])
 
 AT_CLEANUP
@@ -2376,14 +2376,14 @@ AT_BISON_CHECK([[-Dparse.lac=full -L c++ input.y]])
 AT_BISON_CHECK([[-Dparse.lac=unsupported input.y]],
                [[1]], [],
 [[<command line>:3: error: invalid value for %define variable 'parse.lac': 'unsupported'
-<command line>:3:     accepted value: 'full'
-<command line>:3:     accepted value: 'none'
+<command line>:3: note: accepted value: 'full'
+<command line>:3: note: accepted value: 'none'
 ]])
 AT_BISON_CHECK([[-Dparse.lac=unsupported -L c++ input.y]],
                [[1]], [],
 [[<command line>:3: error: invalid value for %define variable 'parse.lac': 'unsupported'
-<command line>:3:     accepted value: 'full'
-<command line>:3:     accepted value: 'none'
+<command line>:3: note: accepted value: 'full'
+<command line>:3: note: accepted value: 'none'
 ]])
 
 # parse.lac.* options are useless if LAC isn't actually activated.
@@ -2508,9 +2508,9 @@ AT_TEST([[%union foo {};
 %define api.value.union.name foo]],
 [0],
 [[input.y:3.8-10: warning: %define variable 'api.value.union.name' redefined [-Wother]
-input.y:1.8-10:     previous definition
+input.y:1.8-10: note: previous definition
 input.y:4.1-32: warning: %define variable 'api.value.union.name' redefined [-Wother]
-input.y:3.8-10:     previous definition
+input.y:3.8-10: note: previous definition
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
 
@@ -2679,7 +2679,7 @@ fix-it:"input.y":{12:1-12:11}:"%expect-rr"
 input.y:13.1-14: warning: deprecated directive: '%file-prefix =', use '%file-prefix' [-Wdeprecated]
 fix-it:"input.y":{13:1-13:15}:"%file-prefix"
 input.y:14.1-16.5: warning: duplicate directive: '%file-prefix\n =' [-Wother]
-input.y:13.1-20:       previous declaration
+input.y:13.1-20: note: previous declaration
 fix-it:"input.y":{14:1-16:6}:""
 input.y:17.9-27: warning: deprecated directive: '%fixed-output_files', use '%output "y.tab.c"' [-Wdeprecated]
 fix-it:"input.y":{17:2-17:21}:"%output \"y.tab.c\""
@@ -2702,10 +2702,10 @@ fix-it:"input.y":{25:1-25:13}:"%define api.pure"
 input.y:26.1-12: warning: deprecated directive: '%token_table', use '%token-table' [-Wdeprecated]
 fix-it:"input.y":{26:1-26:13}:"%token-table"
 input.y:27.1-14: warning: %define variable 'parse.error' redefined [-Wother]
-input.y:11.1-14:     previous definition
+input.y:11.1-14: note: previous definition
 fix-it:"input.y":{27:1-27:15}:""
 input.y:29.1-18: warning: duplicate directive: '%name-prefix "bar"' [-Wother]
-input.y:13.1-20:     previous declaration
+input.y:13.1-20: note: previous declaration
 fix-it:"input.y":{29:1-29:19}:""
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
@@ -2788,9 +2788,9 @@ input.y:11.15-24: warning: deprecated directive: '%expect_rr', use '%expect-rr'
 input.y:12.15-24: warning: deprecated directive: '%expect_rr', use '%expect-rr' [-Wdeprecated]
 input.y:13.1-14: warning: deprecated directive: '%error_verbose', use '%define parse.error verbose' [-Wdeprecated]
 input.y:13.16-29: warning: %define variable 'parse.error' redefined [-Wother]
-input.y:13.1-14:      previous definition
+input.y:13.1-14: note: previous definition
 input.y:14.16-29: warning: %define variable 'parse.error' redefined [-Wother]
-input.y:13.16-29:     previous definition
+input.y:13.16-29: note: previous definition
 input.y: error: reduce/reduce conflicts: 0 found, 42 expected
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
@@ -2825,7 +2825,7 @@ AT_DATA_GRAMMAR([[input.y]],
 
 AT_BISON_CHECK([[input.y]], [[0]], [[]],
 [[input.y:14.1-15.5: warning: duplicate directive: '%file-prefix' [-Wother]
-input.y:13.1-18:       previous declaration
+input.y:13.1-18: note: previous declaration
 input.y: warning: %expect-rr applies only to GLR parsers [-Wother]
 input.y: warning: fix-its can be applied.  Rerun with option '--update'. [-Wother]
 ]])
@@ -2875,13 +2875,13 @@ AT_BISON_CHECK([[-fcaret input.y]], [[1]], [[]],
 [[input.y:10.8-10: error: character literals cannot be used together with api.token.raw
    10 | %token 'a'
       |        ^~~
-input.y:9.1-21:      definition of api.token.raw
+input.y:9.1-21: note: definition of api.token.raw
     9 | %define api.token.raw
       | ^~~~~~~~~~~~~~~~~~~~~
 input.y:12.6-8: error: character literals cannot be used together with api.token.raw
    12 | exp: 'b' "c" {}
       |      ^~~
-input.y:9.1-21:     definition of api.token.raw
+input.y:9.1-21: note: definition of api.token.raw
     9 | %define api.token.raw
       | ^~~~~~~~~~~~~~~~~~~~~
 ]])
diff --git a/tests/named-refs.at b/tests/named-refs.at
index 6c55bf8b..fb901ee5 100644
--- a/tests/named-refs.at
+++ b/tests/named-refs.at
@@ -255,19 +255,19 @@ AT_BISON_CHECK([-fcaret -o test.c test.y], 1, [],
 [[test.y:52.51-60: error: invalid reference: '$<ival>lo9'
    52 | | exp[x] '+' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>lo9 + $r; }
       |                                                   ^~~~~~~~~~
-test.y:52.3-68:      symbol not found in production: lo9
+test.y:52.3-68: note: symbol not found in production: lo9
    52 | | exp[x] '+' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>lo9 + $r; }
       |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 test.y:53.51-60: warning: misleading reference: '$<ival>exp' [-Wother]
    53 | | exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
       |                                                   ^~~~~~~~~~
-test.y:44.1-3:       refers to: $exp at $$
+test.y:44.1-3: note: refers to: $exp at $$
    44 | exp:
       | ^~~
-test.y:53.7:         possibly meant: $x, hiding $exp at $1
+test.y:53.7: note: possibly meant: $x, hiding $exp at $1
    53 | | exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
       |       ^
-test.y:53.41:        possibly meant: $r, hiding $exp at $4
+test.y:53.41: note: possibly meant: $r, hiding $exp at $4
    53 | | exp[x] '-' { $<ival>$ = $x; } [l] exp[r] { $$ = $<ival>exp - $r; }
       |                                         ^
 test.y:54.51-52: error: $l of 'exp' has no declared type
@@ -276,13 +276,13 @@ test.y:54.51-52: error: $l of 'exp' has no declared type
 test.y:57.40-43: error: invalid reference: '$r12'
    57 | | exp[l] '^' exp[r]  { $$ = power ($l, $r12); }
       |                                        ^~~~
-test.y:57.3-47:      symbol not found in production: r12
+test.y:57.3-47: note: symbol not found in production: r12
    57 | | exp[l] '^' exp[r]  { $$ = power ($l, $r12); }
       |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 test.y:58.29-33: error: invalid reference: '$expo'
    58 | | '(' exp ')'        { $$ = $expo;           }
       |                             ^~~~~
-test.y:58.3-46:      symbol not found in production: expo
+test.y:58.3-46: note: symbol not found in production: expo
    58 | | '(' exp ')'        { $$ = $expo;           }
       |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ]])
@@ -305,8 +305,8 @@ foo.bar: '2'
 ]])
 AT_BISON_CHECK([-o test.c test.y], 0, [],
 [[test.y:11.22-29: warning: misleading reference: '$foo.bar' [-Wother]
-test.y:11.8-10:      refers to: $foo at $1
-test.y:11.12-18:     possibly meant: $[foo.bar] at $2
+test.y:11.8-10: note: refers to: $foo at $1
+test.y:11.12-18: note: possibly meant: $[foo.bar] at $2
 ]])
 AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
@@ -383,162 +383,162 @@ factor:     '(' expr ')'  { $$ = $2; }
 ]])
 AT_BISON_CHECK([-o test.c test.y], 1, [],
 [[test.y:24.36-41: error: invalid reference: '$cond1'
-test.y:23.11-24.62:  symbol not found in production: cond1
+test.y:23.11-24.62: note: symbol not found in production: cond1
 test.y:26.43-53: error: invalid reference: '$stmt.field'
-test.y:25.11-26.60:  symbol not found in production: stmt
-test.y:25.35-38:     possibly meant: $then.field, hiding $stmt.field at $4
+test.y:25.11-26.60: note: symbol not found in production: stmt
+test.y:25.35-38: note: possibly meant: $then.field, hiding $stmt.field at $4
 test.y:28.43-52: error: invalid reference: '$stmt.list'
-test.y:27.11-28.59:  symbol not found in production: stmt
-test.y:27.30-38:     possibly meant: $[stmt.list] at $4
+test.y:27.11-28.59: note: symbol not found in production: stmt
+test.y:27.30-38: note: possibly meant: $[stmt.list] at $4
 test.y:30.43-46: error: ambiguous reference: '$xyz'
-test.y:29.35-37:     refers to: $xyz at $4
-test.y:29.50-52:     refers to: $xyz at $6
+test.y:29.35-37: note: refers to: $xyz at $4
+test.y:29.50-52: note: refers to: $xyz at $6
 test.y:32.43-52: error: invalid reference: '$stmt.list'
-test.y:31.11-32.63:  symbol not found in production: stmt
-test.y:31.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
-test.y:31.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
+test.y:31.11-32.63: note: symbol not found in production: stmt
+test.y:31.40-43: note: possibly meant: $then, hiding $[stmt.list] at $4
+test.y:31.61-64: note: possibly meant: $else, hiding $[stmt.list] at $6
 test.y:34.43-58: error: invalid reference: '$stmt.list.field'
-test.y:33.11-34.69:  symbol not found in production: stmt
-test.y:33.40-43:     possibly meant: $then.field, hiding $[stmt.list].field at $4
-test.y:33.61-64:     possibly meant: $else.field, hiding $[stmt.list].field at $6
+test.y:33.11-34.69: note: symbol not found in production: stmt
+test.y:33.40-43: note: possibly meant: $then.field, hiding $[stmt.list].field at $4
+test.y:33.61-64: note: possibly meant: $else.field, hiding $[stmt.list].field at $6
 test.y:36.43-54: error: invalid reference: '$[stmt.list]'
-test.y:35.11-36.71:  symbol not found in production: stmt.list
-test.y:35.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
-test.y:35.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
+test.y:35.11-36.71: note: symbol not found in production: stmt.list
+test.y:35.40-43: note: possibly meant: $then, hiding $[stmt.list] at $4
+test.y:35.61-64: note: possibly meant: $else, hiding $[stmt.list] at $6
 test.y:38.43-49: error: invalid reference: '$then.1'
-test.y:37.11-38.60:  symbol not found in production: then
-test.y:37.40-45:     possibly meant: $[then.1] at $4
+test.y:37.11-38.60: note: symbol not found in production: then
+test.y:37.40-45: note: possibly meant: $[then.1] at $4
 test.y:40.43-55: error: invalid reference: '$then.1.field'
-test.y:39.11-40.66:  symbol not found in production: then
-test.y:39.40-45:     possibly meant: $[then.1].field at $4
+test.y:39.11-40.66: note: symbol not found in production: then
+test.y:39.40-45: note: possibly meant: $[then.1].field at $4
 test.y:42.44-50: error: invalid reference: '$stmt.x'
-test.y:41.12-42.57:  symbol not found in production: stmt
-test.y:41.36-41:     possibly meant: $[stmt.x].x, hiding $stmt.x at $4
-test.y:41.36-41:     possibly meant: $[stmt.x] at $4
+test.y:41.12-42.57: note: symbol not found in production: stmt
+test.y:41.36-41: note: possibly meant: $[stmt.x].x, hiding $stmt.x at $4
+test.y:41.36-41: note: possibly meant: $[stmt.x] at $4
 test.y:44.13-22: error: invalid reference: '$if-stmt-a'
-test.y:43.12-44.59:  symbol not found in production: if
-test.y:43.1-9:       possibly meant: $[if-stmt-a] at $$
+test.y:43.12-44.59: note: symbol not found in production: if
+test.y:43.1-9: note: possibly meant: $[if-stmt-a] at $$
 test.y:46.46-54: error: invalid reference: '$then-a.f'
-test.y:45.12-46.65:  symbol not found in production: then
-test.y:45.41-46:     possibly meant: $[then-a].f at $4
+test.y:45.12-46.65: note: symbol not found in production: then
+test.y:45.41-46: note: possibly meant: $[then-a].f at $4
 ]])
 
 AT_BISON_CHECK([-fcaret -o test.c test.y], 1, [],
 [[test.y:24.36-41: error: invalid reference: '$cond1'
    24 |           { $if_stmt1 = new IfStmt($cond1, $then.f1, $else); };
       |                                    ^~~~~~
-test.y:23.11-24.62:  symbol not found in production: cond1
+test.y:23.11-24.62: note: symbol not found in production: cond1
    23 | if_stmt1: IF expr[cond] THEN stmt[then] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 test.y:26.43-53: error: invalid reference: '$stmt.field'
    26 |           { $if_stmt2 = new IfStmt($cond, $stmt.field, 0); };
       |                                           ^~~~~~~~~~~
-test.y:25.11-26.60:  symbol not found in production: stmt
+test.y:25.11-26.60: note: symbol not found in production: stmt
    25 | if_stmt2: IF expr[cond] THEN stmt[then] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:25.35-38:     possibly meant: $then.field, hiding $stmt.field at $4
+test.y:25.35-38: note: possibly meant: $then.field, hiding $stmt.field at $4
    25 | if_stmt2: IF expr[cond] THEN stmt[then] FI
       |                                   ^~~~
 test.y:28.43-52: error: invalid reference: '$stmt.list'
    28 |           { $if_stmt3 = new IfStmt($cond, $stmt.list, 0); };
       |                                           ^~~~~~~~~~
-test.y:27.11-28.59:  symbol not found in production: stmt
+test.y:27.11-28.59: note: symbol not found in production: stmt
    27 | if_stmt3: IF expr[cond] THEN stmt.list FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:27.30-38:     possibly meant: $[stmt.list] at $4
+test.y:27.30-38: note: possibly meant: $[stmt.list] at $4
    27 | if_stmt3: IF expr[cond] THEN stmt.list FI
       |                              ^~~~~~~~~
 test.y:30.43-46: error: ambiguous reference: '$xyz'
    30 |           { $if_stmt4 = new IfStmt($cond, $xyz, $cond); };
       |                                           ^~~~
-test.y:29.35-37:     refers to: $xyz at $4
+test.y:29.35-37: note: refers to: $xyz at $4
    29 | if_stmt4: IF expr[cond] THEN stmt[xyz] ELSE stmt[xyz] FI
       |                                   ^~~
-test.y:29.50-52:     refers to: $xyz at $6
+test.y:29.50-52: note: refers to: $xyz at $6
    29 | if_stmt4: IF expr[cond] THEN stmt[xyz] ELSE stmt[xyz] FI
       |                                                  ^~~
 test.y:32.43-52: error: invalid reference: '$stmt.list'
    32 |           { $if_stmt5 = new IfStmt($cond, $stmt.list, $else); };
       |                                           ^~~~~~~~~~
-test.y:31.11-32.63:  symbol not found in production: stmt
+test.y:31.11-32.63: note: symbol not found in production: stmt
    31 | if_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:31.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
+test.y:31.40-43: note: possibly meant: $then, hiding $[stmt.list] at $4
    31 | if_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                        ^~~~
-test.y:31.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
+test.y:31.61-64: note: possibly meant: $else, hiding $[stmt.list] at $6
    31 | if_stmt5: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                                             ^~~~
 test.y:34.43-58: error: invalid reference: '$stmt.list.field'
    34 |           { $if_stmt6 = new IfStmt($cond, $stmt.list.field, $else); };
       |                                           ^~~~~~~~~~~~~~~~
-test.y:33.11-34.69:  symbol not found in production: stmt
+test.y:33.11-34.69: note: symbol not found in production: stmt
    33 | if_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:33.40-43:     possibly meant: $then.field, hiding $[stmt.list].field at $4
+test.y:33.40-43: note: possibly meant: $then.field, hiding $[stmt.list].field at $4
    33 | if_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                        ^~~~
-test.y:33.61-64:     possibly meant: $else.field, hiding $[stmt.list].field at $6
+test.y:33.61-64: note: possibly meant: $else.field, hiding $[stmt.list].field at $6
    33 | if_stmt6: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                                             ^~~~
 test.y:36.43-54: error: invalid reference: '$[stmt.list]'
    36 |           { $if_stmt7 = new IfStmt($cond, $[stmt.list].field, $else); };
       |                                           ^~~~~~~~~~~~
-test.y:35.11-36.71:  symbol not found in production: stmt.list
+test.y:35.11-36.71: note: symbol not found in production: stmt.list
    35 | if_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:35.40-43:     possibly meant: $then, hiding $[stmt.list] at $4
+test.y:35.40-43: note: possibly meant: $then, hiding $[stmt.list] at $4
    35 | if_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                        ^~~~
-test.y:35.61-64:     possibly meant: $else, hiding $[stmt.list] at $6
+test.y:35.61-64: note: possibly meant: $else, hiding $[stmt.list] at $6
    35 | if_stmt7: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |                                                             ^~~~
 test.y:38.43-49: error: invalid reference: '$then.1'
    38 |           { $if_stmt8 = new IfStmt($cond, $then.1, $else); };
       |                                           ^~~~~~~
-test.y:37.11-38.60:  symbol not found in production: then
+test.y:37.11-38.60: note: symbol not found in production: then
    37 | if_stmt8: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:37.40-45:     possibly meant: $[then.1] at $4
+test.y:37.40-45: note: possibly meant: $[then.1] at $4
    37 | if_stmt8: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
       |                                        ^~~~~~
 test.y:40.43-55: error: invalid reference: '$then.1.field'
    40 |           { $if_stmt9 = new IfStmt($cond, $then.1.field, $else); };
       |                                           ^~~~~~~~~~~~~
-test.y:39.11-40.66:  symbol not found in production: then
+test.y:39.11-40.66: note: symbol not found in production: then
    39 | if_stmt9: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
       |           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:39.40-45:     possibly meant: $[then.1].field at $4
+test.y:39.40-45: note: possibly meant: $[then.1].field at $4
    39 | if_stmt9: IF expr[cond] THEN stmt.list[then.1] ELSE stmt.list[else] FI
       |                                        ^~~~~~
 test.y:42.44-50: error: invalid reference: '$stmt.x'
    42 |           { $if_stmt10 = new IfStmt($cond, $stmt.x, 0); };
       |                                            ^~~~~~~
-test.y:41.12-42.57:  symbol not found in production: stmt
+test.y:41.12-42.57: note: symbol not found in production: stmt
    41 | if_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
       |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:41.36-41:     possibly meant: $[stmt.x].x, hiding $stmt.x at $4
+test.y:41.36-41: note: possibly meant: $[stmt.x].x, hiding $stmt.x at $4
    41 | if_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
       |                                    ^~~~~~
-test.y:41.36-41:     possibly meant: $[stmt.x] at $4
+test.y:41.36-41: note: possibly meant: $[stmt.x] at $4
    41 | if_stmt10: IF expr[cond] THEN stmt[stmt.x] FI
       |                                    ^~~~~~
 test.y:44.13-22: error: invalid reference: '$if-stmt-a'
    44 |           { $if-stmt-a = new IfStmt($cond, $then, $else); };
       |             ^~~~~~~~~~
-test.y:43.12-44.59:  symbol not found in production: if
+test.y:43.12-44.59: note: symbol not found in production: if
    43 | if-stmt-a: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:43.1-9:       possibly meant: $[if-stmt-a] at $$
+test.y:43.1-9: note: possibly meant: $[if-stmt-a] at $$
    43 | if-stmt-a: IF expr[cond] THEN stmt.list[then] ELSE stmt.list[else] FI
       | ^~~~~~~~~
 test.y:46.46-54: error: invalid reference: '$then-a.f'
    46 |           { $[if-stmt-b] = new IfStmt($cond, $then-a.f, $else); };
       |                                              ^~~~~~~~~
-test.y:45.12-46.65:  symbol not found in production: then
+test.y:45.12-46.65: note: symbol not found in production: then
    45 | if-stmt-b: IF expr[cond] THEN if-stmt-a[then-a] ELSE stmt.list[else] FI
       |            ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-test.y:45.41-46:     possibly meant: $[then-a].f at $4
+test.y:45.41-46: note: possibly meant: $[then-a].f at $4
    45 | if-stmt-b: IF expr[cond] THEN if-stmt-a[then-a] ELSE stmt.list[else] FI
       |                                         ^~~~~~
 ]])
@@ -675,37 +675,37 @@ sym_b: 'b';
 ]])
 AT_BISON_CHECK([-o test.c test.y], 1, [],
 [[test.y:12.22-31: error: invalid reference: '$sym.field'
-test.y:12.3-35:      symbol not found in production: sym
+test.y:12.3-35: note: symbol not found in production: sym
 test.y:13.22-35: error: invalid reference: '$<aa>sym.field'
-test.y:13.3-39:      symbol not found in production: sym
+test.y:13.3-39: note: symbol not found in production: sym
 test.y:14.22-33: error: invalid reference: '$[sym.field]'
-test.y:14.3-37:      symbol not found in production: sym.field
+test.y:14.3-37: note: symbol not found in production: sym.field
 test.y:15.22-37: error: invalid reference: '$<aa>[sym.field]'
-test.y:15.3-41:      symbol not found in production: sym.field
+test.y:15.3-41: note: symbol not found in production: sym.field
 test.y:16.22-25: error: invalid reference: '$sym'
-test.y:16.3-29:      symbol not found in production: sym
+test.y:16.3-29: note: symbol not found in production: sym
 test.y:17.22-29: error: invalid reference: '$<aa>sym'
-test.y:17.3-33:      symbol not found in production: sym
+test.y:17.3-33: note: symbol not found in production: sym
 test.y:18.22-27: error: invalid reference: '$[sym]'
-test.y:18.3-65:      symbol not found in production before $3: sym
+test.y:18.3-65: note: symbol not found in production before $3: sym
 test.y:18.52-61: error: invalid reference: '$<aa>[sym]'
-test.y:18.3-65:      symbol not found in production: sym
+test.y:18.3-65: note: symbol not found in production: sym
 test.y:22.22-31: error: invalid reference: '$sym-field'
-test.y:22.3-35:      symbol not found in production: sym
+test.y:22.3-35: note: symbol not found in production: sym
 test.y:23.22-35: error: invalid reference: '$<aa>sym-field'
-test.y:23.3-39:      symbol not found in production: sym
+test.y:23.3-39: note: symbol not found in production: sym
 test.y:24.22-33: error: invalid reference: '$[sym-field]'
-test.y:24.3-37:      symbol not found in production: sym-field
+test.y:24.3-37: note: symbol not found in production: sym-field
 test.y:25.22-37: error: invalid reference: '$<aa>[sym-field]'
-test.y:25.3-41:      symbol not found in production: sym-field
+test.y:25.3-41: note: symbol not found in production: sym-field
 test.y:26.22-25: error: invalid reference: '$sym'
-test.y:26.3-29:      symbol not found in production: sym
+test.y:26.3-29: note: symbol not found in production: sym
 test.y:27.22-29: error: invalid reference: '$<aa>sym'
-test.y:27.3-33:      symbol not found in production: sym
+test.y:27.3-33: note: symbol not found in production: sym
 test.y:28.22-27: error: invalid reference: '$[sym]'
-test.y:28.3-65:      symbol not found in production before $3: sym
+test.y:28.3-65: note: symbol not found in production before $3: sym
 test.y:28.52-61: error: invalid reference: '$<aa>[sym]'
-test.y:28.3-65:      symbol not found in production: sym
+test.y:28.3-65: note: symbol not found in production: sym
 ]])
 AT_BISON_OPTION_POPDEFS
 AT_CLEANUP
@@ -724,10 +724,10 @@ start:
 ]])
 AT_BISON_CHECK([[test.y]], [[1]], [],
 [[test.y:4.12-18: error: invalid reference: '$.field'
-test.y:4.13:        syntax error after '$', expecting integer, letter, '_', '@<:@', or '$'
-test.y:4.3-8:       possibly meant: $[.field] at $1
+test.y:4.13: note: syntax error after '$', expecting integer, letter, '_', '@<:@', or '$'
+test.y:4.3-8: note: possibly meant: $[.field] at $1
 test.y:5.12-18: error: invalid reference: '@.field'
-test.y:5.13:        syntax error after '@', expecting integer, letter, '_', '@<:@', or '$'
+test.y:5.13: note: syntax error after '@', expecting integer, letter, '_', '@<:@', or '$'
 ]])
 AT_DATA([[test.y]],
 [[
diff --git a/tests/regression.at b/tests/regression.at
index d7d3e0de..cd79b507 100644
--- a/tests/regression.at
+++ b/tests/regression.at
@@ -400,7 +400,7 @@ AT_BISON_CHECK([-fcaret -o input.c input.y], [[0]], [[]],
 [[input.y:22.8-14: warning: symbol SPECIAL redeclared [-Wother]
    22 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
       |        ^~~~~~~
-input.y:21.8-14:     previous declaration
+input.y:21.8-14: note: previous declaration
    21 | %token SPECIAL "\\\'\?\"\a\b\f\n\r\t\v\001\201\x001\x000081??!"
       |        ^~~~~~~
 input.y:22.16-63: warning: symbol "\\'?\"\a\b\f\n\r\t\v\001\201\001\201??!" used more than once as a literal string [-Wother]
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.