]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR c/30457 (Please warn about va_start(ap, invalid))
authorManuel López-Ibáñez <manu@gcc.gnu.org>
Thu, 21 Aug 2008 19:05:46 +0000 (19:05 +0000)
committerManuel López-Ibáñez <manu@gcc.gnu.org>
Thu, 21 Aug 2008 19:05:46 +0000 (19:05 +0000)
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

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr30457.c [new file with mode: 0644]

index 23783fd2dabf685f4bafd18f194eab59758f8ebe..55ffcb13f06583e51c93718a5f88cb614fb8b2e9 100644 (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.
index 669567249848b53288373b34c2ecfd7f7a637665..59e4119efd4663fa482b67332c867ab1767759d1 100644 (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:
index 0aa749ee35f1316a8d90575798578ac159401564..d4015a989ef3b665681a8705ae7fafe28f15cf3e 100644 (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.
diff --git a/gcc/testsuite/gcc.dg/pr30457.c b/gcc/testsuite/gcc.dg/pr30457.c
new file mode 100644 (file)
index 0000000..f52332d
--- /dev/null
@@ -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);
+}
+