| /* { 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 |
| #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 (); |
| |
| return 0; |
| } |
| |
| 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); |
| } |
| |