1 /* { dg-do run } */ 2 /* { dg-options "-O2" } */ 3 4 extern "C" void abort (void); 5 enum SbxDataType { SbxINTEGER, SbxDECIMAL, SbxBYREF = 0x4000 }; 6 struct SbxValues { 7 union { 8 float nSingle; 9 float* pSingle; 10 }; 11 SbxDataType eType; 12 }; ImpPutDoubleFoo(SbxValues * p)13static bool ImpPutDoubleFoo( SbxValues* p) 14 { 15 bool bRet = false; 16 SbxValues aTmp; 17 int count = 0; 18 start: 19 switch( p->eType ) { 20 case SbxINTEGER: 21 if (count++ > 0) 22 abort (); 23 aTmp.pSingle = &p->nSingle; goto direct; 24 case SbxBYREF | SbxDECIMAL: 25 bRet = false; 26 break; 27 direct: 28 aTmp.eType = SbxDataType( p->eType | SbxBYREF ); 29 p = &aTmp; goto start; 30 case SbxBYREF | SbxINTEGER: 31 break; 32 default: 33 bRet =true; 34 } 35 return bRet; 36 } 37 main(int argc,char ** argv)38int main( int argc, char** argv ) 39 { 40 SbxValues aTmp; 41 aTmp.eType = SbxINTEGER; 42 if ( ImpPutDoubleFoo( &aTmp ) ) 43 abort (); 44 return 0; 45 } 46