[PATCH][RFA] Enabling -W[no-]error=... for cpplib warnings

Ian Lance Taylor iant@google.com
Sun Nov 8 20:13:00 GMT 2009


Simon Baldwin <simonb@google.com> writes:

> gcc/ChangeLog:
> 2009-11-02  Simon Baldwin  <simonb@google.com>
>
> 	* 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-warning-directive 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-warning-directive.
>
> gcc/fortran/ChangeLog:
> 2009-11-02  Simon Baldwin  <simonb@google.com>
>
> 	* cpp.c (cb_cpp_error): Add warning reason argument, set a value
> 	for diagnostic_override_option_index if CPP_W_WARNING_DIRECTIVE.
>
> libcpp/ChangeLog:
> 2009-11-02  Simon Baldwin  <simonb@google.com>
>
> 	* 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, _cpp_lex_direct): Ditto.
> 	* charset.c (_cpp_valid_ucn, convert_hex, convert_escape,
> 	narrow_str_to_charconst): Ditto.
>
> gcc/testsuite/ChangeLog:
> 2009-11-02  Simon Baldwin  <simonb@google.com>
>
> 	* 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.



> +/* Override the option index to be used for reporting a
> +   diagnostic.  */
> +#define diagnostic_override_option_index(DI, OPTIDX) \
> +    (DI)->option_index = (OPTIDX)

Please put parentheses around the macro expansion.


> +/* Callback function, called when -Werror= enables a warning.  */
> +
> +static void (*warning_as_error_callback) (int) = NULL;
> +
> +/* Register a callback for enable_warning_as_error calls.  */
> +
> +void
> +register_warning_as_error_callback (void (*callback) (int))
> +{
> +  warning_as_error_callback = callback;
> +}

Since there can only be one callback, please add something along the
lines of
  gcc_assert (warning_as_error_callback == NULL || callback == NULL);


This is OK with those changes.

Thanks.

Ian



More information about the Gcc-patches mailing list