131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh/* { dg-do run } */ 231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#include <stdarg.h> 431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#include "check.h" 531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#ifndef ALIGNMENT 731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#define ALIGNMENT 64 831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#endif 931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 1031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehtypedef int aligned __attribute__((aligned(ALIGNMENT))); 1131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 1231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehint global; 1331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 1431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehvoid 1531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehbar (char *p, int size) 1631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{ 1731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh __builtin_strncpy (p, "good", size); 1831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh} 1931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 2031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehclass Base {}; 2131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 2231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehstruct A : virtual public Base 2331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{ 2431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh A() {} 2531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh}; 2631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 2731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehstruct B {}; 2831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 2931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehvoid 3031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehfoo (const char *fmt, ...) throw (B,A) 3131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{ 3231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh va_list arg; 3331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh char *p; 3431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh aligned i; 3531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh int size; 3631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh double x; 3731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 3831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh va_start (arg, fmt); 3931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh size = va_arg (arg, int); 4031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh if (size != 5) 4131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh abort (); 4231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh p = (char *) __builtin_alloca (size + 1); 4331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 4431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh x = va_arg (arg, double); 4531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh if (x != 5.0) 4631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh abort (); 4731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 4831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh bar (p, size); 4931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh if (__builtin_strncmp (p, "good", size) != 0) 5031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh { 5131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#ifdef DEBUG 5231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh p[size] = '\0'; 5331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh printf ("Failed: %s != good\n", p); 5431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#endif 5531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh abort (); 5631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh } 5731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 5831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh if (check_int (&i, __alignof__(i)) != i) 5931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh abort (); 6031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 6131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh throw A(); 6231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 6331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh va_end (arg); 6431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh} 6531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 6631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehint 6731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehmain() 6831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{ 6931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh try { foo ("foo", 5, 5.0); } 7031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh catch (A& a) { } 7131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh return 0; 7231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh} 73