* g++.old-deja/g++.other/vaarg2.C: New test.
* g++.old-deja/g++.other/vaarg3.C: New test.
From-SVN: r29943
+1999-10-13 Nathan Sidwell <nathan@acm.org>
+
+ * g++.old-deja/g++.other/vaarg2.C: New test.
+ * g++.old-deja/g++.other/vaarg3.C: New test.
+
1999-10-12 Craig Burley <craig@jcb-sc.com>
* g77.f-torture/noncompile/19990905-1.f: Moved from being
--- /dev/null
+// Copyright (C) 1999 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 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;
+}
--- /dev/null
+// Build don't link:
+
+// Copyright (C) 1999 Free Software Foundation, Inc.
+// Contributed by Nathan Sidwell 4 Oct 1999 <nathan@acm.org>
+
+// Make sure we diagnose bad uses of va_arg
+
+#include <stdarg.h>
+
+struct X {int m;};
+struct Y : X {int m;};
+struct Z; // ERROR - forward decl
+void fn1(va_list args)
+{
+ int i = va_arg (args, int);
+ Y x = va_arg (args, Y); // WARNING - cannot receive
+ Y y = va_arg (args, struct Y); // WARNING - cannot receive
+ int &r = va_arg (args, int &); // WARNING - cannot receive
+
+ Z z1 = va_arg (args, Z); // ERROR - incomplete
+ const Z &z2 = va_arg (args, Z); // ERROR - incomplete
+
+ va_arg (args, char); // ERROR - promote
+ va_arg (args, int []); // ERROR - promote
+ va_arg (args, int ()); // ERROR - promote
+ va_arg (args, bool); // ERROR - promote
+}