From 7c4adc7fa84062a8af3d353bb58d094908ea8f7e Mon Sep 17 00:00:00 2001 From: Nathan Sidwell Date: Wed, 13 Oct 1999 08:57:25 +0000 Subject: [PATCH] vaarg2.C: New test. * g++.old-deja/g++.other/vaarg2.C: New test. * g++.old-deja/g++.other/vaarg3.C: New test. From-SVN: r29943 --- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/g++.old-deja/g++.other/vaarg2.C | 62 +++++++++++++++++++++++++++ gcc/testsuite/g++.old-deja/g++.other/vaarg3.C | 27 ++++++++++++ 3 files changed, 94 insertions(+) create mode 100644 gcc/testsuite/g++.old-deja/g++.other/vaarg2.C create mode 100644 gcc/testsuite/g++.old-deja/g++.other/vaarg3.C diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c8c5c03..4756349 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +1999-10-13 Nathan Sidwell + + * g++.old-deja/g++.other/vaarg2.C: New test. + * g++.old-deja/g++.other/vaarg3.C: New test. + 1999-10-12 Craig Burley * 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 index 0000000..aca5e21 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/vaarg2.C @@ -0,0 +1,62 @@ +// Copyright (C) 1999 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Oct 1999 + +// Make sure we can deal with POD aggregate in va_args + +#include +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 index 0000000..4002e2d --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.other/vaarg3.C @@ -0,0 +1,27 @@ +// Build don't link: + +// Copyright (C) 1999 Free Software Foundation, Inc. +// Contributed by Nathan Sidwell 4 Oct 1999 + +// Make sure we diagnose bad uses of va_arg + +#include + +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 +} -- 2.7.4