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