| // { dg-do run } |
| // Copyright (C) 1999, 2000 Free Software Foundation, Inc. |
| // Contributed by Nathan Sidwell 4 Oct 1999 <nathan@acm.org> |
| |
| // Make sure we can deal with POD aggregate in va_args |
| |
| #include <stdarg.h> |
| extern "C" void abort (); |
| |
| struct X {int m;}; |
| struct Y {int a; int b; int c; int d; int e; int f;}; |
| |
| void fn1(va_list args) |
| { |
| int i = va_arg (args, int); |
| X x = va_arg (args, X); |
| Y y = va_arg (args, Y); |
| if (i != 1) |
| abort (); |
| if (x.m != 1) |
| abort (); |
| if (y.a != 1 || y.b != 2 || y.c != 3 || y.d != 4 || |
| y.e != 5 || y.f != 6) |
| abort (); |
| } |
| |
| void fn2(va_list args) |
| { |
| const int &i = va_arg (args, int); |
| const X &x = va_arg (args, X); |
| const Y &y = va_arg (args, Y); |
| if (i != 1) |
| abort (); |
| if (x.m != 1) |
| abort (); |
| if (y.a != 1 || y.b != 2 || y.c != 3 || y.d != 4 || |
| y.e != 5 || y.f != 6) |
| abort (); |
| } |
| |
| void |
| dispatch (int t, ...) |
| { |
| va_list args; |
| |
| va_start (args, t); |
| fn1 (args); |
| va_end (args); |
| |
| va_start (args, t); |
| fn2 (args); |
| va_end (args); |
| } |
| |
| int main () |
| { |
| X x = {1}; |
| Y y = {1, 2, 3, 4, 5, 6}; |
| |
| dispatch (0, 1, x, y); |
| |
| return 0; |
| } |