[committed] Cleanup of libcpp diagnostic callbacks

Message ID 1539131219-64577-1-git-send-email-dmalcolm@redhat.com
State New
Headers show
Series
  • [committed] Cleanup of libcpp diagnostic callbacks
Related show

Commit Message

David Malcolm Oct. 10, 2018, 12:26 a.m.
This patch renames the "error" callback within libcpp
to "diagnostic", and uses the pair of enums in cpplib.h, rather
than passing two different kinds of "int" around.

Successfully bootstrapped & regrtested on x86_64-pc-linux-gnu.

Committed to trunk as r264999.

gcc/c-family/ChangeLog:
	* c-common.c (c_option_controlling_cpp_error): Rename to...
	(c_option_controlling_cpp_diagnostic): ...this, and convert
	"reason" from int to enum.
	(c_cpp_error): Rename to...
	(c_cpp_diagnostic): ...this, converting level and reason to enums.
	* c-common.h (c_cpp_error): Rename to...
	(c_cpp_diagnostic): ...this, converting level and reason to enums.
	* c-opts.c (c_common_init_options): Update for renaming.

gcc/fortran/ChangeLog:
	* cpp.c (gfc_cpp_init_0): Update for renamings.
	(cb_cpp_error): Rename to...
	(cb_cpp_diagnostic): ...this, converting level and reason to
	enums.

gcc/ChangeLog:
	* genmatch.c (error_cb): Rename to...
	(diagnostic_cb): ...this, converting int params to enums.
	(fatal_at): Update for renaming.
	(warning_at): Likewise.
	(main): Likewise.
	* input.c (selftest::ebcdic_execution_charset::apply):
	Update for renaming of...
	(selftest::ebcdic_execution_charset::on_error): ...this, renaming
	to...
	(selftest::ebcdic_execution_charset::on_diagnostic): ...this,
	converting level and reason to enums.
	(class selftest::lexer_error_sink): Rename to...
	(class selftest::lexer_test_options): ...this, renaming field
	"m_errors" to "m_diagnostics".
	(selftest::lexer_test_options::apply): Update for renaming of...
	(selftest::lexer_test_options::on_error): ...this, renaming to...
	(selftest::lexer_test_options::on_diagnostic): ...this
	converting level and reason to enums.
	(selftest::test_lexer_string_locations_raw_string_unterminated):
	Update for renamings.
	* opth-gen.awk (struct cpp_reason_option_codes_t): Use enum for
	"reason".

libcpp/ChangeLog:
	* charset.c (noop_error_cb): Rename to...
	(noop_diagnostic_cb): ...this, converting params to enums.
	(cpp_interpret_string_ranges): Update for renaming and enums.
	* directives.c (check_eol_1): Convert reason to enum.
	(do_diagnostic): Convert code and reason to enum.
	(do_error): Use CPP_W_NONE rather than 0.
	(do_pragma_dependency): Likewise.
	* errors.c (cpp_diagnostic_at): Convert level and reason to enums.
	Update for renaming.
	(cpp_diagnostic): Convert level and reason to enums.
	(cpp_error): Convert level to enum.
	(cpp_warning): Convert reason to enums.
	(cpp_pedwarning): Likewise.
	(cpp_warning_syshdr): Likewise.
	(cpp_diagnostic_with_line): Convert level and reason to enums.
	Update for renaming.
	(cpp_error_with_line): Convert level to enum.
	(cpp_warning_with_line): Convert reason to enums.
	(cpp_pedwarning_with_line): Likewise.
	(cpp_warning_with_line_syshdr): Likewise.
	(cpp_error_at): Convert level to enum.
	(cpp_errno): Likewise.
	(cpp_errno_filename): Likewise.
	* include/cpplib.h (enum cpp_diagnostic_level): Name this enum,
	and move to before struct cpp_callbacks.
	(enum cpp_warning_reason): Likewise.
	(cpp_callbacks::diagnostic): Convert params from int to enums.
	(cpp_error): Convert int param to enum cpp_diagnostic_level.
	(cpp_warning): Convert int param to enum cpp_warning_reason.
	(cpp_pedwarning): Likewise.
	(cpp_warning_syshdr): Likewise.
	(cpp_errno): Convert int param to enum cpp_diagnostic_level.
	(cpp_errno_filename): Likewise.
	(cpp_error_with_line): Likewise.
	(cpp_warning_with_line): Convert int param to enum
	cpp_warning_reason.
	(cpp_pedwarning_with_line): Likewise.
	(cpp_warning_with_line_syshdr): Likewise.
	(cpp_error_at): Convert int param to enum cpp_diagnostic_level.
	* macro.c (create_iso_definition): Convert int to enum.
	(_cpp_create_definition): Likewise.
---
 gcc/c-family/c-common.c |  17 +++---
 gcc/c-family/c-common.h |   5 +-
 gcc/c-family/c-opts.c   |   2 +-
 gcc/fortran/cpp.c       |  15 +++--
 gcc/genmatch.c          |  15 ++---
 gcc/input.c             |  50 +++++++--------
 gcc/opth-gen.awk        |   6 +-
 libcpp/charset.c        |  30 ++++-----
 libcpp/directives.c     |  12 ++--
 libcpp/errors.c         |  66 +++++++++++---------
 libcpp/include/cpplib.h | 158 ++++++++++++++++++++++++++----------------------
 libcpp/macro.c          |   4 +-
 12 files changed, 207 insertions(+), 173 deletions(-)

Patch

diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c
index 4bfb145..ac98c9b 100644
--- a/gcc/c-family/c-common.c
+++ b/gcc/c-family/c-common.c
@@ -6068,7 +6068,7 @@  c_parse_error (const char *gmsgid, enum cpp_ttype token_type,
    message, or 0 if none.  */
 
 static int
-c_option_controlling_cpp_error (int reason)
+c_option_controlling_cpp_diagnostic (enum cpp_warning_reason reason)
 {
   const struct cpp_reason_option_codes_t *entry;
 
@@ -6080,7 +6080,7 @@  c_option_controlling_cpp_error (int reason)
   return 0;
 }
 
-/* Callback from cpp_error for PFILE to print diagnostics from the
+/* Callback from cpp_diagnostic for PFILE to print diagnostics from the
    preprocessor.  The diagnostic is of type LEVEL, with REASON set
    to the reason code if LEVEL is represents a warning, at location
    RICHLOC unless this is after lexing and the compiler's location
@@ -6089,9 +6089,11 @@  c_option_controlling_cpp_error (int reason)
    otherwise.  */
 
 bool
-c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
-	     rich_location *richloc,
-	     const char *msg, va_list *ap)
+c_cpp_diagnostic (cpp_reader *pfile ATTRIBUTE_UNUSED,
+		  enum cpp_diagnostic_level level,
+		  enum cpp_warning_reason reason,
+		  rich_location *richloc,
+		  const char *msg, va_list *ap)
 {
   diagnostic_info diagnostic;
   diagnostic_t dlevel;
@@ -6134,8 +6136,9 @@  c_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
     richloc->set_range (0, input_location, SHOW_RANGE_WITH_CARET);
   diagnostic_set_info_translated (&diagnostic, msg, ap,
 				  richloc, dlevel);
-  diagnostic_override_option_index (&diagnostic,
-                                    c_option_controlling_cpp_error (reason));
+  diagnostic_override_option_index
+    (&diagnostic,
+     c_option_controlling_cpp_diagnostic (reason));
   ret = diagnostic_report_diagnostic (global_dc, &diagnostic);
   if (level == CPP_DL_WARNING_SYSHDR)
     global_dc->dc_warn_system_headers = save_warn_system_headers;
diff --git a/gcc/c-family/c-common.h b/gcc/c-family/c-common.h
index 9e86876..70b152f 100644
--- a/gcc/c-family/c-common.h
+++ b/gcc/c-family/c-common.h
@@ -1000,8 +1000,9 @@  extern void init_c_lex (void);
 
 extern void c_cpp_builtins (cpp_reader *);
 extern void c_cpp_builtins_optimize_pragma (cpp_reader *, tree, tree);
-extern bool c_cpp_error (cpp_reader *, int, int, rich_location *,
-			 const char *, va_list *)
+extern bool c_cpp_diagnostic (cpp_reader *, enum cpp_diagnostic_level,
+			      enum cpp_warning_reason, rich_location *,
+			      const char *, va_list *)
      ATTRIBUTE_GCC_DIAG(5,0);
 extern int c_common_has_attribute (cpp_reader *);
 
diff --git a/gcc/c-family/c-opts.c b/gcc/c-family/c-opts.c
index ec05771..10cb53b 100644
--- a/gcc/c-family/c-opts.c
+++ b/gcc/c-family/c-opts.c
@@ -224,7 +224,7 @@  c_common_init_options (unsigned int decoded_options_count,
   parse_in = cpp_create_reader (c_dialect_cxx () ? CLK_GNUCXX: CLK_GNUC89,
 				ident_hash, line_table);
   cb = cpp_get_callbacks (parse_in);
-  cb->error = c_cpp_error;
+  cb->diagnostic = c_cpp_diagnostic;
 
   cpp_opts = cpp_get_options (parse_in);
   cpp_opts->dollars_in_ident = DOLLARS_IN_IDENTIFIERS;
diff --git a/gcc/fortran/cpp.c b/gcc/fortran/cpp.c
index 0b3de42..3091eeb 100644
--- a/gcc/fortran/cpp.c
+++ b/gcc/fortran/cpp.c
@@ -142,8 +142,9 @@  static void cb_include (cpp_reader *, source_location, const unsigned char *,
 static void cb_ident (cpp_reader *, source_location, const cpp_string *);
 static void cb_used_define (cpp_reader *, source_location, cpp_hashnode *);
 static void cb_used_undef (cpp_reader *, source_location, cpp_hashnode *);
-static bool cb_cpp_error (cpp_reader *, int, int, rich_location *,
-			  const char *, va_list *)
+static bool cb_cpp_diagnostic (cpp_reader *, enum cpp_diagnostic_level,
+			       enum cpp_warning_reason, rich_location *,
+			       const char *, va_list *)
      ATTRIBUTE_GCC_DIAG(5,0);
 void pp_dir_change (cpp_reader *, const char *);
 
@@ -504,7 +505,7 @@  gfc_cpp_init_0 (void)
   cb->line_change = cb_line_change;
   cb->ident = cb_ident;
   cb->def_pragma = cb_def_pragma;
-  cb->error = cb_cpp_error;
+  cb->diagnostic = cb_cpp_diagnostic;
 
   if (gfc_cpp_option.dump_includes)
     cb->include = cb_include;
@@ -1020,9 +1021,11 @@  cb_used_define (cpp_reader *pfile, source_location line ATTRIBUTE_UNUSED,
    Returns true if a diagnostic was emitted, false otherwise.  */
 
 static bool
-cb_cpp_error (cpp_reader *pfile ATTRIBUTE_UNUSED, int level, int reason,
-	      rich_location *richloc,
-	      const char *msg, va_list *ap)
+cb_cpp_diagnostic (cpp_reader *pfile ATTRIBUTE_UNUSED,
+		   enum cpp_diagnostic_level level,
+		   enum cpp_warning_reason reason,
+		   rich_location *richloc,
+		   const char *msg, va_list *ap)
 {
   diagnostic_info diagnostic;
   diagnostic_t dlevel;
diff --git a/gcc/genmatch.c b/gcc/genmatch.c
index 5f1691a..62a876d 100644
--- a/gcc/genmatch.c
+++ b/gcc/genmatch.c
@@ -73,8 +73,9 @@  static bool
 #if GCC_VERSION >= 4001
 __attribute__((format (printf, 5, 0)))
 #endif
-error_cb (cpp_reader *, int errtype, int, rich_location *richloc,
-	  const char *msg, va_list *ap)
+diagnostic_cb (cpp_reader *, enum cpp_diagnostic_level errtype,
+	       enum cpp_warning_reason, rich_location *richloc,
+	       const char *msg, va_list *ap)
 {
   const line_map_ordinary *map;
   source_location location = richloc->get_loc ();
@@ -122,7 +123,7 @@  fatal_at (const cpp_token *tk, const char *msg, ...)
   rich_location richloc (line_table, tk->src_loc);
   va_list ap;
   va_start (ap, msg);
-  error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap);
+  diagnostic_cb (NULL, CPP_DL_FATAL, CPP_W_NONE, &richloc, msg, &ap);
   va_end (ap);
 }
 
@@ -135,7 +136,7 @@  fatal_at (source_location loc, const char *msg, ...)
   rich_location richloc (line_table, loc);
   va_list ap;
   va_start (ap, msg);
-  error_cb (NULL, CPP_DL_FATAL, 0, &richloc, msg, &ap);
+  diagnostic_cb (NULL, CPP_DL_FATAL, CPP_W_NONE, &richloc, msg, &ap);
   va_end (ap);
 }
 
@@ -148,7 +149,7 @@  warning_at (const cpp_token *tk, const char *msg, ...)
   rich_location richloc (line_table, tk->src_loc);
   va_list ap;
   va_start (ap, msg);
-  error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap);
+  diagnostic_cb (NULL, CPP_DL_WARNING, CPP_W_NONE, &richloc, msg, &ap);
   va_end (ap);
 }
 
@@ -161,7 +162,7 @@  warning_at (source_location loc, const char *msg, ...)
   rich_location richloc (line_table, loc);
   va_list ap;
   va_start (ap, msg);
-  error_cb (NULL, CPP_DL_WARNING, 0, &richloc, msg, &ap);
+  diagnostic_cb (NULL, CPP_DL_WARNING, CPP_W_NONE, &richloc, msg, &ap);
   va_end (ap);
 }
 
