Patchwork [C] Better location for implicit_decl_warning (PR c/61852)

login
register
mail settings
Submitter Marek Polacek
Date July 20, 2014, 10:38 a.m.
Message ID <20140720103854.GB2287@redhat.com>
Download mbox | patch
Permalink /patch/371883/
State New
Headers show

Comments

Marek Polacek - July 20, 2014, 10:38 a.m.
implicit_decl_warning wasn't getting a location, so the column info
was poor.  It's easy to fix this up.

Bootstrapped/regtested on x86_64-linux, applying to trunk.

2014-07-20  Marek Polacek  <polacek@redhat.com>

	PR c/61852
	* c-decl.c (implicit_decl_warning): Add location_t parameter.  Use it.
	(implicitly_declare): Pass location to implicit_decl_warning.

	* gcc.dg/pr61852.c: New test.


	Marek

Patch

diff --git gcc/c/c-decl.c gcc/c/c-decl.c
index 0ca2e0d..425fc58 100644
--- gcc/c/c-decl.c
+++ gcc/c/c-decl.c
@@ -2951,18 +2951,18 @@  pushdecl_top_level (tree x)
 }
 
 static void
-implicit_decl_warning (tree id, tree olddecl)
+implicit_decl_warning (location_t loc, tree id, tree olddecl)
 {
   if (warn_implicit_function_declaration)
     {
       bool warned;
 
       if (flag_isoc99)
-	warned = pedwarn (input_location, OPT_Wimplicit_function_declaration,
+	warned = pedwarn (loc, OPT_Wimplicit_function_declaration,
 			  "implicit declaration of function %qE", id);
       else
-	warned = warning (OPT_Wimplicit_function_declaration,
-			  G_("implicit declaration of function %qE"), id);
+	warned = warning_at (loc, OPT_Wimplicit_function_declaration,
+			     G_("implicit declaration of function %qE"), id);
       if (olddecl && warned)
 	locate_old_decl (olddecl);
     }
@@ -3015,7 +3015,7 @@  implicitly_declare (location_t loc, tree functionid)
 	     then recycle the old declaration but with the new type.  */
 	  if (!C_DECL_IMPLICIT (decl))
 	    {
-	      implicit_decl_warning (functionid, decl);
+	      implicit_decl_warning (loc, functionid, decl);
 	      C_DECL_IMPLICIT (decl) = 1;
 	    }
 	  if (DECL_BUILT_IN (decl))
@@ -3052,7 +3052,7 @@  implicitly_declare (location_t loc, tree functionid)
   DECL_EXTERNAL (decl) = 1;
   TREE_PUBLIC (decl) = 1;
   C_DECL_IMPLICIT (decl) = 1;
-  implicit_decl_warning (functionid, 0);
+  implicit_decl_warning (loc, functionid, 0);
   asmspec_tree = maybe_apply_renaming_pragma (decl, /*asmname=*/NULL);
   if (asmspec_tree)
     set_user_assembler_name (decl, TREE_STRING_POINTER (asmspec_tree));
diff --git gcc/testsuite/gcc.dg/pr61852.c gcc/testsuite/gcc.dg/pr61852.c
index e69de29..f488aca 100644
--- gcc/testsuite/gcc.dg/pr61852.c
+++ gcc/testsuite/gcc.dg/pr61852.c
@@ -0,0 +1,10 @@ 
+/* PR c/61852 */
+/* { dg-do compile } */
+/* { dg-options "-Wimplicit-function-declaration" } */
+
+int
+f (int a)
+{
+  int b = a + a + a + ff (a); /* { dg-warning "23:implicit declaration of function" } */
+  return b;
+}