111
|
1 /* { dg-options "-Wno-abi" {target arm_eabi} } */
|
|
2 /* { dg-do run } */
|
|
3 /* { dg-skip-if "Stack alignment is too small" { hppa*-*-hpux* } } */
|
131
|
4 /* { dg-require-effective-target alloca } */
|
111
|
5
|
|
6 #include <stdarg.h>
|
|
7 #include "check.h"
|
|
8
|
|
9 #ifndef ALIGNMENT
|
|
10 #define ALIGNMENT 64
|
|
11 #endif
|
|
12
|
|
13 typedef int aligned __attribute__((aligned(ALIGNMENT)));
|
|
14
|
|
15 int global;
|
|
16
|
|
17 void
|
|
18 bar (char *p, int size)
|
|
19 {
|
|
20 __builtin_strncpy (p, "good", size);
|
|
21 }
|
|
22
|
|
23 class Base {};
|
|
24
|
|
25 struct A : virtual public Base
|
|
26 {
|
|
27 A() {}
|
|
28 };
|
|
29
|
|
30 struct B {};
|
|
31
|
|
32 void
|
|
33 test (va_list arg)
|
|
34 #if __cplusplus <= 201402L
|
|
35 throw (B,A) // { dg-warning "deprecated" "" { target { c++11 && { ! c++17 } } } }
|
|
36 #endif
|
|
37 {
|
|
38 char *p;
|
|
39 aligned i;
|
|
40 int size;
|
|
41 double x;
|
|
42
|
|
43 size = va_arg (arg, int);
|
|
44 if (size != 5)
|
|
45 abort ();
|
|
46
|
|
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
|
|
69 void
|
|
70 foo (const char *fmt, ...)
|
|
71 {
|
|
72 va_list arg;
|
|
73 va_start (arg, fmt);
|
|
74 test (arg);
|
|
75 va_end (arg);
|
|
76 }
|
|
77 int
|
|
78 main()
|
|
79 {
|
|
80 try { foo ("foo", 5, 5.0); }
|
|
81 catch (A& a) { }
|
|
82 return 0;
|
|
83 }
|