Bug 34695 - Preprocessor warning->error conversion from -Werror is silent
Summary: Preprocessor warning->error conversion from -Werror is silent
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: preprocessor (show other bugs)
Version: 4.2.2
: P3 normal
Target Milestone: 4.5.0
Assignee: Joseph S. Myers
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2008-01-06 22:14 UTC by Ed Catmur
Modified: 2021-09-24 00:18 UTC (History)
3 users (show)

See Also:
Host:
Target:
Build:
Known to work:
Known to fail:
Last reconfirmed: 2009-02-11 01:14:11


Attachments
gcc-cpp-Werror-message.patch (450 bytes, patch)
2008-01-06 22:35 UTC, Ed Catmur
Details | Diff
gcc-cpp-Werror-message-cpp-diagnostic.patch (1.71 KB, patch)
2008-01-20 08:56 UTC, Ed Catmur
Details | Diff
gcc-cpp-Werror-message.patch (2.49 KB, patch)
2008-01-20 22:20 UTC, Ed Catmur
Details | Diff
gcc-cpp-Werror-message.patch (2.33 KB, patch)
2008-01-20 22:28 UTC, Ed Catmur
Details | Diff
gcc-cpp-Werror-message.patch (2.41 KB, patch)
2008-01-22 00:55 UTC, Ed Catmur
Details | Diff
gcc-cpp-Werror-message.patch (2.43 KB, patch)
2008-01-22 00:58 UTC, Ed Catmur
Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Ed Catmur 2008-01-06 22:14:42 UTC
When -Werror is passed in, libcpp silently converts warnings to errors:
$ gcc foo.c -Wall -Werror
foo.c:3:1: error: "FOO" redefined
foo.c:2:1: error: this is the location of the previous definition

This is potentially confusing, and inconsistent with cc, which displays:
$ gcc foo.c -Wall -Werror
cc1: warnings being treated as errors
foo.c:1: warning: return type defaults to ‘int’
foo.c: In function ‘main’:
foo.c:1: warning: control reaches end of non-void function
Comment 1 Ed Catmur 2008-01-06 22:35:19 UTC
Created attachment 14892 [details]
gcc-cpp-Werror-message.patch

Proposed patch.
Comment 2 Tom Tromey 2008-01-07 20:08:47 UTC
I agree this is a bug.

I think this patch is insufficient.  For best results I think that
libcpp and diagnostic.c should agree on whether the "warnins being treated
as errors" message has been emitted.

One way to do this would be to finally switch libcpp to emit all errors
via diagnostic.c.  Though I suppose that, even if we do this, we may still
need something like this patch for other users of libcpp.
Comment 3 Ed Catmur 2008-01-20 08:56:42 UTC
Created attachment 14977 [details]
gcc-cpp-Werror-message-cpp-diagnostic.patch

Is this what you meant?  Not sure whether I've got the source_location stuff correct, but it seems to work.
Comment 4 Ed Catmur 2008-01-20 22:20:45 UTC
Created attachment 14980 [details]
gcc-cpp-Werror-message.patch

Also when preprocessing-only.
Comment 5 Ed Catmur 2008-01-20 22:28:53 UTC
Created attachment 14981 [details]
gcc-cpp-Werror-message.patch
Comment 6 Ed Catmur 2008-01-22 00:55:13 UTC
Created attachment 14993 [details]
gcc-cpp-Werror-message.patch

Try to handle system-header and inhibit conditions/flags correctly.
Comment 7 Ed Catmur 2008-01-22 00:58:28 UTC
Created attachment 14994 [details]
gcc-cpp-Werror-message.patch

