void ClassNum( stack_entry *entry ) { unsigned long val; entry->info.kind = TK_INTEGER; entry->flags &= ~SF_FORM_MASK; entry->flags |= SF_CONST; if( I64Test( &entry->v.sint ) < 0 ) { /* A bit backwards - if the top bit is on, it won't fit in in 63 bits. */ entry->info.modifier = TM_UNSIGNED; entry->info.size = sizeof( unsigned_64 ); return; } if( !U64IsU32( entry->v.uint ) ) { entry->info.modifier = TM_SIGNED; entry->info.size = sizeof( signed_64 ); return; } val = U32FetchTrunc( entry->v.uint ); if( val > 0x7fffffff ) { entry->info.modifier = TM_UNSIGNED; entry->info.size = sizeof( unsigned_32 ); } else if( DefaultSize( DK_INT ) > 2 ) { entry->info.modifier = TM_SIGNED; entry->info.size = sizeof( signed_32 ); } else if( val > 0xffff ) { entry->info.modifier = TM_SIGNED; entry->info.size = sizeof( signed_32 ); } else if( val > 0x7fff ) { entry->info.modifier = TM_UNSIGNED; entry->info.size = sizeof( unsigned_16 ); } else { entry->info.modifier = TM_SIGNED; entry->info.size = sizeof( signed_16 ); } }
static void CaseStmt( void ) { const_val val; NextToken(); if( SwitchStack ) { if( ConstExprAndType( &val ) ) { if( ( val.type == TYPE_ULONG64 ) && !U64IsU32( val.value ) ) { CErr1( ERR_CONSTANT_TOO_BIG ); } else if( ( val.type == TYPE_LONG64 ) && !I64IsI32( val.value ) ) { CErr1( ERR_CONSTANT_TOO_BIG ); } AddCaseLabel( U32FetchTrunc( val.value) ); } MustRecog( T_COLON ); if( CurToken == T_RIGHT_BRACE ) { CErr1( ERR_STMT_REQUIRED_AFTER_CASE ); } } else { CErr1( ERR_MISPLACED_CASE ); ConstExprAndType( &val ); /* grab constant expression */ MustRecog( T_COLON ); } }