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 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 { 24 A() {} 25 }; 26 27 struct B {}; 28 29 void 30 test (va_list arg) throw (B,A) 31 { 32 char *p; 33 aligned i; 34 int size; 35 double x; 36 37 size = va_arg (arg, int); 38 if (size != 5) 39 abort (); 40 41 p = (char *) __builtin_alloca (size + 1); 42 43 x = va_arg (arg, double); 44 if (x != 5.0) 45 abort (); 46 47 bar (p, size); 48 if (__builtin_strncmp (p, "good", size) != 0) 49 { 50 #ifdef DEBUG 51 p[size] = '\0'; 52 printf ("Failed: %s != good\n", p); 53 #endif 54 abort (); 55 } 56 57 if (check_int (&i, __alignof__(i)) != i) 58 abort (); 59 60 throw A(); 61 } 62 63 void 64 foo (const char *fmt, ...) 65 { 66 va_list arg; 67 va_start (arg, fmt); 68 test (arg); 69 va_end (arg); 70 } 71 int 72 main() 73 { 74 try { foo ("foo", 5, 5.0); } 75 catch (A& a) { } 76 return 0; 77 } 78