summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authormanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>2007-02-15 22:31:17 +0000
committermanu <manu@138bc75d-0d04-0410-961f-82ee72b054a4>2007-02-15 22:31:17 +0000
commit3ba510aa5b8a07f6fa5a2d163354b0ff5b5c7484 (patch)
tree73dcde30921d36f76037d1d0106b2271a8aa2058 /gcc
parent97e77d8efe0eb7595cc8b0bc8449543acb0b4045 (diff)
downloadgcc-3ba510aa5b8a07f6fa5a2d163354b0ff5b5c7484.tar.gz
2007-02-15 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog24
-rw-r--r--gcc/c-decl.c18
-rw-r--r--gcc/c-objc-common.c10
-rw-r--r--gcc/c-opts.c18
-rw-r--r--gcc/c.opt4
-rw-r--r--gcc/doc/invoke.texi14
-rw-r--r--gcc/opts.c57
-rw-r--r--gcc/opts.h2
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/gcc.dg/Werror-implicit-function-declaration.c7
-rw-r--r--gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-default.c7
-rw-r--r--gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89-pedantic.c7
-rw-r--r--gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c89.c7
-rw-r--r--gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99-pedantic.c7
-rw-r--r--gcc/testsuite/gcc.dg/Wimplicit-function-declaration-c99.c7
15 files changed, 136 insertions, 63 deletions
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 <manu@gcc.gnu.org>
+
+ 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 <ebotcazou@adacore.com>
* 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,5 +1,15 @@
2007-02-15 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
+ 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 <manu@gcc.gnu.org>
+
PR c++/28943
* g++.dg/warn/pr28943.C: New.
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" } */
+}