@@ -5071,7 +5072,7 @@  main (int argc, char **argv)
 
   r = cpp_create_reader (CLK_GNUC99, NULL, line_table);
   cpp_callbacks *cb = cpp_get_callbacks (r);
-  cb->error = error_cb;
+  cb->diagnostic = diagnostic_cb;
 
   /* Add the build directory to the #include "" search path.  */
   cpp_dir *dir = XCNEW (cpp_dir);
diff --git a/gcc/input.c b/gcc/input.c
index d65a82d..2f0a47e 100644
--- a/gcc/input.c
+++ b/gcc/input.c
@@ -2108,14 +2108,14 @@  class ebcdic_execution_charset : public lexer_test_options
     cpp_opts->narrow_charset = "IBM1047";
 
     cpp_callbacks *callbacks = cpp_get_callbacks (test.m_parser);
-    callbacks->error = on_error;
+    callbacks->diagnostic = on_diagnostic;
   }
 
-  static bool on_error (cpp_reader *pfile ATTRIBUTE_UNUSED,
-			int level ATTRIBUTE_UNUSED,
-			int reason ATTRIBUTE_UNUSED,
-			rich_location *richloc ATTRIBUTE_UNUSED,
-			const char *msgid, va_list *ap ATTRIBUTE_UNUSED)
+  static bool on_diagnostic (cpp_reader *pfile ATTRIBUTE_UNUSED,
+			     enum cpp_diagnostic_level level ATTRIBUTE_UNUSED,
+			     enum cpp_warning_reason reason ATTRIBUTE_UNUSED,
+			     rich_location *richloc ATTRIBUTE_UNUSED,
+			     const char *msgid, va_list *ap ATTRIBUTE_UNUSED)
     ATTRIBUTE_FPTR_PRINTF(5,0)
   {
     gcc_assert (s_singleton);
@@ -2145,53 +2145,53 @@  class ebcdic_execution_charset : public lexer_test_options
 
 ebcdic_execution_charset *ebcdic_execution_charset::s_singleton;
 
-/* A lexer_test_options subclass that records a list of error
+/* A lexer_test_options subclass that records a list of diagnostic
    messages emitted by the lexer.  */
 
-class lexer_error_sink : public lexer_test_options
+class lexer_diagnostic_sink : public lexer_test_options
 {
  public:
-  lexer_error_sink ()
+  lexer_diagnostic_sink ()
   {
     gcc_assert (s_singleton == NULL);
     s_singleton = this;
   }
-  ~lexer_error_sink ()
+  ~lexer_diagnostic_sink ()
   {
     gcc_assert (s_singleton == this);
     s_singleton = NULL;
 
     int i;
     char *str;
-    FOR_EACH_VEC_ELT (m_errors, i, str)
+    FOR_EACH_VEC_ELT (m_diagnostics, i, str)
       free (str);
   }
 
   void apply (lexer_test &test) FINAL OVERRIDE
   {
     cpp_callbacks *callbacks = cpp_get_callbacks (test.m_parser);
-    callbacks->error = on_error;
+    callbacks->diagnostic = on_diagnostic;
   }
 
-  static bool on_error (cpp_reader *pfile ATTRIBUTE_UNUSED,
-			int level ATTRIBUTE_UNUSED,
-			int reason ATTRIBUTE_UNUSED,
-			rich_location *richloc ATTRIBUTE_UNUSED,
-			const char *msgid, va_list *ap)
+  static bool on_diagnostic (cpp_reader *pfile ATTRIBUTE_UNUSED,
+			     enum cpp_diagnostic_level level ATTRIBUTE_UNUSED,
+			     enum cpp_warning_reason reason ATTRIBUTE_UNUSED,
+			     rich_location *richloc ATTRIBUTE_UNUSED,
+			     const char *msgid, va_list *ap)
     ATTRIBUTE_FPTR_PRINTF(5,0)
   {
     char *msg = xvasprintf (msgid, *ap);
-    s_singleton->m_errors.safe_push (msg);
+    s_singleton->m_diagnostics.safe_push (msg);
     return true;
   }
 
-  auto_vec<char *> m_errors;
+  auto_vec<char *> m_diagnostics;
 
  private:
-  static lexer_error_sink *s_singleton;
+  static lexer_diagnostic_sink *s_singleton;
 };
 
-lexer_error_sink *lexer_error_sink::s_singleton;
+lexer_diagnostic_sink *lexer_diagnostic_sink::s_singleton;
 
 /* Constructor.  Override line_table with a new instance based on CASE_,
    and write CONTENT to a tempfile.  Create a cpp_reader, and use it to
@@ -3405,21 +3405,21 @@  test_lexer_string_locations_raw_string_unterminated (const line_table_case &case
 {
   const char *content = "R\"ouch()ouCh\" /* etc */";
 
-  lexer_error_sink errors;
-  lexer_test test (case_, content, &errors);
+  lexer_diagnostic_sink diagnostics;
+  lexer_test test (case_, content, &diagnostics);
   test.m_implicitly_expect_EOF = false;
 
   /* Attempt to parse the raw string.  */
   const cpp_token *tok = test.get_token ();
   ASSERT_EQ (tok->type, CPP_EOF);
 
-  ASSERT_EQ (1, errors.m_errors.length ());
+  ASSERT_EQ (1, diagnostics.m_diagnostics.length ());
   /* We expect the message "unterminated raw string"
      in the "cpplib" translation domain.
      It's not clear that dgettext is available on all supported hosts,
      so this assertion is commented-out for now.
        ASSERT_STREQ (dgettext ("cpplib", "unterminated raw string"),
-                     errors.m_errors[0]);
+                     diagnostics.m_diagnostics[0]);
   */
 }
 
