Commit b9c8da34 by Dodji Seketeli Committed by Dodji Seketeli

Add -Wvarargs option

Several warnings related to questionable usage cases of variadic
function related macros (like va_start) could not be controlled by any
warning-related macro.  Fixed thus, by introducing the -Wvarargs
option.

Tested on x86_64-unknown-linux-gnu against trunk.

gcc/c-family/

	* c.opt (Wvarargs):  Define new option.

gcc/
	* builtins.c (fold_builtin_next_arg):  Use OPT_Wvarargs as an
	argument for the various warning_at calls.

gcc/doc/

	* invoke.texi: Update the documentation.

gcc/testsuite/

	* c-c++-common/Wvarargs.c: New test case.
	* c-c++-common/Wvarargs-2.c: Likewise.

From-SVN: r186978
parent 51fce2d3
2012-04-30 Dodji Seketeli <dodji@redhat.com>
Add -Wvarargs option
* builtins.c (fold_builtin_next_arg): Use OPT_Wvarargs as an
argument for the various warning_at calls.
* docs/invoke.texi: Update the documentation.
2012-04-30 Dodji Seketeli <dodji@redhat.com>
Switch -ftrack-macro-expansion=2 on by default.
* docs/cppopts.texi: Adjust for enabling -ftrack-macro-expansion=2
by default.
......
......@@ -12127,8 +12127,8 @@ fold_builtin_next_arg (tree exp, bool va_start_p)
/* Evidently an out of date version of <stdarg.h>; can't validate
va_start's second argument, but can still work as intended. */
warning_at (current_location,
0,
"%<__builtin_next_arg%> called without an argument");
OPT_Wvarargs,
"%<__builtin_next_arg%> called without an argument");
return true;
}
else if (nargs > 1)
......@@ -12164,7 +12164,7 @@ fold_builtin_next_arg (tree exp, bool va_start_p)
argument so that we will get wrong-code because of
it. */
warning_at (current_location,
0,
OPT_Wvarargs,
"second parameter of %<va_start%> not last named argument");
}
......@@ -12177,7 +12177,7 @@ fold_builtin_next_arg (tree exp, bool va_start_p)
else if (DECL_REGISTER (arg))
{
warning_at (current_location,
0,
OPT_Wvarargs,
"undefined behaviour when second parameter of "
"%<va_start%> is declared with %<register%> storage");
}
......
2012-04-30 Dodji Seketeli <dodji@redhat.com>
Add -Wvarargs option
* c.opt (Wvarargs): Define new option.
2012-04-30 Manuel López-Ibáñez <manu@gcc.gnu.org>
* c-common.c (check_function_arguments): Replace
......
......@@ -689,6 +689,10 @@ Wvariadic-macros
C ObjC C++ ObjC++ Warning
Do not warn about using variadic macros when -pedantic
Wvarargs
C ObjC C++ ObjC++ Warning Var(warn_varargs) Init(1)
Warn about questionable usage of the macros used to retrieve variable arguments
Wvla
C ObjC C++ ObjC++ Var(warn_vla) Init(-1) Warning
Warn if a variable length array is used
......
......@@ -4663,6 +4663,13 @@ Warn if variadic macros are used in pedantic ISO C90 mode, or the GNU
alternate syntax when in pedantic ISO C99 mode. This is default.
To inhibit the warning messages, use @option{-Wno-variadic-macros}.
@item -Wvarargs
@opindex Wvarargs
@opindex Wno-varargs
Warn upon questionable usage of the macros used to handle variable
arguments like @samp{va_start}. This is default. To inhibit the
warning messages, use @option{-Wno-varargs}.
@item -Wvector-operation-performance
@opindex Wvector-operation-performance
@opindex Wno-vector-operation-performance
......
2012-04-30 Dodji Seketeli <dodji@redhat.com>
Add -Wvarargs option
* c-c++-common/Wvarargs.c: New test case.
* c-c++-common/Wvarargs-2.c: Likewise.
2012-04-30 Dodji Seketeli <dodji@redhat.com>
Adjust relevant test cases wrt -ftrack-macro-expansion=[0|2]
* objc.dg/foreach-7.m: Force the test case to run without
-ftrack-macro-expansion.
......
/*
{ dg-options "-Wno-varargs" }
{ dg-do compile }
*/
#include <stdarg.h>
void
err (int a)
{
va_list vp;
va_start (vp, a); // { dg-error "used in function with fixed args" }
}
void
foo0 (int a, int b, ...)
{
va_list vp;
/* 'a' is not the last argument of the enclosing function, but
don't warn because we are ignoring -Wvarargs. */
va_start (vp, a);
va_end (vp);
}
void
foo1 (int a, register int b, ...)
{
va_list vp;
/* 'b' is declared with register storage, but don't warn
because we are ignoring -Wvarargs. */
va_start (vp, b);
va_end (vp);
}
/* { dg-do compile } */
#include <stdarg.h>
void
err (int a)
{
va_list vp;
va_start (vp, a); // { dg-error "used in function with fixed args" }
}
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wvarargs"
void
foo0 (int a, int b, ...)
{
va_list vp;
/* 'a' is not the last argument of the enclosing function, but
don't warn because we are ignoring -Wvarargs. */
va_start (vp, a);
va_end (vp);
}
void
foo1 (int a, register int b, ...)
{
va_list vp;
/* 'b' is declared with register storage, but don't warn
because we are ignoring -Wvarargs. */
va_start (vp, b);
va_end (vp);
}
#pragma GCC diagnostic pop
void
foo2 (int a, int b, ...)
{
va_list vp;
/* 'a' is not the last argument of the enclosing function, so
warn. */
va_start (vp, a); /* { dg-warning "second parameter" } */
va_end (vp);
}
void
foo3 (int a, register int b, ...)
{
va_list vp;
/* 'b' is declared with register storage, so warn. */
va_start (vp, b); /* { dg-warning "undefined behaviour" } */
va_end (vp);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment