c-decl.c (mesg_implicit_function_declaration): Init to -1.
authorZack Weinberg <zack@wolery.cumb.org>
Mon, 31 Jul 2000 18:10:31 +0000 (18:10 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Mon, 31 Jul 2000 18:10:31 +0000 (18:10 +0000)
* c-decl.c (mesg_implicit_function_declaration): Init to -1.
(implicit_decl_warning): New function.
(implicitly_declare): Use it.
* c-typeck.c (build_external_ref): Use implicit_decl_warning
to complain about implicit decls of builtins.

* c-lang.c (lang_init): Set mesg_implicit_function_declaration
based on pedantic && flag_isoc99, if not already set.
* c-tree.h: Declare mesg_implicit_function_declaration.
Prototype implicit_decl_warning.

* gcc.dg/c99-impl-decl-1.c: No longer XFAIL.

From-SVN: r35385

gcc/ChangeLog
gcc/c-decl.c
gcc/c-lang.c
gcc/c-tree.h
gcc/c-typeck.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/c99-impl-decl-1.c

index 44caceb..846f61e 100644 (file)
@@ -1,3 +1,16 @@
+2000-07-31  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * c-decl.c (mesg_implicit_function_declaration): Init to -1.
+       (implicit_decl_warning): New function.
+       (implicitly_declare): Use it.
+       * c-typeck.c (build_external_ref): Use implicit_decl_warning
+       to complain about implicit decls of builtins.
+
+       * c-lang.c (lang_init): Set mesg_implicit_function_declaration
+       based on pedantic && flag_isoc99, if not already set.
+       * c-tree.h: Declare mesg_implicit_function_declaration.
+       Prototype implicit_decl_warning.
+
 2000-07-30  Jeffrey D. Oldham  <oldham@codesourcery.com>
 
        * Makefile.in (ssa.o): Updated header files in dependences.
index 34a8f42..a9eb619 100644 (file)
@@ -358,7 +358,7 @@ int warn_long_long = 1;
 /* Nonzero means message about use of implicit function declarations;
  1 means warning; 2 means error. */
 
-int mesg_implicit_function_declaration;
+int mesg_implicit_function_declaration = -1;
 
 /* Nonzero means give string constants the type `const char *'
    to get extra warnings from them.  These warnings will be too numerous
@@ -2525,15 +2525,8 @@ implicitly_declare (functionid)
 
   rest_of_decl_compilation (decl, NULL_PTR, 0, 0);
 
-  if (mesg_implicit_function_declaration && implicit_warning)
-    {
-      if (mesg_implicit_function_declaration == 2)
-        error ("implicit declaration of function `%s'",
-                 IDENTIFIER_POINTER (functionid));
-      else
-        warning ("implicit declaration of function `%s'",
-                 IDENTIFIER_POINTER (functionid));
-    }
+  if (implicit_warning)
+    implicit_decl_warning (functionid);
   else if (warn_traditional && traditional_warning)
     warning ("function `%s' was previously declared within a block",
             IDENTIFIER_POINTER (functionid));
@@ -2546,6 +2539,17 @@ implicitly_declare (functionid)
   return decl;
 }
 
+void
+implicit_decl_warning (id)
+     tree id;
+{
+  char *name = IDENTIFIER_POINTER (id);
+  if (mesg_implicit_function_declaration == 2)
+    error ("implicit declaration of function `%s'", name);
+  else if (mesg_implicit_function_declaration == 1)
+    warning ("implicit declaration of function `%s'", name);
+}
+
 /* Return zero if the declaration NEWDECL is valid
    when the declaration OLDDECL (assumed to be for the same name)
    has already been seen.
index 620ed78..a34f306 100644 (file)
@@ -69,6 +69,15 @@ lang_init ()
   if (flag_bounds_check < 0)
     flag_bounds_check = flag_bounded_pointers;
 
+  /* If still unspecified, make it match pedantic && -std=c99.  */
+  if (mesg_implicit_function_declaration < 0)
+    {
+      if (pedantic && flag_isoc99)
+       mesg_implicit_function_declaration = flag_pedantic_errors ? 2 : 1;
+      else
+       mesg_implicit_function_declaration = 0;
+    }
+
   /* the beginning of the file is a new line; check for # */
   /* With luck, we discover the real source file's name from that
      and put it in input_filename.  */
index fcf6112..0bb4efb 100644 (file)
@@ -188,6 +188,7 @@ extern tree grokfield                           PARAMS ((const char *, int, tree
 extern tree groktypename                        PARAMS ((tree));
 extern tree groktypename_in_parm_context        PARAMS ((tree));
 extern tree implicitly_declare                  PARAMS ((tree));
+extern void implicit_decl_warning               PARAMS ((tree));
 extern int  in_parm_level_p                     PARAMS ((void));
 extern void init_decl_processing                PARAMS ((void));
 extern void insert_block                        PARAMS ((tree));
@@ -388,6 +389,9 @@ extern int warn_long_long;
 
 extern int system_header_p;
 
+/* Warn about implicit declarations.  1 = warning, 2 = error.  */
+extern int mesg_implicit_function_declaration;
+
 /* Nonzero enables objc features.  */
 
 #define doing_objc_thang \
index 17cdedd..e6fc249 100644 (file)
@@ -1417,9 +1417,10 @@ build_external_ref (id, fun)
              /* Implicit declaration of built-in function.  Don't
                 change the built-in declaration, but don't let this
                 go by silently, either.  */
-             pedwarn ("implicit declaration of function `%s'",
-                      IDENTIFIER_POINTER (DECL_NAME (decl)));
-             C_DECL_ANTICIPATED (decl) = 0;  /* only issue this warning once */
+             implicit_decl_warning (id);
+
+             /* only issue this warning once */
+             C_DECL_ANTICIPATED (decl) = 0;
              ref = decl;
            }
        }
index cc7ed1b..c1090c8 100644 (file)
@@ -1,3 +1,7 @@
+2000-07-31  Zack Weinberg  <zack@wolery.cumb.org>
+
+       * gcc.dg/c99-impl-decl-1.c: No longer XFAIL.
+
 2000-07-31  Joseph S. Myers  <jsm28@cam.ac.uk>
 
        * gcc.dg/noncompile/voidparam-1.c: New test.
index 5843e64..6602bc7 100644 (file)
@@ -7,7 +7,7 @@ void
 foo (void)
 {
   bar (); /* { dg-bogus "warning" "warning in place of error" } */
 /* { dg-error "implicit" "C99 implicit declaration error" { xfail *-*-* } 9 } */
/* { dg-error "implicit" "C99 implicit declaration error" { target *-*-* } 9 } */
 }
 
 /* C90 subclause 7.1.7 says we can implicitly declare strcmp; C99 removes