1/* { dg-do run } */ 2 3#include <stdarg.h> 4#include "check.h" 5 6#ifndef ALIGNMENT 7#define ALIGNMENT 64 8#endif 9 10typedef int aligned __attribute__((aligned(ALIGNMENT))); 11 12int global; 13 14void 15bar (char *p, int size) 16{ 17 __builtin_strncpy (p, "good", size); 18} 19 20class Base {}; 21 22struct A : virtual public Base 23{ 24 A() {} 25}; 26 27struct B {}; 28 29void 30test (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 63void 64foo (const char *fmt, ...) 65{ 66 va_list arg; 67 va_start (arg, fmt); 68 test (arg); 69 va_end (arg); 70} 71int 72main() 73{ 74 try { foo ("foo", 5, 5.0); } 75 catch (A& a) { } 76 return 0; 77} 78