| /* { dg-do run } */ |
| /* { dg-options "-O2 --param max-aliased-vops=20" } */ |
| |
| extern "C" void abort (void); |
| enum SbxDataType { SbxINTEGER, SbxDECIMAL, SbxBYREF = 0x4000 }; |
| struct SbxValues { |
| union { |
| float nSingle; |
| float* pSingle; |
| }; |
| SbxDataType eType; |
| }; |
| static bool ImpPutDoubleFoo( SbxValues* p) |
| { |
| bool bRet = false; |
| SbxValues aTmp; |
| int count = 0; |
| start: |
| switch( p->eType ) { |
| case SbxINTEGER: |
| if (count++ > 0) |
| abort (); |
| aTmp.pSingle = &p->nSingle; goto direct; |
| case SbxBYREF | SbxDECIMAL: |
| bRet = false; |
| break; |
| direct: |
| aTmp.eType = SbxDataType( p->eType | SbxBYREF ); |
| p = &aTmp; goto start; |
| case SbxBYREF | SbxINTEGER: |
| break; |
| default: |
| bRet =true; |
| } |
| return bRet; |
| } |
| |
| int main( int argc, char** argv ) |
| { |
| SbxValues aTmp; |
| aTmp.eType = SbxINTEGER; |
| if ( ImpPutDoubleFoo( &aTmp ) ) |
| abort (); |
| return 0; |
| } |