aboutsummaryrefslogtreecommitdiff
path: root/libcpp/errors.c
diff options
context:
space:
mode:
authorSimon Baldwin <simonb@google.com>2010-04-07 17:18:10 +0000
committerSimon Baldwin <simonb@google.com>2010-04-07 17:18:10 +0000
commit1204f5e25b705b1196a3dea1170be2552eb8f600 (patch)
tree579586014184f45d4119737d83f6440cab3847ac /libcpp/errors.c
parent811feffdbcac1d338b94e732cfe82bf3c684d2e3 (diff)
* diagnostic.h (diagnostic_override_option_index): New macro to
set a diagnostic's option_index. * c-tree.h (c_cpp_error): Add warning reason argument. * opts.c (_warning_as_error_callback): New. (register_warning_as_error_callback): Store callback for warnings enabled via enable_warning_as_error. (enable_warning_as_error): Call callback, minor code tidy. * opts.h (register_warning_as_error_callback): Declare. * c-opts.c (warning_as_error_callback): New, set cpp_opts flag in response to -Werror=. (c_common_init_options): Register warning_as_error_callback in opts.c. * common.opt: Add -Wno-cpp option. * c-common.c (struct reason_option_codes_t): Map cpp warning reason codes to gcc option indexes. * (c_option_controlling_cpp_error): New function, lookup the gcc option index for a cpp warning reason code. * (c_cpp_error): Add warning reason argument, call c_option_controlling_cpp_error for diagnostic_override_option_index. * doc/invoke.texi: Document -Wno-cpp. * cpp.c (cb_cpp_error): Add warning reason argument, set a value for diagnostic_override_option_index if CPP_W_WARNING_DIRECTIVE. * directives.c (do_diagnostic): Add warning reason argument, call appropriate error reporting function for code. (directive_diagnostics): Call specific warning functions with warning reason where appropriate. (do_error, do_warning, do_pragma_dependency): Add warning reason argument to do_diagnostic calls. * macro.c (_cpp_warn_if_unused_macro, enter_macro_context, _cpp_create_definition): Call specific warning functions with warning reason where appropriate. * Makefile.in: Add new diagnostic functions to gettext translations. * include/cpplib.h (struct cpp_callbacks): Add warning reason code to error callback. (CPP_DL_WARNING, CPP_DL_WARNING_SYSHDR, CPP_DL_PEDWARN, CPP_DL_ERROR, CPP_DL_ICE, CPP_DL_NOTE, CPP_DL_FATAL): Replace macros with enums. (CPP_W_NONE, 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): New enums for cpp warning reason codes. (cpp_warning, cpp_pedwarning, cpp_warning_syshdr, cpp_warning_with_line, cpp_pedwarning_with_line, cpp_warning_with_line_syshdr): New specific error reporting functions. * pch.c (cpp_valid_state): Call specific warning functions with warning reason where appropriate. * errors.c (cpp_diagnostic, cpp_diagnostic_with_line): New central diagnostic handlers. (cpp_warning, cpp_pedwarning, cpp_warning_syshdr, cpp_warning_with_line, cpp_pedwarning_with_line, cpp_warning_with_line_syshdr): New specific error reporting functions. * expr.c (cpp_classify_number, eval_token, num_unary_op): Call specific warning functions with warning reason where appropriate. * lex.c (_cpp_process_line_notes, _cpp_skip_block_comment, warn_about_normalization, lex_identifier_intern, lex_identifier, _cpp_lex_direct): Ditto. * charset.c (_cpp_valid_ucn, convert_hex, convert_escape, narrow_str_to_charconst): Ditto. * gcc.dg/cpp/warn-undef-2.c: New. * gcc.dg/cpp/warn-traditional-2.c: New. * gcc.dg/cpp/warn-comments-2.c: New. * gcc.dg/cpp/warning-directive-1.c: New. * gcc.dg/cpp/warn-long-long.c: New. * gcc.dg/cpp/warn-traditional.c: New. * gcc.dg/cpp/warn-variadic-2.c: New. * gcc.dg/cpp/warn-undef.c: New. * gcc.dg/cpp/warn-normalized-1.c: New. * gcc.dg/cpp/warning-directive-2.c: New. * gcc.dg/cpp/warn-long-long-2.c: New. * gcc.dg/cpp/warn-variadic.c: New. * gcc.dg/cpp/warn-normalized-2.c: New. * gcc.dg/cpp/warning-directive-3.c: New. * gcc.dg/cpp/warn-deprecated-2.c: New. * gcc.dg/cpp/warn-trigraphs-1.c: New. * gcc.dg/cpp/warn-multichar-2.c: New. * gcc.dg/cpp/warn-normalized-3.c: New. * gcc.dg/cpp/warning-directive-4.c: New. * gcc.dg/cpp/warn-unused-macros.c: New. * gcc.dg/cpp/warn-trigraphs-2.c: New. * gcc.dg/cpp/warn-cxx-compat-2.c: New. * gcc.dg/cpp/warn-cxx-compat.c: New. * gcc.dg/cpp/warn-redefined.c: New. * gcc.dg/cpp/warn-trigraphs-3.c: New. * gcc.dg/cpp/warn-unused-macros-2.c: New. * gcc.dg/cpp/warn-deprecated.c: New. * gcc.dg/cpp/warn-trigraphs-4.c: New. * gcc.dg/cpp/warn-redefined-2.c: New. * gcc.dg/cpp/warn-comments.c: New. * gcc.dg/cpp/warn-multichar.c: New. * g++.dg/cpp/warning-directive-1.C: New. * g++.dg/cpp/warning-directive-2.C: New. * g++.dg/cpp/warning-directive-3.C: New. * g++.dg/cpp/warning-directive-4.C: New. * gfortran.dg/warning-directive-1.F90: New. * gfortran.dg/warning-directive-3.F90: New. * gfortran.dg/warning-directive-2.F90: New. * gfortran.dg/warning-directive-4.F90: New. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@158079 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp/errors.c')
-rw-r--r--libcpp/errors.c166
1 files changed, 154 insertions, 12 deletions
diff --git a/libcpp/errors.c b/libcpp/errors.c
index bc852894993..b7783f54d31 100644
--- a/libcpp/errors.c
+++ b/libcpp/errors.c
@@ -28,16 +28,16 @@ along with this program; see the file COPYING3. If not see
#include "cpplib.h"
#include "internal.h"
-/* Print an error at the location of the previously lexed token. */
-bool
-cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
+/* Print a diagnostic at the location of the previously lexed token. */
+
+ATTRIBUTE_FPTR_PRINTF(4,0)
+static bool
+cpp_diagnostic (cpp_reader * pfile, int level, int reason,
+ const char *msgid, va_list *ap)
{
source_location src_loc;
- va_list ap;
bool ret;
- va_start (ap, msgid);
-
if (CPP_OPTION (pfile, traditional))
{
if (pfile->state.in_directive)
@@ -61,13 +61,95 @@ cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
if (!pfile->cb.error)
abort ();
- ret = pfile->cb.error (pfile, level, src_loc, 0, _(msgid), &ap);
+ ret = pfile->cb.error (pfile, level, reason, src_loc, 0, _(msgid), ap);
+
+ return ret;
+}
+
+/* Print a warning or error, depending on the value of LEVEL. */
+
+bool
+cpp_error (cpp_reader * pfile, int level, const char *msgid, ...)
+{
+ va_list ap;
+ bool ret;
+
+ va_start (ap, msgid);
+
+ ret = cpp_diagnostic (pfile, level, CPP_W_NONE, msgid, &ap);
va_end (ap);
return ret;
}
-/* Print an error at a specific location. */
+/* Print a warning. The warning reason may be given in REASON. */
+
+bool
+cpp_warning (cpp_reader * pfile, int reason, const char *msgid, ...)
+{
+ va_list ap;
+ bool ret;
+
+ va_start (ap, msgid);
+
+ ret = cpp_diagnostic (pfile, CPP_DL_WARNING, reason, msgid, &ap);
+
+ va_end (ap);
+ return ret;
+}
+
+/* Print a pedantic warning. The warning reason may be given in REASON. */
+
+bool
+cpp_pedwarning (cpp_reader * pfile, int reason, const char *msgid, ...)
+{
+ va_list ap;
+ bool ret;
+
+ va_start (ap, msgid);
+
+ ret = cpp_diagnostic (pfile, CPP_DL_PEDWARN, reason, msgid, &ap);
+
+ va_end (ap);
+ return ret;
+}
+
+/* Print a warning, including system headers. The warning reason may be
+ given in REASON. */
+
+bool
+cpp_warning_syshdr (cpp_reader * pfile, int reason, const char *msgid, ...)
+{
+ va_list ap;
+ bool ret;
+
+ va_start (ap, msgid);
+
+ ret = cpp_diagnostic (pfile, CPP_DL_WARNING_SYSHDR, reason, msgid, &ap);
+
+ va_end (ap);
+ return ret;
+}
+
+/* Print a diagnostic at a specific location. */
+
+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)
+{
+ bool ret;
+
+ if (!pfile->cb.error)
+ abort ();
+ ret = pfile->cb.error (pfile, level, reason, src_loc, column, _(msgid), ap);
+
+ return ret;
+}
+
+/* Print a warning or error, depending on the value of LEVEL. */
+
bool
cpp_error_with_line (cpp_reader *pfile, int level,
source_location src_loc, unsigned int column,
@@ -75,17 +157,77 @@ cpp_error_with_line (cpp_reader *pfile, int level,
{
va_list ap;
bool ret;
-
+
va_start (ap, msgid);
- if (!pfile->cb.error)
- abort ();
- ret = pfile->cb.error (pfile, level, src_loc, column, _(msgid), &ap);
+ ret = cpp_diagnostic_with_line (pfile, level, CPP_W_NONE, src_loc,
+ column, msgid, &ap);
+
+ va_end (ap);
+ return ret;
+}
+
+/* Print a warning. The warning reason may be given in REASON. */
+
+bool
+cpp_warning_with_line (cpp_reader *pfile, int reason,
+ source_location src_loc, unsigned int column,
+ const char *msgid, ...)
+{
+ va_list ap;
+ bool ret;
+
+ va_start (ap, msgid);
+
+ ret = cpp_diagnostic_with_line (pfile, CPP_DL_WARNING, reason, src_loc,
+ column, msgid, &ap);
+
+ va_end (ap);
+ return ret;
+}
+
+/* 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, ...)
+{
+ va_list ap;
+ bool ret;
+
+ va_start (ap, msgid);
+
+ ret = cpp_diagnostic_with_line (pfile, CPP_DL_PEDWARN, reason, src_loc,
+ column, msgid, &ap);
va_end (ap);
return ret;
}
+/* Print a warning, including system headers. The warning reason may be
+ given in REASON. */
+
+bool
+cpp_warning_with_line_syshdr (cpp_reader *pfile, int reason,
+ source_location src_loc, unsigned int column,
+ const char *msgid, ...)
+{
+ va_list ap;
+ bool ret;
+
+ va_start (ap, msgid);
+
+ ret = cpp_diagnostic_with_line (pfile, CPP_DL_WARNING_SYSHDR, reason, src_loc,
+ column, msgid, &ap);
+
+ va_end (ap);
+ return ret;
+}
+
+/* Print a warning or error, depending on the value of LEVEL. Include
+ information from errno. */
+
bool
cpp_errno (cpp_reader *pfile, int level, const char *msgid)
{