summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/pr30457.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.dg/pr30457.c')
-rw-r--r--gcc/testsuite/gcc.dg/pr30457.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/pr30457.c b/gcc/testsuite/gcc.dg/pr30457.c
new file mode 100644
index 000000000..f52332d0a
--- /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 <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);
+}
+