diff options
Diffstat (limited to 'gcc/testsuite/g++.dg/opt/20050511-1.C')
-rw-r--r-- | gcc/testsuite/g++.dg/opt/20050511-1.C | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/gcc/testsuite/g++.dg/opt/20050511-1.C b/gcc/testsuite/g++.dg/opt/20050511-1.C new file mode 100644 index 000000000..a8929030a --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/20050511-1.C @@ -0,0 +1,70 @@ +/* { dg-do run } */ +/* { dg-options "-w" } */ +/* { dg-options "-O3 -w" { target powerpc*-*-* } } */ +#include <stdio.h> +#include <stdlib.h> + +// The VxWorks kernel headers define their own UINT32 +#if defined __vxworks && !defined __RTP__ +#define UINT32 my_UINT32 +#endif + +typedef signed short SINT16 ; +typedef unsigned long UINT32 ; +typedef unsigned int UINT ; + +class A +{ +public: + union + { + SINT16 xy[2]; + UINT32 abXY; + }; + bool operator==(const A& other) const {return abXY == other.abXY;} + bool operator!=(const A& other) const {return abXY != other.abXY;} +}; + +template <int size> struct pArray { unsigned char u08[16*(((size*1)+15)/16)] __attribute__ ((aligned(16))); }; + +struct B +{ + union { + A mvL[2]; + pArray<1> xyz; + }; +} ; + +typedef struct +{ + UINT w; + B b; + +}C; + + +UINT32 bar (const C * sPtr) +{ + UINT w = sPtr->w; + A a; + + a.xy[0] = sPtr->b.mvL[w].xy[0]<<2; + a.xy[1] = sPtr->b.mvL[w].xy[1]<<2; + + if (a.xy[0] != ((SINT16) 0xffff << 2)) + abort (); +} + +int main() +{ + A a; + C c; + a.xy[0] = 0xffff; + a.xy[1] = 0xffff; + c.w=0; + c.b.mvL[0].xy[0] = a.xy[0]; + c.b.mvL[0].xy[1] = a.xy[1]; + + bar (&c); +} + |