/* { dg-do run } */ /* { dg-options "-O1" } */ /* { dg-require-effective-target int32plus } */ struct S1 { unsigned int _0; unsigned int _1; } ; struct S2 { struct S1 _s1; unsigned long _x2; } ; struct ufld_type1 { unsigned int _u1t; struct S2 _s2; } ; struct ufld_type2 { unsigned int _u2t; struct S1 _s1; } ; struct parm_type { union { struct ufld_type1 var_1; struct ufld_type2 var_2; } U; }; struct parm_type bad_function( struct parm_type arg0 ) { struct parm_type rv; struct S2 var4; switch( arg0.U.var_2._u2t ) { case 4294967041: var4._s1 = arg0.U.var_1._s2._s1; rv.U.var_1._u1t = 4294967041; rv.U.var_1._s2 = var4; break; case 4294967043: rv.U.var_2._u2t = 4294967043; rv.U.var_2._s1 = arg0.U.var_2._s1; break; default: break; } return rv; } int main() { struct parm_type val; struct parm_type out; val.U.var_2._u2t = 4294967043; val.U.var_2._s1._0 = 0x01010101; val.U.var_2._s1._1 = 0x02020202; out = bad_function(val); if (val.U.var_2._u2t != 4294967043) __builtin_abort (); if (out.U.var_2._s1._0 != 0x01010101) __builtin_abort (); if (val.U.var_2._s1._1 != 0x02020202 ) __builtin_abort (); return 0; }