aboutsummaryrefslogtreecommitdiff
path: root/SingleSource/Regression/C/gcc-c-torture/execute/stdarg-4.c
diff options
context:
space:
mode:
Diffstat (limited to 'SingleSource/Regression/C/gcc-c-torture/execute/stdarg-4.c')
-rw-r--r--SingleSource/Regression/C/gcc-c-torture/execute/stdarg-4.c137
1 files changed, 137 insertions, 0 deletions
diff --git a/SingleSource/Regression/C/gcc-c-torture/execute/stdarg-4.c b/SingleSource/Regression/C/gcc-c-torture/execute/stdarg-4.c
new file mode 100644
index 00000000..f820bcee
--- /dev/null
+++ b/SingleSource/Regression/C/gcc-c-torture/execute/stdarg-4.c
@@ -0,0 +1,137 @@
+#include <stdarg.h>
+
+extern void abort (void);
+long x, y;
+
+inline void __attribute__((always_inline))
+f1i (va_list ap)
+{
+ x = va_arg (ap, double);
+ x += va_arg (ap, long);
+ x += va_arg (ap, double);
+}
+
+void
+f1 (int i, ...)
+{
+ va_list ap;
+ va_start (ap, i);
+ f1i (ap);
+ va_end (ap);
+}
+
+inline void __attribute__((always_inline))
+f2i (va_list ap)
+{
+ y = va_arg (ap, int);
+ y += va_arg (ap, long);
+ y += va_arg (ap, double);
+ f1i (ap);
+}
+
+void
+f2 (int i, ...)
+{
+ va_list ap;
+ va_start (ap, i);
+ f2i (ap);
+ va_end (ap);
+}
+
+long
+f3h (int i, long arg0, long arg1, long arg2, long arg3)
+{
+ return i + arg0 + arg1 + arg2 + arg3;
+}
+
+long
+f3 (int i, ...)
+{
+ long t, arg0, arg1, arg2, arg3;
+ va_list ap;
+
+ va_start (ap, i);
+ switch (i)
+ {
+ case 0:
+ t = f3h (i, 0, 0, 0, 0);
+ break;
+ case 1:
+ arg0 = va_arg (ap, long);
+ t = f3h (i, arg0, 0, 0, 0);
+ break;
+ case 2:
+ arg0 = va_arg (ap, long);
+ arg1 = va_arg (ap, long);
+ t = f3h (i, arg0, arg1, 0, 0);
+ break;
+ case 3:
+ arg0 = va_arg (ap, long);
+ arg1 = va_arg (ap, long);
+ arg2 = va_arg (ap, long);
+ t = f3h (i, arg0, arg1, arg2, 0);
+ break;
+ case 4:
+ arg0 = va_arg (ap, long);
+ arg1 = va_arg (ap, long);
+ arg2 = va_arg (ap, long);
+ arg3 = va_arg (ap, long);
+ t = f3h (i, arg0, arg1, arg2, arg3);
+ break;
+ default:
+ abort ();
+ }
+ va_end (ap);
+
+ return t;
+}
+
+void
+f4 (int i, ...)
+{
+ va_list ap;
+
+ va_start (ap, i);
+ switch (i)
+ {
+ case 4:
+ y = va_arg (ap, double);
+ break;
+ case 5:
+ y = va_arg (ap, double);
+ y += va_arg (ap, double);
+ break;
+ default:
+ abort ();
+ }
+ f1i (ap);
+ va_end (ap);
+}
+
+int
+main (void)
+{
+ f1 (3, 16.0, 128L, 32.0);
+ if (x != 176L)
+ abort ();
+ f2 (6, 5, 7L, 18.0, 19.0, 17L, 64.0);
+ if (x != 100L || y != 30L)
+ abort ();
+ if (f3 (0) != 0)
+ abort ();
+ if (f3 (1, 18L) != 19L)
+ abort ();
+ if (f3 (2, 18L, 100L) != 120L)
+ abort ();
+ if (f3 (3, 18L, 100L, 300L) != 421L)
+ abort ();
+ if (f3 (4, 18L, 71L, 64L, 86L) != 243L)
+ abort ();
+ f4 (4, 6.0, 9.0, 16L, 18.0);
+ if (x != 43L || y != 6L)
+ abort ();
+ f4 (5, 7.0, 21.0, 1.0, 17L, 126.0);
+ if (x != 144L || y != 28L)
+ abort ();
+ return 0;
+}