111
|
1 /* { dg-do run } */
|
|
2 /* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } } */
|
131
|
3 /* { dg-require-effective-target alloca } */
|
111
|
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 class Base {};
|
|
23
|
|
24 struct A : virtual public Base
|
|
25 {
|
|
26 A() {}
|
|
27 };
|
|
28
|
|
29 struct B {};
|
|
30
|
|
31 void
|
|
32 foo (const char *fmt, ...)
|
|
33 #if __cplusplus <= 201402L
|
|
34 throw (B,A) // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } }
|
|
35 #endif
|
|
36 {
|
|
37 va_list arg;
|
|
38 char *p;
|
|
39 aligned i;
|
|
40 int size;
|
|
41 double x;
|
|
42
|
|
43 va_start (arg, fmt);
|
|
44 size = va_arg (arg, int);
|
|
45 if (size != 5)
|
|
46 abort ();
|
|
47 p = (char *) __builtin_alloca (size + 1);
|
|
48
|
|
49 x = va_arg (arg, double);
|
|
50 if (x != 5.0)
|
|
51 abort ();
|
|
52
|
|
53 bar (p, size);
|
|
54 if (__builtin_strncmp (p, "good", size) != 0)
|
|
55 {
|
|
56 #ifdef DEBUG
|
|
57 p[size] = '\0';
|
|
58 printf ("Failed: %s != good\n", p);
|
|
59 #endif
|
|
60 abort ();
|
|
61 }
|
|
62
|
|
63 if (check_int (&i, __alignof__(i)) != i)
|
|
64 abort ();
|
|
65
|
|
66 throw A();
|
|
67
|
|
68 va_end (arg);
|
|
69 }
|
|
70
|
|
71 int
|
|
72 main()
|
|
73 {
|
|
74 try { foo ("foo", 5, 5.0); }
|
|
75 catch (A& a) { }
|
|
76 return 0;
|
|
77 }
|