]> git.saurik.com Git - bison.git/blobdiff - src/complain.c
doc: use @group to improve page breaking
[bison.git] / src / complain.c
index 985ef404e79a2e42f0595edf1695e668b6f7aad5..5a1b45a43a4a75a7f93dbb92c26077e3046fc45a 100644 (file)
@@ -1,6 +1,6 @@
 /* Declaration for error-reporting function for Bison.
 
-   Copyright (C) 2000-2002, 2004-2006, 2009-2012 Free Software
+   Copyright (C) 2000-2002, 2004-2006, 2009-2013 Free Software
    Foundation, Inc.
 
    This program is free software: you can redistribute it and/or modify
 #include "complain.h"
 #include "files.h"
 #include "getargs.h"
+#include "quote.h"
 
 warnings warnings_flag =
   Wconflicts_sr | Wconflicts_rr | Wdeprecated  | Wother;
 
 warnings errors_flag;
 
-bool complaint_issued;
+err_status complaint_status = status_none;
 static unsigned *indent_ptr = 0;
 
 void
@@ -49,6 +50,7 @@ warnings_print_categories (warnings warn_flags)
           "conflicts-sr",
           "conflicts-rr",
           "deprecated",
+          "precedence",
           "other"
         };
 
@@ -87,7 +89,7 @@ error_message (const location *loc, warnings flags, const char *prefix,
   unsigned pos = 0;
 
   if (loc)
-    pos += location_print (stderr, *loc);
+    pos += location_print (*loc, stderr);
   else
     pos += fprintf (stderr, "%s", current_file ? current_file : program_name);
   pos += fprintf (stderr, ": ");
@@ -110,12 +112,15 @@ error_message (const location *loc, warnings flags, const char *prefix,
   warnings_print_categories (flags);
   {
     size_t l = strlen (message);
-    if (l < 2 || message[l-2] != ':' || message[l-1] != ' ')
+    if (l < 2 || message[l - 2] != ':' || message[l - 1] != ' ')
       {
         putc ('\n', stderr);
         fflush (stderr);
+        if (loc && feature_flag & feature_caret && !(flags & no_caret))
+          location_caret (*loc, stderr);
       }
   }
+  fflush (stderr);
 }
 
 /** Raise a complaint. That can be a fatal error, a complaint or just a
@@ -129,8 +134,11 @@ complains (const location *loc, warnings flags, const char *message,
     : flags & (errors_flag | complaint) ? _("error")
     : _("warning");
 
-  complaint_issued |= flags & (complaint | errors_flag);
-  if (flags & (warnings_flag | silent | fatal | complaint))
+  if ((flags & complaint) && complaint_status < status_complaint)
+    complaint_status = status_complaint;
+  else if ((flags & (warnings_flag & errors_flag)) && ! complaint_status)
+    complaint_status = status_warning_as_error;
+  if (flags & (warnings_flag | fatal | complaint))
     error_message (loc, flags, prefix, message, args);
   if (flags & fatal)
     exit (EXIT_FAILURE);
@@ -162,24 +170,38 @@ complain_args (location const *loc, warnings w, unsigned *indent,
 {
   switch (argc)
   {
+  case 1:
+    complain_indent (loc, w, indent, "%s", _(argv[0]));
+    break;
   case 2:
-    complain_indent (loc, w, indent, "%s", _(argv[1]));
+    complain_indent (loc, w, indent, _(argv[0]), argv[1]);
     break;
   case 3:
-    complain_indent (loc, w, indent, _(argv[1]), argv[2]);
+    complain_indent (loc, w, indent, _(argv[0]), argv[1], argv[2]);
     break;
   case 4:
-    complain_indent (loc, w, indent, _(argv[1]), argv[2], argv[3]);
+    complain_indent (loc, w, indent, _(argv[0]), argv[1], argv[2], argv[3]);
     break;
   case 5:
-    complain_indent (loc, w, indent, _(argv[1]), argv[2], argv[3], argv[4]);
-    break;
-  case 6:
-    complain_indent (loc, w, indent, _(argv[1]), argv[2], argv[3], argv[4],
-                     argv[5]);
+    complain_indent (loc, w, indent, _(argv[0]), argv[1], argv[2], argv[3],
+                     argv[4]);
     break;
   default:
     complain (loc, fatal, "too many arguments for complains");
     break;
   }
+
+}
+
+void
+deprecated_directive (location const *loc, char const *old, char const *upd)
+{
+  if (feature_flag & feature_caret)
+    complain (loc, Wdeprecated,
+              _("deprecated directive, use %s"),
+              quote_n (1, upd));
+  else
+    complain (loc, Wdeprecated,
+              _("deprecated directive: %s, use %s"),
+              quote (old), quote_n (1, upd));
 }