diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2000-10-31 21:30:22 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2000-10-31 21:30:22 +0000 |
commit | c5a0835dea5cfb00153b38ecbe14f067c586ccdb (patch) | |
tree | 29f99a78921a83373df20b8da7e84ba267f8c12b | |
parent | 7e08e19030fe87f00af88372c2fea23c1b8f0ac1 (diff) | |
download | gcc-c5a0835dea5cfb00153b38ecbe14f067c586ccdb.zip gcc-c5a0835dea5cfb00153b38ecbe14f067c586ccdb.tar.gz gcc-c5a0835dea5cfb00153b38ecbe14f067c586ccdb.tar.bz2 |
* gcc.c-torture/execute/va-arg-21.c: New test.
From-SVN: r37167
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/execute/va-arg-21.c | 48 |
2 files changed, 52 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0d714d8..838db07 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-10-31 Kaveh R. Ghazi <ghazi@caip.rutgers.edu> + + * gcc.c-torture/execute/va-arg-21.c: New test. + 2000-10-31 Joseph S. Myers <jsm28@cam.ac.uk> * gcc.dg/c99-complex-2.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/execute/va-arg-21.c b/gcc/testsuite/gcc.c-torture/execute/va-arg-21.c new file mode 100644 index 0000000..8c9802a --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/va-arg-21.c @@ -0,0 +1,48 @@ +/* Copyright (C) 2000 Free Software Foundation. + + If the argument to va_end() has side effects, test whether side + effects from that argument are honored. + + Written by Kaveh R. Ghazi, 10/31/2000. */ + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +#ifndef __GNUC__ +#define __attribute__(x) +#endif + +static void __attribute__ ((__format__ (__printf__, 1, 2))) +doit (const char *s, ...) +{ + va_list *ap_array[3], **ap_ptr = ap_array; + + ap_array[0] = malloc (sizeof(va_list)); + ap_array[1] = NULL; + ap_array[2] = malloc (sizeof(va_list)); + + va_start (*ap_array[0], s); + vprintf (s, **ap_ptr); + /* Increment the va_list pointer once. */ + va_end (**ap_ptr++); + + /* Increment the va_list pointer a second time. */ + ap_ptr++; + + va_start (*ap_array[2], s); + /* If we failed to increment ap_ptr twice, then the parameter passed + in here will dereference NULL and should cause a crash. */ + vprintf (s, **ap_ptr); + va_end (**ap_ptr); + + /* Just in case, If *ap_ptr is NULL abort anyway. */ + if (*ap_ptr == 0) + abort(); +} + +int main() +{ + doit ("%s", "hello world\n"); + return 0; +} |