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 Hsiehtest (va_list arg) throw (B,A) 3131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{ 3231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh char *p; 3331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh aligned i; 3431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh int size; 3531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh double x; 3631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 3731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh size = va_arg (arg, int); 3831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh if (size != 5) 3931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh abort (); 4031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 4131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh p = (char *) __builtin_alloca (size + 1); 4231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 4331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh x = va_arg (arg, double); 4431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh if (x != 5.0) 4531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh abort (); 4631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 4731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh bar (p, size); 4831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh if (__builtin_strncmp (p, "good", size) != 0) 4931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh { 5031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#ifdef DEBUG 5131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh p[size] = '\0'; 5231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh printf ("Failed: %s != good\n", p); 5331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh#endif 5431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh abort (); 5531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh } 5631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 5731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh if (check_int (&i, __alignof__(i)) != i) 5831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh abort (); 5931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 6031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh throw A(); 6131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh} 6231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh 6331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehvoid 6431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehfoo (const char *fmt, ...) 6531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{ 6631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh va_list arg; 6731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh va_start (arg, fmt); 6831ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh test (arg); 6931ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh va_end (arg); 7031ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh} 7131ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehint 7231ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsiehmain() 7331ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh{ 7431ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh try { foo ("foo", 5, 5.0); } 7531ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh catch (A& a) { } 7631ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh return 0; 7731ad4de047c50cddfc3072be3a82232c53f1ca2dAndrew Hsieh} 78