diff --git a/gcc/opth-gen.awk b/gcc/opth-gen.awk
index c2390de..de2d29f 100644
--- a/gcc/opth-gen.awk
+++ b/gcc/opth-gen.awk
@@ -503,8 +503,10 @@  print "/* Mapping from cpp message reasons to the options that enable them.  */"
 print "#include <cpplib.h>"
 print "struct cpp_reason_option_codes_t"
 print "{"
-print "  const int reason;		/* cpplib message reason.  */"
-print "  const int option_code;	/* gcc option that controls this message.  */"
+print "  /* cpplib message reason.  */"
+print "  const enum cpp_warning_reason reason;"
+print "  /* gcc option that controls this message.  */"
+print "  const int option_code;"
 print "};"
 print ""
 print "static const struct cpp_reason_option_codes_t cpp_reason_option_codes[] = {"
diff --git a/libcpp/charset.c b/libcpp/charset.c
index c6dce0d..36c57a6 100644
--- a/libcpp/charset.c
+++ b/libcpp/charset.c
@@ -1693,13 +1693,14 @@  cpp_interpret_string (cpp_reader *pfile, const cpp_string *from, size_t count,
   return cpp_interpret_string_1 (pfile, from, count, to, type, NULL, NULL);
 }
 
-/* A "do nothing" error-handling callback for use by
+/* A "do nothing" diagnostic-handling callback for use by
    cpp_interpret_string_ranges, so that it can temporarily suppress
-   error-handling.  */
+   diagnostic-handling.  */
 
 static bool
