1  /* { dg-do run } */
       2  /* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } } */
       3  /* { dg-require-effective-target alloca } */
       4  
       5  #include <stdarg.h>
       6  #include "check.h"
       7  
       8  #ifndef ALIGNMENT
       9  #define ALIGNMENT	64
      10  #endif
      11  
      12  typedef int aligned __attribute__((aligned(ALIGNMENT)));
      13  
      14  int global;
      15  
      16  void
      17  bar (char *p, int size)
      18  {
      19    __builtin_strncpy (p, "good", size);
      20  }
      21  
      22  void
      23  test (va_list arg)
      24  {
      25    char *p;
      26    aligned i;
      27    int size;
      28    double x;
      29  
      30    size = va_arg (arg, int);
      31    if (size != 5)
      32      abort ();
      33  
      34    p = __builtin_alloca (size + 1);
      35  
      36    x = va_arg (arg, double);
      37    if (x != 5.0)
      38      abort ();
      39  
      40    bar (p, size);
      41    if (__builtin_strncmp (p, "good", size) != 0)
      42      {
      43  #ifdef DEBUG
      44        p[size] = '\0';
      45        printf ("Failed: %s != good\n", p);
      46  #endif
      47        abort ();
      48      }
      49  
      50    if (check_int (&i,  __alignof__(i)) != i)
      51      abort ();
      52  }
      53  
      54  void
      55  foo (const char *fmt, ...)
      56  {
      57    va_list arg;
      58    va_start (arg, fmt);
      59    test (arg);
      60    va_end (arg);
      61  }
      62  int
      63  main()
      64  {
      65    foo ("foo", 5, 5.0);
      66    return 0;
      67  }