diff options
author | Jakub Jelinek <jakub@redhat.com> | 2002-03-09 14:27:11 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2002-03-09 14:27:11 +0100 |
commit | e4a4c70b54bca76e444e50f53f58bcf3986a42c2 (patch) | |
tree | 00405f758e73d25b9b1ba35ed6df8bde376d0217 /gcc | |
parent | e0f1be5c98090d91902b81bc6312826c7f75f1bb (diff) | |
download | gcc-e4a4c70b54bca76e444e50f53f58bcf3986a42c2.zip gcc-e4a4c70b54bca76e444e50f53f58bcf3986a42c2.tar.gz gcc-e4a4c70b54bca76e444e50f53f58bcf3986a42c2.tar.bz2 |
* gcc.c-torture/execute/va-arg-22.c: New test.
From-SVN: r50497
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/va-arg-22.c | 78 |
2 files changed, 82 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2e1c449..1db2c2b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2002-03-09 Jakub Jelinek <jakub@redhat.com> + + * gcc.c-torture/execute/va-arg-22.c: New test. + Sat Mar 9 07:47:50 2002 Richard Kenner <kenner@vlsi1.ultra.nyu.edu> * gcc.c-torture/compile/20020309-1.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/va-arg-22.c b/gcc/testsuite/gcc.c-torture/execute/va-arg-22.c new file mode 100644 index 0000000..46b8dcb --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/va-arg-22.c @@ -0,0 +1,78 @@ +#include <stdarg.h> + +extern void abort (void); +extern void exit (int); + +void bar (int n, int c) +{ + static int lastn = -1, lastc = -1; + + if (lastn != n) + { + if (lastc != lastn) + abort (); + lastc = 0; + lastn = n; + } + + if (c != (char) (lastc ^ (n << 3))) + abort (); + lastc++; +} + +#define D(N) typedef struct { char x[N]; } A##N; +D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) +D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) +D(16) D(31) D(32) D(35) D(72) +#undef D + +void foo (int size, ...) +{ +#define D(N) A##N a##N; +D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) +D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) +D(16) D(31) D(32) D(35) D(72) +#undef D + va_list ap; + int i; + + if (size != 21) + abort (); + va_start (ap, size); +#define D(N) \ + a##N = va_arg (ap, typeof (a##N)); \ + for (i = 0; i < N; i++) \ + bar (N, a##N.x[i]); +D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) +D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) +D(16) D(31) D(32) D(35) D(72) +#undef D + va_end (ap); +} + +int main (void) +{ +#define D(N) A##N a##N; +D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) +D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) +D(16) D(31) D(32) D(35) D(72) +#undef D + int i; + +#define D(N) \ + for (i = 0; i < N; i++) \ + a##N.x[i] = i ^ (N << 3); +D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) +D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) +D(16) D(31) D(32) D(35) D(72) +#undef D + + foo (21 +#define D(N) , a##N +D(0) D(1) D(2) D(3) D(4) D(5) D(6) D(7) +D(8) D(9) D(10) D(11) D(12) D(13) D(14) D(15) +D(16) D(31) D(32) D(35) D(72) +#undef D + ); + exit (0); +} |