From 24158ad72ffc0dee587acb39506faadd87039293 Mon Sep 17 00:00:00 2001 From: manu Date: Thu, 21 Aug 2008 19:05:46 +0000 Subject: [PATCH] 2008-08-21 Manuel Lopez-Ibanez PR 30457 * builtins.c (fold_builtin_next_arg): Add warning about undefined behaviour. testsuite/ * gcc.dg/pr30457.c: New. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@139406 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/builtins.c | 11 +++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr30457.c | 26 ++++++++++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/pr30457.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 23783fd2dab..55ffcb13f06 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2008-08-21 Manuel Lopez-Ibanez + + PR 30457 + * builtins.c (fold_builtin_next_arg): Add warning about undefined + behaviour. + 2008-08-21 Aldy Hernandez * c-tree.h (grokfield): New argument. diff --git a/gcc/builtins.c b/gcc/builtins.c index 66956724984..59e4119efd4 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -11586,6 +11586,17 @@ fold_builtin_next_arg (tree exp, bool va_start_p) it. */ warning (0, "second parameter of % 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 " + "% is declared with % 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: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0aa749ee35f..d4015a989ef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2008-08-21 Manuel Lopez-Ibanez + + PR 30457 + * gcc.dg/pr30457.c: New. + 2008-08-21 Aldy Hernandez * gcc.dg/20011008-1.c: Test column. diff --git a/gcc/testsuite/gcc.dg/pr30457.c b/gcc/testsuite/gcc.dg/pr30457.c new file mode 100644 index 00000000000..f52332d0a1e --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr30457.c @@ -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 + +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); +} + -- 2.11.0