From b9c8da345cd0763bb30a5a12713c808d74a2070f Mon Sep 17 00:00:00 2001 From: Dodji Seketeli Date: Mon, 30 Apr 2012 11:43:57 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 ++++ gcc/builtins.c | 8 ++-- gcc/c-family/ChangeLog | 5 +++ gcc/c-family/c.opt | 4 ++ gcc/doc/invoke.texi | 7 ++++ gcc/testsuite/ChangeLog | 6 +++ gcc/testsuite/c-c++-common/Wvarargs-2.c | 33 +++++++++++++++ gcc/testsuite/c-c++-common/Wvarargs.c | 54 +++++++++++++++++++++++++ 8 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/Wvarargs-2.c create mode 100644 gcc/testsuite/c-c++-common/Wvarargs.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 43d3f5daa04..264c997e4a1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-04-30 Dodji Seketeli + + 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 Switch -ftrack-macro-expansion=2 on by default. diff --git a/gcc/builtins.c b/gcc/builtins.c index 5ddc47bd7ea..41a052b1d8f 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -12127,8 +12127,8 @@ fold_builtin_next_arg (tree exp, bool va_start_p) /* Evidently an out of date version of ; 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 % 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 " "% is declared with % storage"); } diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index b108b509971..9f62db21b6d 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2012-04-30 Dodji Seketeli + + Add -Wvarargs option + * c.opt (Wvarargs): Define new option. + 2012-04-30 Manuel López-Ibáñez * c-common.c (check_function_arguments): Replace diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index ff8ce94f96c..d2cf6ee6caa 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -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 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index c6ee28fb4c2..a7efaa7e021 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 000d0a865f4..f5cfe3710ab 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2012-04-30 Dodji Seketeli + + Add -Wvarargs option + * c-c++-common/Wvarargs.c: New test case. + * c-c++-common/Wvarargs-2.c: Likewise. + 2012-04-30 Dodji Seketeli Adjust relevant test cases wrt -ftrack-macro-expansion=[0|2] diff --git a/gcc/testsuite/c-c++-common/Wvarargs-2.c b/gcc/testsuite/c-c++-common/Wvarargs-2.c new file mode 100644 index 00000000000..a2e031f9140 --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wvarargs-2.c @@ -0,0 +1,33 @@ +/* + { dg-options "-Wno-varargs" } + { dg-do compile } + */ + +#include + +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); +} diff --git a/gcc/testsuite/c-c++-common/Wvarargs.c b/gcc/testsuite/c-c++-common/Wvarargs.c new file mode 100644 index 00000000000..408f427b5c4 --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wvarargs.c @@ -0,0 +1,54 @@ +/* { dg-do compile } */ + +#include + +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); +} -- 2.30.2