1 // RUN: %clang -fsyntax-only -Xclang -verify %s 2 typedef union { 3 int *ip; 4 float *fp; 5 long *__restrict rlp; 6 void *vpa[1]; 7 } TU __attribute__((transparent_union)); 8 9 void f(TU); // expected-note{{passing argument to parameter here}} 10 g(int * ip,float * fp,char * cp)11void g(int *ip, float *fp, char *cp) { 12 f(ip); 13 f(fp); 14 f(cp); // expected-error{{incompatible type}} 15 f(0); 16 17 TU tu_ip = ip; // expected-error{{incompatible type}} 18 TU tu; 19 tu.ip = ip; 20 } 21 22 /* Test ability to redeclare a function taking a transparent_union arg 23 with various compatible and incompatible argument types. */ 24 25 void fip(TU); fip(int * i)26void fip(int *i) {} 27 28 void ffp(TU); ffp(float * f)29void ffp(float *f) {} 30 31 void flp(TU); flp(long * l)32void flp(long *l) {} 33 34 void fvp(TU); // expected-note{{previous declaration is here}} fvp(void * p)35void fvp(void *p) {} // expected-error{{conflicting types}} 36 37 void fsp(TU); // expected-note{{previous declaration is here}} fsp(short * s)38void fsp(short *s) {} // expected-error{{conflicting types}} 39 40 void fi(TU); // expected-note{{previous declaration is here}} fi(int i)41void fi(int i) {} // expected-error{{conflicting types}} 42 43 void fvpp(TU); // expected-note{{previous declaration is here}} fvpp(void ** v)44void fvpp(void **v) {} // expected-error{{conflicting types}} 45 46 /* FIXME: we'd like to just use an "int" here and align it differently 47 from the normal "int", but if we do so we lose the alignment 48 information from the typedef within the compiler. */ 49 typedef struct { int x, y; } __attribute__((aligned(8))) aligned_struct8; 50 51 typedef struct { int x, y; } __attribute__((aligned(4))) aligned_struct4; 52 typedef union { 53 aligned_struct4 s4; // expected-note{{alignment of first field}} 54 aligned_struct8 s8; // expected-warning{{alignment of field}} 55 } TU1 __attribute__((transparent_union)); 56 57 typedef union { 58 char c; // expected-note{{size of first field is 8 bits}} 59 int i; // expected-warning{{size of field}} 60 } TU2 __attribute__((transparent_union)); 61 62 typedef union { 63 float f; // expected-warning{{floating}} 64 } TU3 __attribute__((transparent_union)); 65 66 typedef union { } TU4 __attribute__((transparent_union)); // expected-warning{{field}} 67 68 typedef int int4 __attribute__((ext_vector_type(4))); 69 typedef union { 70 int4 vec; // expected-warning{{first field of a transparent union cannot have vector type 'int4'; transparent_union attribute ignored}} 71 } TU5 __attribute__((transparent_union)); 72 73 74