| /* { dg-do compile } */ |
| |
| #include <stdarg.h> |
| |
| void |
| err (int a) |
| { |
| va_list vp; |
| va_start (vp, a); // { dg-error "used in function with fixed arguments" } |
| } |
| |
| #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, ...) // { dg-warning "ISO C\\+\\+17 does not allow 'register' storage class specifier" "" { target c++17 } } |
| { |
| 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, ...) // { dg-warning "ISO C\\+\\+17 does not allow 'register' storage class specifier" "" { target c++17 } } |
| { |
| va_list vp; |
| /* 'b' is declared with register storage, so warn. */ |
| va_start (vp, b); /* { dg-warning "undefined behavior" } */ |
| va_end (vp); |
| } |