131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh/* { dg-do run } */
231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#include <stdarg.h>
431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#include "check.h"
531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#ifndef ALIGNMENT
731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#define ALIGNMENT	64
831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#endif
931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
1031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehtypedef int aligned __attribute__((aligned(ALIGNMENT)));
1131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
1231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehint global;
1331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
1431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehvoid
1531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehbar (char *p, int size)
1631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{
1731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  __builtin_strncpy (p, "good", size);
1831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh}
1931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
2031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehclass Base {};
2131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
2231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehstruct A : virtual public Base
2331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{
2431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  A() {}
2531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh};
2631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
2731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehstruct B {};
2831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
2931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehvoid
3031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehfoo (const char *fmt, ...) throw (B,A)
3131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{
3231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  va_list arg;
3331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  char *p;
3431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  aligned i;
3531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  int size;
3631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  double x;
3731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
3831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  va_start (arg, fmt);
3931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  size = va_arg (arg, int);
4031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  if (size != 5)
4131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    abort ();
4231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  p = (char *) __builtin_alloca (size + 1);
4331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
4431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  x = va_arg (arg, double);
4531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  if (x != 5.0)
4631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    abort ();
4731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
4831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  bar (p, size);
4931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  if (__builtin_strncmp (p, "good", size) != 0)
5031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    {
5131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#ifdef DEBUG
5231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      p[size] = '\0';
5331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      printf ("Failed: %s != good\n", p);
5431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#endif
5531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh      abort ();
5631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    }
5731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
5831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  if (check_int (&i,  __alignof__(i)) != i)
5931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh    abort ();
6031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
6131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  throw A();
6231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
6331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  va_end (arg);
6431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh}
6531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh
6631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehint
6731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehmain()
6831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{
6931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  try {	foo ("foo", 5, 5.0); }
7031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  catch (A& a) { }
7131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh  return 0;
7231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh}
73