1 /* { dg-skip-if "requires io" { freestanding } }  */
2 
3 #ifndef test
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <stdarg.h>
7 
8 volatile int should_optimize;
9 
10 int
11 __attribute__((noinline))
__vprintf_chk(int flag,const char * fmt,va_list ap)12 __vprintf_chk (int flag, const char *fmt, va_list ap)
13 {
14 #ifdef __OPTIMIZE__
15   if (should_optimize)
16     abort ();
17 #endif
18   should_optimize = 1;
19   return vprintf (fmt, ap);
20 }
21 
22 void
inner(int x,...)23 inner (int x, ...)
24 {
25   va_list ap, ap2;
26   va_start (ap, x);
27   va_start (ap2, x);
28 
29   switch (x)
30     {
31 #define test(n, ret, opt, fmt, args) \
32     case n:					\
33       should_optimize = opt;			\
34       __vprintf_chk (1, fmt, ap);		\
35       if (! should_optimize)			\
36 	abort ();				\
37       should_optimize = 0;			\
38       if (__vprintf_chk (1, fmt, ap2) != ret)	\
39 	abort ();				\
40       if (! should_optimize)			\
41 	abort ();				\
42       break;
43 #include "vprintf-chk-1.c"
44 #undef test
45     default:
46       abort ();
47     }
48 
49   va_end (ap);
50   va_end (ap2);
51 }
52 
53 int
main(void)54 main (void)
55 {
56 #define test(n, ret, opt, fmt, args) \
57   inner args;
58 #include "vprintf-chk-1.c"
59 #undef test
60   return 0;
61 }
62 
63 #else
64   test (0, 5, 0, "hello", (0));
65   test (1, 6, 1, "hello\n", (1));
66   test (2, 1, 1, "a", (2));
67   test (3, 0, 1, "", (3));
68   test (4, 5, 0, "%s", (4, "hello"));
69   test (5, 6, 0, "%s", (5, "hello\n"));
70   test (6, 1, 0, "%s", (6, "a"));
71   test (7, 0, 0, "%s", (7, ""));
72   test (8, 1, 0, "%c", (8, 'x'));
73   test (9, 7, 0, "%s\n", (9, "hello\n"));
74   test (10, 2, 0, "%d\n", (10, 0));
75 #endif
76