summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture/execute/strct-varg-1.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/testsuite/gcc.c-torture/execute/strct-varg-1.c')
-rwxr-xr-xgcc/testsuite/gcc.c-torture/execute/strct-varg-1.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/strct-varg-1.c b/gcc/testsuite/gcc.c-torture/execute/strct-varg-1.c
new file mode 100755
index 0000000..f76bb36
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/strct-varg-1.c
@@ -0,0 +1,56 @@
+#ifdef NO_VARARGS
+#include <stdarg.h>
+#define va_alist int x_attr, ...
+#define va_dcl
+#else
+#include <varargs.h>
+#endif
+
+struct s { int x, y; };
+
+f (va_alist)
+ va_dcl
+{
+ struct s va_values;
+ va_list va;
+ int attr;
+ int i;
+
+#ifdef NO_VARARGS
+ va_start (va, x_attr);
+ attr = x_attr;
+#else
+ va_start (va);
+ attr = va_arg (va, int);
+#endif
+
+ if (attr != 2)
+ abort ();
+
+ va_values = va_arg (va, struct s);
+ if (va_values.x != 0xaaaa || va_values.y != 0x5555)
+ abort ();
+
+ attr = va_arg (va, int);
+ if (attr != 3)
+ abort ();
+
+ va_values = va_arg (va, struct s);
+ if (va_values.x != 0xffff || va_values.y != 0x1111)
+ abort ();
+
+ va_end (va);
+}
+
+main ()
+{
+ struct s a, b;
+
+ a.x = 0xaaaa;
+ a.y = 0x5555;
+ b.x = 0xffff;
+ b.y = 0x1111;
+
+ f (2, a, 3, b);
+ exit (0);
+}