From 3ba510aa5b8a07f6fa5a2d163354b0ff5b5c7484 Mon Sep 17 00:00:00 2001 From: manu Date: Thu, 15 Feb 2007 22:31:17 +0000 Subject: 2007-02-15 Manuel Lopez-Ibanez PR c/26494 * doc/invoke.texi (Warning Options): Remove -Werror-implicit-function-declaration. (Wimplicit-function-declaration): Update description. * opts.c (common_handle_option): Move handling of -Werror=* to... (enable_warning_as_error): ...here. * opts.h (enable_warning_as_error): Declare. * c-decl.c (implicit_decl_warning): Unless -Wno-implicit-function-declaration is given, emit a pedwarn if -std=c99 or emit a warning if -Wimplicit-function-declaration. * c.opt (Wimplicit-function-declaration): Replace mesg_implicit_function_declaration with warn_implicit_function_declaration. * c-opts.c (c_common_handle_option): -Werror-implicit-function-declaration is exactly equal as -Werror=implicit-function-declaration. (set_Wimplicit): Replace mesg_implicit_function_declaration with warn_implicit_function_declaration. (c_common_post_options): -Wimplict-function-declaration is enabled by default by -std=c99, otherwise is disabled by default. * c-objc-common.c (c_objc_common_init): Remove flawed logic. testsuite/ * gcc.dg/Wimplicit-function-declaration-c89.c: New. * gcc.dg/Wimplicit-function-declaration-c89-default.c: New. * gcc.dg/Wimplicit-function-declaration-c89-pedantic.c: New. * gcc.dg/Wimplicit-function-declaration-c99.c: New. * gcc.dg/Wimplicit-function-declaration-c99-pedantic.c: New. * gcc.dg/Werror-implicit-function-declaration.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@122017 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 24 +++++++++ gcc/c-decl.c | 18 +++---- gcc/c-objc-common.c | 10 ---- gcc/c-opts.c | 18 +++---- gcc/c.opt | 4 +- gcc/doc/invoke.texi | 14 +++--- gcc/opts.c | 57 ++++++++++++---------- gcc/opts.h | 2 + gcc/testsuite/ChangeLog | 10 ++++ .../gcc.dg/Werror-implicit-function-declaration.c | 7 +++ .../Wimplicit-function-declaration-c89-default.c | 7 +++ .../Wimplicit-function-declaration-c89-pedantic.c | 7 +++ .../gcc.dg/Wimplicit-function-declaration-c89.c | 7 +++ .../Wimplicit-function-declaration-c99-pedantic.c | 7 +++ .../gcc.dg/Wimplicit-function-declaration-c99.c | 7 +++ 15 files changed, 136 insertions(+), 63 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/Werror-implicit-function-declaration.c create mode 100644 gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-default.c create mode 100644 gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-pedantic.c create mode 100644 gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89.c create mode 100644 gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99-pedantic.c create mode 100644 gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99.c (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ea38dd90ea..70efcfe0116 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,27 @@ +2007-02-15 Manuel Lopez-Ibanez + + PR c/26494 + * doc/invoke.texi (Warning Options): Remove + -Werror-implicit-function-declaration. + (Wimplicit-function-declaration): Update description. + * opts.c (common_handle_option): Move handling of -Werror=* to... + (enable_warning_as_error): ...here. + * opts.h (enable_warning_as_error): Declare. + * c-decl.c (implicit_decl_warning): Unless + -Wno-implicit-function-declaration is given, emit a pedwarn if + -std=c99 or emit a warning if -Wimplicit-function-declaration. + * c.opt (Wimplicit-function-declaration): Replace + mesg_implicit_function_declaration with + warn_implicit_function_declaration. + * c-opts.c (c_common_handle_option): + -Werror-implicit-function-declaration is exactly equal as + -Werror=implicit-function-declaration. + (set_Wimplicit): Replace mesg_implicit_function_declaration with + warn_implicit_function_declaration. + (c_common_post_options): -Wimplict-function-declaration is enabled + by default by -std=c99, otherwise is disabled by default. + * c-objc-common.c (c_objc_common_init): Remove flawed logic. + 2007-02-15 Eric Botcazou * gimplify.c (gimplify_modify_expr): During gimplification, attach a diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 648c805828d..ed0bf9cb25d 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -2376,18 +2376,16 @@ pushdecl_top_level (tree x) static void implicit_decl_warning (tree id, tree olddecl) { - void (*diag) (const char *, ...) ATTRIBUTE_GCC_CDIAG(1,2); - switch (mesg_implicit_function_declaration) + if (warn_implicit_function_declaration) { - case 0: return; - case 1: diag = warning0; break; - case 2: diag = error; break; - default: gcc_unreachable (); + if (flag_isoc99) + pedwarn (G_("implicit declaration of function %qE"), id); + else + warning (OPT_Wimplicit_function_declaration, + G_("implicit declaration of function %qE"), id); + if (olddecl) + locate_old_decl (olddecl, inform); } - - diag (G_("implicit declaration of function %qE"), id); - if (olddecl) - locate_old_decl (olddecl, diag); } /* Generate an implicit declaration for identifier FUNCTIONID as a diff --git a/gcc/c-objc-common.c b/gcc/c-objc-common.c index d4ad1f89f26..7604bc284db 100644 --- a/gcc/c-objc-common.c +++ b/gcc/c-objc-common.c @@ -135,16 +135,6 @@ c_objc_common_init (void) want an enhanced ObjC implementation. */ diagnostic_format_decoder (global_dc) = &c_tree_printer; - /* If still unspecified, make it match -std=c99 - (allowing for -pedantic-errors). */ - if (mesg_implicit_function_declaration < 0) - { - if (flag_isoc99) - mesg_implicit_function_declaration = flag_pedantic_errors ? 2 : 1; - else - mesg_implicit_function_declaration = 0; - } - return true; } diff --git a/gcc/c-opts.c b/gcc/c-opts.c index 9ac433a4f3a..76ad8271d72 100644 --- a/gcc/c-opts.c +++ b/gcc/c-opts.c @@ -451,8 +451,10 @@ c_common_handle_option (size_t scode, const char *arg, int value) global_dc->warning_as_error_requested = value; break; - case OPT_Werror_implicit_function_declaration: - mesg_implicit_function_declaration = 2; + case OPT_Werror_implicit_function_declaration: + /* For backward compatibility, this is the same as + -Werror=implicit-function-declaration. */ + enable_warning_as_error ("implicit-function-declaration", value, CL_C | CL_ObjC); break; case OPT_Wformat: @@ -1079,6 +1081,10 @@ c_common_post_options (const char **pfilename) "-Wformat-security ignored without -Wformat"); } + /* -Wimplicit-function-declaration is enabled by default for C99. */ + if (warn_implicit_function_declaration == -1) + warn_implicit_function_declaration = flag_isoc99; + /* C99 requires special handling of complex multiplication and division; -ffast-math and -fcx-limited-range are handled in process_options. */ if (flag_isoc99) @@ -1570,13 +1576,7 @@ set_Wimplicit (int on) { warn_implicit = on; warn_implicit_int = on; - if (on) - { - if (mesg_implicit_function_declaration != 2) - mesg_implicit_function_declaration = 1; - } - else - mesg_implicit_function_declaration = 0; + warn_implicit_function_declaration = on; } /* Args to -d specify what to dump. Silently ignore diff --git a/gcc/c.opt b/gcc/c.opt index 624b10e9ede..512882bc64b 100644 --- a/gcc/c.opt +++ b/gcc/c.opt @@ -194,7 +194,7 @@ C ObjC C++ ObjC++ Werror-implicit-function-declaration C ObjC RejectNegative Warning -Make implicit function declarations an error +This switch is deprecated; use -Werror=implicit-function-declaration instead Wfloat-equal C ObjC C++ ObjC++ Var(warn_float_equal) Warning @@ -235,7 +235,7 @@ Wimplicit C ObjC C++ ObjC++ Warning Wimplicit-function-declaration -C ObjC Var(mesg_implicit_function_declaration) Init(-1) Warning +C ObjC Var(warn_implicit_function_declaration) Init(-1) Warning Warn about implicit function declarations Wimplicit-int diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 8e811936fef..3bc4d900184 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -229,7 +229,7 @@ Objective-C and Objective-C++ Dialects}. -Wconversion -Wcoverage-mismatch -Wno-deprecated-declarations @gol -Wdisabled-optimization -Wno-div-by-zero @gol -Wempty-body -Wno-endif-labels @gol --Werror -Werror-* -Werror-implicit-function-declaration @gol +-Werror -Werror=* @gol -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 @gol -Wno-format-extra-args -Wformat-nonliteral @gol -Wformat-security -Wformat-y2k @gol @@ -2626,13 +2626,13 @@ Warn when a declaration does not specify a type. This warning is enabled by @option{-Wall}. @item -Wimplicit-function-declaration -@itemx -Werror-implicit-function-declaration @opindex Wimplicit-function-declaration -@opindex Werror-implicit-function-declaration -Give a warning (or error) whenever a function is used before being -declared. The form @option{-Wno-error-implicit-function-declaration} -is not supported. -This warning is enabled by @option{-Wall} (as a warning, not an error). +@opindex Wno-implicit-function-declaration +Give a warning whenever a function is used before being declared. In +C99 mode (@option{-std=c99} or @option{-std=gnu99}), this warning is +enabled by default and it is made into an error by +@option{-pedantic-errors}. This warning is also enabled by +@option{-Wall}. @item -Wimplicit @opindex Wimplicit diff --git a/gcc/opts.c b/gcc/opts.c index 1361eb77922..c84bc2a3c35 100644 --- a/gcc/opts.c +++ b/gcc/opts.c @@ -1067,31 +1067,7 @@ common_handle_option (size_t scode, const char *arg, int value, break; case OPT_Werror_: - { - char *new_option; - int option_index; - - new_option = XNEWVEC (char, strlen (arg) + 2); - new_option[0] = 'W'; - strcpy (new_option+1, arg); - option_index = find_opt (new_option, lang_mask); - if (option_index == N_OPTS) - { - error ("-Werror-%s: No option -%s", arg, new_option); - } - else - { - int kind = value ? DK_ERROR : DK_WARNING; - diagnostic_classify_diagnostic (global_dc, option_index, kind); - - /* -Werror=foo implies -Wfoo. */ - if (cl_options[option_index].var_type == CLVC_BOOLEAN - && cl_options[option_index].flag_var - && kind == DK_ERROR) - *(int *) cl_options[option_index].flag_var = 1; - free (new_option); - } - } + enable_warning_as_error (arg, value, lang_mask); break; case OPT_Wextra: @@ -1607,3 +1583,34 @@ get_option_state (int option, struct cl_option_state *state) } return true; } + +/* Enable a warning option as an error. This is used by -Werror= and + also by legacy Werror-implicit-function-declaration. */ + +void +enable_warning_as_error (const char *arg, int value, unsigned int lang_mask) +{ + char *new_option; + int option_index; + + new_option = XNEWVEC (char, strlen (arg) + 2); + new_option[0] = 'W'; + strcpy (new_option + 1, arg); + option_index = find_opt (new_option, lang_mask); + if (option_index == N_OPTS) + { + error ("-Werror=%s: No option -%s", arg, new_option); + } + else + { + int kind = value ? DK_ERROR : DK_WARNING; + diagnostic_classify_diagnostic (global_dc, option_index, kind); + + /* -Werror=foo implies -Wfoo. */ + if (cl_options[option_index].var_type == CLVC_BOOLEAN + && cl_options[option_index].flag_var + && kind == DK_ERROR) + *(int *) cl_options[option_index].flag_var = 1; + } + free (new_option); +} diff --git a/gcc/opts.h b/gcc/opts.h index b60cb47a16f..485cc22e20e 100644 --- a/gcc/opts.h +++ b/gcc/opts.h @@ -104,4 +104,6 @@ extern void decode_options (unsigned int argc, const char **argv); extern int option_enabled (int opt_idx); extern bool get_option_state (int, struct cl_option_state *); +extern void enable_warning_as_error (const char *arg, int value, + unsigned int lang_mask); #endif diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b876518ecee..67076ea1c80 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,13 @@ +2007-02-15 Manuel Lopez-Ibanez + + PR c/26494 + * gcc.dg/Wimplicit-function-declaration-c89.c: New. + * gcc.dg/Wimplicit-function-declaration-c89-default.c: New. + * gcc.dg/Wimplicit-function-declaration-c89-pedantic.c: New. + * gcc.dg/Wimplicit-function-declaration-c99.c: New. + * gcc.dg/Wimplicit-function-declaration-c99-pedantic.c: New. + * gcc.dg/Werror-implicit-function-declaration.c: New. + 2007-02-15 Manuel Lopez-Ibanez PR c++/28943 diff --git a/gcc/testsuite/gcc.dg/Werror-implicit-function-declaration.c b/gcc/testsuite/gcc.dg/Werror-implicit-function-declaration.c new file mode 100644 index 00000000000..f8f0f81d408 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Werror-implicit-function-declaration.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c89 -Werror-implicit-function-declaration" } */ + +void f(void) +{ + puts("Hello"); /* { dg-error "error: implicit declaration of function" } */ +} diff --git a/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-default.c b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-default.c new file mode 100644 index 00000000000..c725ffaca46 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-default.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c89" } */ + +void f(void) +{ + puts("Hello"); /* { dg-bogus "warning: implicit declaration of function" } */ +} diff --git a/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-pedantic.c b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-pedantic.c new file mode 100644 index 00000000000..f476e6af187 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-pedantic.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c89 -pedantic-errors -Wimplicit-function-declaration" } */ + +void f(void) +{ + puts("Hello"); /* { dg-warning "warning: implicit declaration of function" } */ +} diff --git a/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89.c b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89.c new file mode 100644 index 00000000000..6f2916d0ab3 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c89 -Wimplicit-function-declaration" } */ + +void f(void) +{ + puts("Hello"); /* { dg-warning "warning: implicit declaration of function" } */ +} diff --git a/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99-pedantic.c b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99-pedantic.c new file mode 100644 index 00000000000..6ea5eeda3f1 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99-pedantic.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c99 -pedantic-errors -Wall" } */ + +void f(void) +{ + puts("Hello"); /* { dg-error "error: implicit declaration of function" } */ +} diff --git a/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99.c b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99.c new file mode 100644 index 00000000000..004fc5ac5af --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-std=c99" } */ + +void f(void) +{ + puts("Hello"); /* { dg-warning "warning: implicit declaration of function" } */ +} -- cgit v1.2.1