1  /* { dg-skip-if "requires io" { freestanding } }  */
       2  
       3  #include <stdio.h>
       4  #include <stdlib.h>
       5  #include <stdarg.h>
       6  
       7  volatile int should_optimize;
       8  
       9  int
      10  __attribute__((noinline))
      11  __printf_chk (int flag, const char *fmt, ...)
      12  {
      13    va_list ap;
      14    int ret;
      15  #ifdef __OPTIMIZE__
      16    if (should_optimize)
      17      abort ();
      18  #endif
      19    should_optimize = 1;
      20    va_start (ap, fmt);
      21    ret = vprintf (fmt, ap);
      22    va_end (ap);
      23    return ret;
      24  }
      25  
      26  int
      27  main (void)
      28  {
      29  #define test(ret, opt, args...) \
      30    should_optimize = opt;		\
      31    __printf_chk (1, args); 		\
      32    if (!should_optimize)			\
      33      abort ();				\
      34    should_optimize = 0;			\
      35    if (__printf_chk (1, args) != ret)	\
      36      abort ();				\
      37    if (!should_optimize)			\
      38      abort ();
      39    test (5, 0, "hello");
      40    test (6, 1, "hello\n");
      41    test (1, 1, "a");
      42    test (0, 1, "");
      43    test (5, 0, "%s", "hello");
      44    test (6, 1, "%s", "hello\n");
      45    test (1, 1, "%s", "a");
      46    test (0, 1, "%s", "");
      47    test (1, 1, "%c", 'x');
      48    test (7, 1, "%s\n", "hello\n");
      49    test (2, 0, "%d\n", 0);
      50    return 0;
      51  }