re PR c/30457 (Please warn about va_start(ap, invalid))

2008-08-21  Manuel Lopez-Ibanez  <manu@gcc.gnu.org>

	PR 30457
	* builtins.c (fold_builtin_next_arg): Add warning about undefined
	behaviour.
testsuite/
	* gcc.dg/pr30457.c: New.

From-SVN: r139406
This commit is contained in:
Manuel López-Ibáñez 2008-08-21 19:05:46 +00:00
parent 3d10ed6cbc
commit 2985f531b7
4 changed files with 48 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2008-08-21 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 30457
* builtins.c (fold_builtin_next_arg): Add warning about undefined
behaviour.
2008-08-21 Aldy Hernandez <aldyh@redhat.com>
* c-tree.h (grokfield): New argument.

View file

@ -11586,6 +11586,17 @@ fold_builtin_next_arg (tree exp, bool va_start_p)
it. */
warning (0, "second parameter of %<va_start%> not last named argument");
}
/* Undefined by C99 7.15.1.4p4 (va_start):
"If the parameter parmN is declared with the register storage
class, with a function or array type, or with a type that is
not compatible with the type that results after application of
the default argument promotions, the behavior is undefined."
*/
else if (DECL_REGISTER (arg))
warning (0, "undefined behaviour when second parameter of "
"%<va_start%> is declared with %<register%> storage");
/* We want to verify the second parameter just once before the tree
optimizers are run and then avoid keeping it in the tree,
as otherwise we could warn even for correct code like:

View file

@ -1,3 +1,8 @@
2008-08-21 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR 30457
* gcc.dg/pr30457.c: New.
2008-08-21 Aldy Hernandez <aldyh@redhat.com>
* gcc.dg/20011008-1.c: Test column.

View file

@ -0,0 +1,26 @@
/* PR 30457 warn about va_start(ap, invalid) */
/* { dg-do compile } */
/* { dg-options "-std=c99" } */
/* Undefined by C99 7.15.1.4p4 (va_start):
"If the parameter parmN is declared with the register storage
class, with a function or array type, or with a type that is
not compatible with the type that results after application of
the default argument promotions, the behavior is undefined." */
#include <stdarg.h>
void foo(register short paramN, ...)
{
va_list ap;
va_start(ap, paramN); /* { dg-warning "undefined behaviour when second parameter of 'va_start' is declared with 'register' storage" } */
/* Undefined by C99 7.15.1.1p2: */
(void) va_arg(ap, char); /* { dg-warning "'char' is promoted to 'int' when passed through '...'" } */
/* { dg-message "note: .so you should pass .int. not .char. to .va_arg.." "" { target *-*-* } 20 } */
/* { dg-message "note: if this code is reached, the program will abort" "" { target *-*-* } 20 } */
va_end(ap);
}