Wunprototyped calls
authorChanho Park <chanho61.park@samsung.com>
Fri, 18 Jul 2014 08:58:24 +0000 (17:58 +0900)
committerChanho Park <chanho61.park@samsung.com>
Mon, 21 Jul 2014 08:31:19 +0000 (17:31 +0900)
Signed-off-by: Chanho Park <chanho61.park@samsung.com>
gcc/c-family/c.opt
gcc/c/c-typeck.c
gcc/testsuite/gcc.dg/cleanup-1.c

index 2abf66c..c001184 100644 (file)
@@ -776,6 +776,10 @@ Wunused-local-typedefs
 C ObjC C++ ObjC++ Var(warn_unused_local_typedefs) Warning EnabledBy(Wunused)
 Warn when typedefs locally defined in a function are not used
 
+Wunprototyped-calls
+C Var(warn_unprototyped_calls) Warning LangEnabledBy(C,Wall)
+Warn about calls to unprototyped functions with at least one argument
+
 Wunused-macros
 C ObjC C++ ObjC++ Var(cpp_warn_unused_macros) Warning
 Warn about macros defined in the main file that are not used
index 5838d6a..38cd920 100644 (file)
@@ -2932,6 +2932,19 @@ build_function_call_vec (location_t loc, vec<location_t> arg_loc,
       && !check_builtin_function_arguments (fundecl, nargs, argarray))
     return error_mark_node;
 
+  /* If we cannot check function arguments because a prototype is
+     missing for the callee, warn here.  */
+  if (warn_unprototyped_calls
+      && nargs > 0 && !TYPE_ARG_TYPES (fntype)
+      && fundecl && !DECL_BUILT_IN (fundecl) && !C_DECL_IMPLICIT (fundecl)
+      && !DECL_ARGUMENTS (fundecl))
+    {
+      if (warning (OPT_Wunprototyped_calls,
+                  "call to function %qD without a real prototype", fundecl))
+       inform (DECL_SOURCE_LOCATION (fundecl), "%qD was declared here",
+               fundecl);
+    }
+
   /* Check that the arguments to the function are valid.  */
   check_function_arguments (fntype, nargs, argarray);
 
index 48b8264..0f395cb 100644 (file)
@@ -6,7 +6,7 @@
 #define C(x)   __attribute__((cleanup(x)))
 
 static int f1(void *x U) { return 0; }
-static void f2() { }
+static void f2() { } /* { dg-message "declared here" "" } */
 static void f3(void) { } /* { dg-message "note: declared here" } */
 static void f4(void *x U) { }
 static void f5(int *x U) { }
@@ -18,7 +18,7 @@ static void f9(int x U) { } /* { dg-message "note: expected '\[^\n'\]*' but argu
 void test(void)
 {
   int o1 C(f1);
-  int o2 C(f2);
+  int o2 C(f2);                /* { dg-warning "without a real prototype" } */
   int o3 C(f3);                /* { dg-error "too many arguments" } */
   int o4 C(f4);
   int o5 C(f5);