de-obfuscate the pedwarn code path
Comment 8 Manuel López-Ibáñez 2008-01-22 05:52:28 UTC
(In reply to comment #7)
> Created an attachment (id=14994) [edit]
> gcc-cpp-Werror-message.patch
> 
> de-obfuscate the pedwarn code path
> 

Hi, Ed, not sure whether you know that for us to be able to accept your patch, you need a copyright assignment form with the FSF: http://gcc.gnu.org/contribute.html#legal
Comment 9 Joseph S. Myers 2009-02-11 01:14:11 UTC
This is fixed by my patch to make cpplib always use the diagnostic.c
infrastructure: http://gcc.gnu.org/ml/gcc-patches/2009-02/msg00491.html

(This change is the cause of the Wvariadic-1.c and Wvariadic-3.c testcase
changes in that patch.)

Thus, assigning the bug to myself.
Comment 10 Joseph S. Myers 2009-03-29 22:56:20 UTC
Subject: Bug 34695

Author: jsm28
Date: Sun Mar 29 22:56:07 2009
New Revision: 145263

URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=145263
Log:
	PR preprocessor/34695

gcc:
	* Makefile.in (c-opts.o): Depend on c-tree.h.
	* c-common.c: Move down include of diagnostic.h.
	(done_lexing, c_cpp_error): New.
	* c-common.h (done_lexing): Declare.
	* c-decl.c (c_write_global_declarations): Don't check cpp_errors
	(parse_in).
	* c-opts.c: Include c-tree.h.
	(c_common_init_options): Set preprocessor error callback.
	(c_common_handle_option): Do not set preprocessor
	inhibit_warnings, warnings_are_errors, warn_system_headers,
	pedantic_errors or inhibit_warnings flags.
	(c_common_post_options): Do not check cpp_errors (parse_in).
	(c_common_finish): Do not output dependencies if there were
	errors.  Do not check return value of cpp_finish.
	* c-ppoutput.c (pp_file_change): Set input_location.
	* c-tree.h (c_cpp_error): Declare.
	* diagnostic.c (diagnostic_set_info_translated): Also initialize
	override_column.
	(diagnostic_build_prefix): Check override_column.
	* diagnostic.h (diagnostic_info): Add override_column field.
	(diagnostic_override_column): Define.

gcc/cp:
	* cp-tree.h (cp_cpp_error): Remove.
	* error.c (cp_cpp_error): Remove.
	* parser.c (cp_lexer_new_main): Set done_lexing instead of
	client_diagnostic and error callback.

gcc/fortran:
	* cpp.c (cb_cpp_error): New.
	(gfc_cpp_post_options): Don't set cpp_option->inhibit_warnings.
	Don't check cpp_errors (cpp_in).
	(gfc_cpp_init_0): Set cb->error.

gcc/testsuite:
	* gcc.dg/builtin-redefine.c, gcc.dg/cpp/redef2.c,
	gcc.dg/cpp/redef3.c, gcc.dg/cpp/trad/redef2.c: Use dg-message
	instead of dg-warning for "previous definition" messages.
	* gcc.dg/cpp/Wvariadic-1.c, gcc.dg/cpp/Wvariadic-3.c: Expect
	"warnings being treated as errors" message.
	* gcc.dg/fltconst-1.c: Use -fshow-column.

libcpp:
	* makedepend.c: Remove.
	* Makefile.in (makedepend_OBJS, makedepend$(EXEEXT)): Remove.
	(all, clean, TAGS_SOURCES, include): Remove makedepend handling.
	* directives.c (cpp_errors): Remove.
	* errors.c (print_location, _cpp_begin_message, v_message):
	Remove.
	(cpp_error, cpp_error_with_line): Always use error callback.
	(cpp_error, cpp_error_with_line, cpp_errno): Return bool.
	* include/cpplib.h (cpp_options): Remove pedantic_errors,
	inhibit_warnings, warn_system_headers, inhibit_errors,
	warnings_are_errors, client_diagnostic.
	(cpp_callbacks): Add extra arguments to error callback; make it
	return bool.
	(cpp_finish): Return void.
	(cpp_destroy): Remove inaccurate comment about return value.
	(cpp_errors, CPP_DL_EXTRACT, CPP_DL_WARNING_P): Remove.
	(CPP_DL_NOTE): Define.
	* include/line-map.h (linemap_print_containing_files): Remove.
	* init.c (cpp_finish): Do not check for or return number of
	errors.
	* internal.h (cpp_reader): Remove errors field.
	* line-map.c (linemap_print_containing_files): Remove.
	* macro.c (_cpp_create_definition): Use CPP_DL_NOTE for message
	about previous definition.  Only emit it if previous diagnostic
	was emitted.

Removed:
    trunk/libcpp/makedepend.c
Modified:
    trunk/gcc/ChangeLog
    trunk/gcc/Makefile.in
    trunk/gcc/c-common.c
    trunk/gcc/c-common.h
    trunk/gcc/c-decl.c
    trunk/gcc/c-opts.c
    trunk/gcc/c-ppoutput.c
    trunk/gcc/c-tree.h
    trunk/gcc/cp/ChangeLog
    trunk/gcc/cp/cp-tree.h
    trunk/gcc/cp/error.c
    trunk/gcc/cp/parser.c
    trunk/gcc/diagnostic.c
    trunk/gcc/diagnostic.h
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/cpp.c
    trunk/gcc/testsuite/ChangeLog
    trunk/gcc/testsuite/gcc.dg/builtin-redefine.c
    trunk/gcc/testsuite/gcc.dg/cpp/Wvariadic-1.c
    trunk/gcc/testsuite/gcc.dg/cpp/Wvariadic-3.c
    trunk/gcc/testsuite/gcc.dg/cpp/redef2.c
    trunk/gcc/testsuite/gcc.dg/cpp/redef3.c
    trunk/gcc/testsuite/gcc.dg/cpp/trad/redef2.c
    trunk/gcc/testsuite/gcc.dg/fltconst-1.c
    trunk/libcpp/ChangeLog
    trunk/libcpp/Makefile.in
    trunk/libcpp/directives.c
    trunk/libcpp/errors.c
    trunk/libcpp/include/cpplib.h
    trunk/libcpp/include/line-map.h
    trunk/libcpp/init.c
    trunk/libcpp/internal.h
    trunk/libcpp/line-map.c
    trunk/libcpp/macro.c

Comment 11 Joseph S. Myers 2009-03-29 22:58:53 UTC
Fixed for 4.5.