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  foo (const char *fmt, ...)
      24  {
      25    va_list arg;
      26    char *p;
      27    aligned i;
      28    int size;
      29    double x;
      30  
      31    va_start (arg, fmt);
      32    size = va_arg (arg, int);
      33    if (size != 5)
      34      abort ();
      35    p = __builtin_alloca (size + 1);
      36  
      37    x = va_arg (arg, double);
      38    if (x != 5.0)
      39      abort ();
      40  
      41    bar (p, size);
      42    if (__builtin_strncmp (p, "good", size) != 0)
      43      {
      44  #ifdef DEBUG
      45        p[size] = '\0';
      46        printf ("Failed: %s != good\n", p);
      47  #endif
      48        abort ();
      49      }
      50  
      51    if (check_int (&i,  __alignof__(i)) != i)
      52      abort ();
      53    va_end (arg);
      54  }
      55  
      56  int
      57  main()
      58  {
      59    foo ("foo", 5, 5.0);
      60    return 0;
      61  }