-noop_error_cb (cpp_reader *, int, int, rich_location *,
-	       const char *, va_list *)
+noop_diagnostic_cb (cpp_reader *, enum cpp_diagnostic_level,
+		    enum cpp_warning_reason, rich_location *,
+		    const char *, va_list *)
 {
   /* no-op.  */
   return true;
@@ -1737,25 +1738,26 @@  cpp_interpret_string_ranges (cpp_reader *pfile, const cpp_string *from,
     return "execution character set != source character set";
 
   /* For on-demand strings we have already lexed the strings, so there
-     should be no errors.  However, if we have bogus source location
+     should be no diagnostics.  However, if we have bogus source location
      data (or stringified macro arguments), the attempt to lex the
-     strings could fail with an error.  Temporarily install an
-     error-handler to catch the error, so that it can lead to this call
+     strings could fail with an diagnostic.  Temporarily install an
+     diagnostic-handler to catch the diagnostic, so that it can lead to this call
      failing, rather than being emitted as a user-visible diagnostic.
-     If an error does occur, we should see it via the return value of
+     If an diagnostic does occur, we should see it via the return value of
      cpp_interpret_string_1.  */
-  bool (*saved_error_handler) (cpp_reader *, int, int, rich_location *,
-			       const char *, va_list *)
+  bool (*saved_diagnostic_handler) (cpp_reader *, enum cpp_diagnostic_level,
+				    enum cpp_warning_reason, rich_location *,
+				    const char *, va_list *)
     ATTRIBUTE_FPTR_PRINTF(5,0);
 
-  saved_error_handler = pfile->cb.error;
-  pfile->cb.error = noop_error_cb;
+  saved_diagnostic_handler = pfile->cb.diagnostic;
+  pfile->cb.diagnostic = noop_diagnostic_cb;
 
   bool result = cpp_interpret_string_1 (pfile, from, count, NULL, type,
 					loc_readers, out);
 
-  /* Restore the saved error-handler.  */
-  pfile->cb.error = saved_error_handler;
+  /* Restore the saved diagnostic-handler.  */
+  pfile->cb.diagnostic = saved_diagnostic_handler;
 
   if (!result)
     return "cpp_interpret_string_1 failed";
diff --git a/libcpp/directives.c b/libcpp/directives.c
index f7c460d..9793e6b 100644
--- a/libcpp/directives.c
+++ b/libcpp/directives.c
@@ -102,7 +102,8 @@  static const char *parse_include (cpp_reader *, int *, const cpp_token ***,
 static void push_conditional (cpp_reader *, int, int, const cpp_hashnode *);
 static unsigned int read_flag (cpp_reader *, unsigned int);
 static bool strtolinenum (const uchar *, size_t, linenum_type *, bool *);
-static void do_diagnostic (cpp_reader *, int, int, int);
+static void do_diagnostic (cpp_reader *, enum cpp_diagnostic_level code,
+			   enum cpp_warning_reason reason, int);
 static cpp_hashnode *lex_macro_node (cpp_reader *, bool);
 static int undefine_macros (cpp_reader *, cpp_hashnode *, void *);
 static void do_include_common (cpp_reader *, enum include_type);
@@ -227,7 +228,7 @@  skip_rest_of_line (cpp_reader *pfile)
 /* Helper function for check_oel.  */
 
 static void
-check_eol_1 (cpp_reader *pfile, bool expand, int reason)
+check_eol_1 (cpp_reader *pfile, bool expand, enum cpp_warning_reason reason)
 {
   if (! SEEN_EOL () && (expand
 			? cpp_get_token (pfile)
@@ -1140,7 +1141,8 @@  _cpp_do_file_change (cpp_reader *pfile, enum lc_reason reason,
 /* Report a warning or error detected by the program we are
    processing.  Use the directive's tokens in the error message.  */
 static void
-do_diagnostic (cpp_reader *pfile, int code, int reason, int print_dir)
+do_diagnostic (cpp_reader *pfile, enum cpp_diagnostic_level code,
+	       enum cpp_warning_reason reason, int print_dir)
 {
   const unsigned char *dir_name;
   unsigned char *line;
@@ -1166,7 +1168,7 @@  do_diagnostic (cpp_reader *pfile, int code, int reason, int print_dir)
 static void
 do_error (cpp_reader *pfile)
 {
-  do_diagnostic (pfile, CPP_DL_ERROR, 0, 1);
+  do_diagnostic (pfile, CPP_DL_ERROR, CPP_W_NONE, 1);
 }
 
 static void
@@ -1720,7 +1722,7 @@  do_pragma_dependency (cpp_reader *pfile)
       if (cpp_get_token (pfile)->type != CPP_EOF)
 	{
 	  _cpp_backup_tokens (pfile, 1);
-	  do_diagnostic (pfile, CPP_DL_WARNING, 0, 0);
+	  do_diagnostic (pfile, CPP_DL_WARNING, CPP_W_NONE, 0);
 	}
     }
 
diff --git a/libcpp/errors.c b/libcpp/errors.c
index a68ae98..2268fc4 100644
--- a/libcpp/errors.c
+++ b/libcpp/errors.c
@@ -31,15 +31,15 @@  along with this program; see the file COPYING3.  If not see
 
 ATTRIBUTE_FPTR_PRINTF(5,0)
 static bool
-cpp_diagnostic_at (cpp_reader * pfile, int level, int reason,
-		   rich_location *richloc,
+cpp_diagnostic_at (cpp_reader * pfile, enum cpp_diagnostic_level level,
+		   enum cpp_warning_reason reason, rich_location *richloc,
 		   const char *msgid, va_list *ap)
 {
   bool ret;
 
-  if (!pfile->cb.error)
+  if (!pfile->cb.diagnostic)
     abort ();
-  ret = pfile->cb.error (pfile, level, reason, richloc, _(msgid), ap);
+  ret = pfile->cb.diagnostic (pfile, level, reason, richloc, _(msgid), ap);
 
   return ret;
 }
@@ -48,8 +48,9 @@  cpp_diagnostic_at (cpp_reader * pfile, int level, int reason,
 
 ATTRIBUTE_FPTR_PRINTF(4,0)
 static bool
-cpp_diagnostic (cpp_reader * pfile, int level, int reason,
-                const char *msgid, va_list *ap)
+cpp_diagnostic (cpp_reader * pfile, enum cpp_diagnostic_level level,
+		enum cpp_warning_reason reason,
+		const char *msgid, va_list *ap)
 {
   source_location src_loc;
 
@@ -77,7 +78,8 @@  cpp_diagnostic (cpp_reader * pfile, int level, int reason,
 /* Print a warning or error, depending on the value of LEVEL.  */
 
 bool
-cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
+cpp_error (cpp_reader * pfile, enum cpp_diagnostic_level level,
+	   const char *msgid, ...)
 {
   va_list ap;
   bool ret;
@@ -93,7 +95,8 @@  cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
 /* Print a warning.  The warning reason may be given in REASON.  */
 
 bool
-cpp_warning (cpp_reader * pfile, int reason, const char *msgid, ...)
+cpp_warning (cpp_reader * pfile, enum cpp_warning_reason reason,
+	     const char *msgid, ...)
 {
   va_list ap;
   bool ret;
@@ -109,7 +112,8 @@  cpp_warning (cpp_reader * pfile, int reason, const char *msgid, ...)
 /* Print a pedantic warning.  The warning reason may be given in REASON.  */
 
 bool
-cpp_pedwarning (cpp_reader * pfile, int reason, const char *msgid, ...)
+cpp_pedwarning (cpp_reader * pfile, enum cpp_warning_reason reason,
+		const char *msgid, ...)
 {
   va_list ap;
   bool ret;
@@ -126,7 +130,8 @@  cpp_pedwarning (cpp_reader * pfile, int reason, const char *msgid, ...)
    given in REASON.  */
 
 bool
-cpp_warning_syshdr (cpp_reader * pfile, int reason, const char *msgid, ...)
+cpp_warning_syshdr (cpp_reader * pfile, enum cpp_warning_reason reason,
+		    const char *msgid, ...)
 {
   va_list ap;
   bool ret;
@@ -143,18 +148,19 @@  cpp_warning_syshdr (cpp_reader * pfile, int reason, const char *msgid, ...)
 
 ATTRIBUTE_FPTR_PRINTF(6,0)
 static bool
-cpp_diagnostic_with_line (cpp_reader * pfile, int level, int reason,
-		          source_location src_loc, unsigned int column,
-		          const char *msgid, va_list *ap)
+cpp_diagnostic_with_line (cpp_reader * pfile, enum cpp_diagnostic_level level,
+			  enum cpp_warning_reason reason,
+			  source_location src_loc, unsigned int column,
+			  const char *msgid, va_list *ap)
 {
   bool ret;
   
-  if (!pfile->cb.error)
+  if (!pfile->cb.diagnostic)
     abort ();
   rich_location richloc (pfile->line_table, src_loc);
   if (column)
     richloc.override_column (column);
-  ret = pfile->cb.error (pfile, level, reason, &richloc, _(msgid), ap);
+  ret = pfile->cb.diagnostic (pfile, level, reason, &richloc, _(msgid), ap);
 
   return ret;
 }
@@ -162,7 +168,7 @@  cpp_diagnostic_with_line (cpp_reader * pfile, int level, int reason,
 /* Print a warning or error, depending on the value of LEVEL.  */
 
 bool
-cpp_error_with_line (cpp_reader *pfile, int level,
+cpp_error_with_line (cpp_reader *pfile, enum cpp_diagnostic_level level,
 		     source_location src_loc, unsigned int column,
 		     const char *msgid, ...)
 {
@@ -181,7 +187,7 @@  cpp_error_with_line (cpp_reader *pfile, int level,
 /* Print a warning.  The warning reason may be given in REASON.  */
 
 bool
-cpp_warning_with_line (cpp_reader *pfile, int reason,
+cpp_warning_with_line (cpp_reader *pfile, enum cpp_warning_reason reason,
 		       source_location src_loc, unsigned int column,
 		       const char *msgid, ...)
 {
@@ -200,9 +206,9 @@  cpp_warning_with_line (cpp_reader *pfile, int reason,
 /* Print a pedantic warning.  The warning reason may be given in REASON.  */
 
 bool
-cpp_pedwarning_with_line (cpp_reader *pfile, int reason,
-		          source_location src_loc, unsigned int column,
-		          const char *msgid, ...)
+cpp_pedwarning_with_line (cpp_reader *pfile, enum cpp_warning_reason reason,
+			  source_location src_loc, unsigned int column,
+			  const char *msgid, ...)
 {
   va_list ap;
   bool ret;
@@ -220,9 +226,9 @@  cpp_pedwarning_with_line (cpp_reader *pfile, int reason,
    given in REASON.  */
 
 bool
-cpp_warning_with_line_syshdr (cpp_reader *pfile, int reason,
-		              source_location src_loc, unsigned int column,
-		              const char *msgid, ...)
+cpp_warning_with_line_syshdr (cpp_reader *pfile, enum cpp_warning_reason reason,
+			      source_location src_loc, unsigned int column,
+			      const char *msgid, ...)
 {
   va_list ap;
   bool ret;
@@ -240,8 +246,8 @@  cpp_warning_with_line_syshdr (cpp_reader *pfile, int reason,
    a column override.  */
 
 bool
-cpp_error_at (cpp_reader * pfile, int level, source_location src_loc,
-	      const char *msgid, ...)
+cpp_error_at (cpp_reader * pfile, enum cpp_diagnostic_level level,
+	      source_location src_loc, const char *msgid, ...)
 {
   va_list ap;
   bool ret;
@@ -260,8 +266,8 @@  cpp_error_at (cpp_reader * pfile, int level, source_location src_loc,
    a column override.  */
 
 bool
-cpp_error_at (cpp_reader * pfile, int level, rich_location *richloc,
-	      const char *msgid, ...)
+cpp_error_at (cpp_reader * pfile, enum cpp_diagnostic_level level,
+	      rich_location *richloc, const char *msgid, ...)
 {
   va_list ap;
   bool ret;
@@ -279,7 +285,8 @@  cpp_error_at (cpp_reader * pfile, int level, rich_location *richloc,
    information from errno.  */
 
 bool
-cpp_errno (cpp_reader *pfile, int level, const char *msgid)
+cpp_errno (cpp_reader *pfile, enum cpp_diagnostic_level level,
+	   const char *msgid)
 {
   return cpp_error (pfile, level, "%s: %s", _(msgid), xstrerror (errno));
 }
@@ -289,7 +296,8 @@  cpp_errno (cpp_reader *pfile, int level, const char *msgid)
    that is not localized, but "" is replaced with localized "stdout".  */
 
 bool
-cpp_errno_filename (cpp_reader *pfile, int level, const char *filename,
+cpp_errno_filename (cpp_reader *pfile, enum cpp_diagnostic_level level,
+		    const char *filename,
 		    source_location loc)
 {
   if (filename[0] == '\0')
diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h
index 85aa09f..797cfb9 100644
--- a/libcpp/include/cpplib.h
+++ b/libcpp/include/cpplib.h
@@ -549,6 +549,59 @@  struct cpp_options
   bool canonical_system_headers;
 };
 
+/* Diagnostic levels.  To get a diagnostic without associating a
+   position in the translation unit with it, use cpp_error_with_line
+   with a line number of zero.  */
+
+enum cpp_diagnostic_level {
+  /* Warning, an error with -Werror.  */
+  CPP_DL_WARNING = 0,
+  /* Same as CPP_DL_WARNING, except it is not suppressed in system headers.  */
+  CPP_DL_WARNING_SYSHDR,
+  /* Warning, an error with -pedantic-errors or -Werror.  */
+  CPP_DL_PEDWARN,
+  /* An error.  */
+  CPP_DL_ERROR,
+  /* An internal consistency check failed.  Prints "internal error: ",
+     otherwise the same as CPP_DL_ERROR.  */
+  CPP_DL_ICE,
+  /* An informative note following a warning.  */
+  CPP_DL_NOTE,
+  /* A fatal error.  */
+  CPP_DL_FATAL
+};
+
+/* Warning reason codes. Use a reason code of CPP_W_NONE for unclassified
+   warnings and diagnostics that are not warnings.  */
+
+enum cpp_warning_reason {
+  CPP_W_NONE = 0,
+  CPP_W_DEPRECATED,
+  CPP_W_COMMENTS,
+  CPP_W_MISSING_INCLUDE_DIRS,
+  CPP_W_TRIGRAPHS,
+  CPP_W_MULTICHAR,
+  CPP_W_TRADITIONAL,
+  CPP_W_LONG_LONG,
+  CPP_W_ENDIF_LABELS,
+  CPP_W_NUM_SIGN_CHANGE,
+  CPP_W_VARIADIC_MACROS,
+  CPP_W_BUILTIN_MACRO_REDEFINED,
+  CPP_W_DOLLARS,
+  CPP_W_UNDEF,
+  CPP_W_UNUSED_MACROS,
+  CPP_W_CXX_OPERATOR_NAMES,
+  CPP_W_NORMALIZE,
+  CPP_W_INVALID_PCH,
+  CPP_W_WARNING_DIRECTIVE,
+  CPP_W_LITERAL_SUFFIX,
+  CPP_W_DATE_TIME,
+  CPP_W_PEDANTIC,
+  CPP_W_C90_C99_COMPAT,
+  CPP_W_CXX11_COMPAT,
+  CPP_W_EXPANSION_TO_DEFINED
+};
+
 /* Callback for header lookup for HEADER, which is the name of a
    source file.  It is used as a method of last resort to find headers
    that are not otherwise found during the normal include processing.
@@ -586,8 +639,11 @@  struct cpp_callbacks
 
   /* Called to emit a diagnostic.  This callback receives the
      translated message.  */
-  bool (*error) (cpp_reader *, int, int, rich_location *,
-		 const char *, va_list *)
+  bool (*diagnostic) (cpp_reader *,
+		      enum cpp_diagnostic_level,
+		      enum cpp_warning_reason,
+		      rich_location *,
+		      const char *, va_list *)
        ATTRIBUTE_FPTR_PRINTF(5,0);
 
   /* Callbacks for when a macro is expanded, or tested (whether
@@ -1084,99 +1140,55 @@  extern cpp_num cpp_interpret_integer (cpp_reader *, const cpp_token *,
    others assumed clear, to fill out a cpp_num structure.  */
 cpp_num cpp_num_sign_extend (cpp_num, size_t);
 
-/* Diagnostic levels.  To get a diagnostic without associating a
-   position in the translation unit with it, use cpp_error_with_line
-   with a line number of zero.  */
-
-enum {
-  /* Warning, an error with -Werror.  */
-  CPP_DL_WARNING = 0,
-  /* Same as CPP_DL_WARNING, except it is not suppressed in system headers.  */
-  CPP_DL_WARNING_SYSHDR,
-  /* Warning, an error with -pedantic-errors or -Werror.  */
-  CPP_DL_PEDWARN,
-  /* An error.  */
-  CPP_DL_ERROR,
-  /* An internal consistency check failed.  Prints "internal error: ",
-     otherwise the same as CPP_DL_ERROR.  */
-  CPP_DL_ICE,
-  /* An informative note following a warning.  */
-  CPP_DL_NOTE,
-  /* A fatal error.  */
-  CPP_DL_FATAL
-};
-
-/* Warning reason codes. Use a reason code of zero for unclassified warnings
-   and errors that are not warnings.  */
-enum {
-  CPP_W_NONE = 0,
-  CPP_W_DEPRECATED,
-  CPP_W_COMMENTS,
-  CPP_W_MISSING_INCLUDE_DIRS,
-  CPP_W_TRIGRAPHS,
-  CPP_W_MULTICHAR,
-  CPP_W_TRADITIONAL,
-  CPP_W_LONG_LONG,
-  CPP_W_ENDIF_LABELS,
-  CPP_W_NUM_SIGN_CHANGE,
-  CPP_W_VARIADIC_MACROS,
-  CPP_W_BUILTIN_MACRO_REDEFINED,
-  CPP_W_DOLLARS,
-  CPP_W_UNDEF,
-  CPP_W_UNUSED_MACROS,
-  CPP_W_CXX_OPERATOR_NAMES,
-  CPP_W_NORMALIZE,
-  CPP_W_INVALID_PCH,
-  CPP_W_WARNING_DIRECTIVE,
-  CPP_W_LITERAL_SUFFIX,
-  CPP_W_DATE_TIME,
-  CPP_W_PEDANTIC,
-  CPP_W_C90_C99_COMPAT,
-  CPP_W_CXX11_COMPAT,
-  CPP_W_EXPANSION_TO_DEFINED
-};
-
 /* Output a diagnostic of some kind.  */
-extern bool cpp_error (cpp_reader *, int, const char *msgid, ...)
+extern bool cpp_error (cpp_reader *, enum cpp_diagnostic_level,
+		       const char *msgid, ...)
   ATTRIBUTE_PRINTF_3;
-extern bool cpp_warning (cpp_reader *, int, const char *msgid, ...)
+extern bool cpp_warning (cpp_reader *, enum cpp_warning_reason,
+			 const char *msgid, ...)
   ATTRIBUTE_PRINTF_3;
-extern bool cpp_pedwarning (cpp_reader *, int, const char *msgid, ...)
+extern bool cpp_pedwarning (cpp_reader *, enum cpp_warning_reason,
+			    const char *msgid, ...)
   ATTRIBUTE_PRINTF_3;
-extern bool cpp_warning_syshdr (cpp_reader *, int, const char *msgid, ...)
+extern bool cpp_warning_syshdr (cpp_reader *, enum cpp_warning_reason reason,
+				const char *msgid, ...)
   ATTRIBUTE_PRINTF_3;
 
 /* Output a diagnostic with "MSGID: " preceding the
    error string of errno.  No location is printed.  */
-extern bool cpp_errno (cpp_reader *, int, const char *msgid);
+extern bool cpp_errno (cpp_reader *, enum cpp_diagnostic_level,
+		       const char *msgid);
 /* Similarly, but with "FILENAME: " instead of "MSGID: ", where
    the filename is not localized.  */
-extern bool cpp_errno_filename (cpp_reader *, int, const char *filename,
-				source_location loc);
+extern bool cpp_errno_filename (cpp_reader *, enum cpp_diagnostic_level,
+				const char *filename, source_location loc);
 
 /* Same as cpp_error, except additionally specifies a position as a
    (translation unit) physical line and physical column.  If the line is
    zero, then no location is printed.  */
-extern bool cpp_error_with_line (cpp_reader *, int, source_location,
-                                 unsigned, const char *msgid, ...)
+extern bool cpp_error_with_line (cpp_reader *, enum cpp_diagnostic_level,
+				 source_location, unsigned,
+				 const char *msgid, ...)
   ATTRIBUTE_PRINTF_5;
-extern bool cpp_warning_with_line (cpp_reader *, int, source_location,
-                                   unsigned, const char *msgid, ...)
+extern bool cpp_warning_with_line (cpp_reader *, enum cpp_warning_reason,
+				   source_location, unsigned,
+				   const char *msgid, ...)
   ATTRIBUTE_PRINTF_5;
-extern bool cpp_pedwarning_with_line (cpp_reader *, int, source_location,
-                                      unsigned, const char *msgid, ...)
+extern bool cpp_pedwarning_with_line (cpp_reader *, enum cpp_warning_reason,
+				      source_location, unsigned,
+				      const char *msgid, ...)
   ATTRIBUTE_PRINTF_5;
-extern bool cpp_warning_with_line_syshdr (cpp_reader *, int, source_location,
-                                          unsigned, const char *msgid, ...)
+extern bool cpp_warning_with_line_syshdr (cpp_reader *, enum cpp_warning_reason,
+					  source_location, unsigned,
+					  const char *msgid, ...)
   ATTRIBUTE_PRINTF_5;
 
-extern bool cpp_error_at (cpp_reader * pfile, int level,
+extern bool cpp_error_at (cpp_reader * pfile, enum cpp_diagnostic_level,
 			  source_location src_loc, const char *msgid, ...)
   ATTRIBUTE_PRINTF_4;
 
-extern bool cpp_error_at (cpp_reader * pfile, int level,
-			  rich_location *richloc, const char *msgid,
-			  ...)
+extern bool cpp_error_at (cpp_reader * pfile, enum cpp_diagnostic_level,
+			  rich_location *richloc, const char *msgid, ...)
   ATTRIBUTE_PRINTF_4;
 
 /* In lex.c */
diff --git a/libcpp/macro.c b/libcpp/macro.c
index 5eafe61..aacaf8c 100644
--- a/libcpp/macro.c
+++ b/libcpp/macro.c
@@ -3301,7 +3301,7 @@  create_iso_definition (cpp_reader *pfile)
 		   : N_("ISO C99 requires whitespace after the macro name"));
       else
 	{
-	  int warntype = CPP_DL_WARNING;
+	  enum cpp_diagnostic_level warntype = CPP_DL_WARNING;
 	  switch (token->type)
 	    {
 	    case CPP_ATSIGN:
@@ -3516,7 +3516,7 @@  _cpp_create_definition (cpp_reader *pfile, cpp_hashnode *node)
 
       if (warn_of_redefinition (pfile, node, macro))
 	{
-          const int reason
+          const enum cpp_warning_reason reason
 	    = (cpp_builtin_macro_p (node) && !(node->flags & NODE_WARN))
 	    ? CPP_W_BUILTIN_MACRO_REDEFINED : CPP_W_NONE;