vaarg2.C: New test.
authorNathan Sidwell <nathan@acm.org>
Wed, 13 Oct 1999 08:57:25 +0000 (08:57 +0000)
committerNathan Sidwell <nathan@gcc.gnu.org>
Wed, 13 Oct 1999 08:57:25 +0000 (08:57 +0000)
* g++.old-deja/g++.other/vaarg2.C: New test.
* g++.old-deja/g++.other/vaarg3.C: New test.

From-SVN: r29943

gcc/testsuite/ChangeLog
gcc/testsuite/g++.old-deja/g++.other/vaarg2.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.other/vaarg3.C [new file with mode: 0644]

index c8c5c03..4756349 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/g++.old-deja/g++.other/vaarg2.C b/gcc/testsuite/g++.old-deja/g++.other/vaarg2.C
new file mode 100644 (file)
index 0000000..aca5e21
--- /dev/null
@@ -0,0 +1,62 @@
+// 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;
+}
diff --git a/gcc/testsuite/g++.old-deja/g++.other/vaarg3.C b/gcc/testsuite/g++.old-deja/g++.other/vaarg3.C
new file mode 100644 (file)
index 0000000..4002e2d
--- /dev/null
@@ -0,0 +1,27 @@
+// 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
+}