Note: This website is archived. For up-to-date information about D projects and development, please visit wiki.dlang.org.

Changeset 296

Show
Ignore:
Timestamp:
12/15/09 23:54:38 (15 years ago)
Author:
walter
Message:

bugzilla 3617 CTFE: wrong code for if(x) where x is int or smaller

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/dmd-1.x/src/expression.c

    r278 r296  
    14721472    toInteger(); 
    14731473    t = type->toBasetype(); 
    14741474    if (t->ty == Tuns64) 
    14751475    return (real_t)(d_uns64)value; 
    14761476    else 
    14771477    return (real_t)(d_int64)value; 
    14781478} 
    14791479 
    14801480real_t IntegerExp::toImaginary() 
    14811481{ 
    14821482    return (real_t) 0; 
    14831483} 
    14841484 
    14851485complex_t IntegerExp::toComplex() 
    14861486{ 
    14871487    return toReal(); 
    14881488} 
    14891489 
    14901490int IntegerExp::isBool(int result) 
    14911491{ 
    1492     return result ? value != 0 : value == 0; 
     1492    int r = toInteger() != 0; 
     1493    return result ? r : !r; 
    14931494} 
    14941495 
    14951496Expression *IntegerExp::semantic(Scope *sc) 
    14961497{ 
    14971498    if (!type) 
    14981499    { 
    14991500    // Determine what the type of this number is 
    15001501    dinteger_t number = value; 
    15011502 
    15021503    if (number & 0x8000000000000000LL) 
    15031504        type = Type::tuns64; 
    15041505    else if (number & 0xFFFFFFFF80000000LL) 
    15051506        type = Type::tint64; 
    15061507    else 
    15071508        type = Type::tint32; 
    15081509    } 
    15091510    else 
    15101511    {   if (!type->deco) 
    15111512        type = type->semantic(loc, sc); 
    15121513    } 
  • trunk/src/expression.c

    r280 r296  
    15561556    toInteger(); 
    15571557    t = type->toBasetype(); 
    15581558    if (t->ty == Tuns64) 
    15591559    return (real_t)(d_uns64)value; 
    15601560    else 
    15611561    return (real_t)(d_int64)value; 
    15621562} 
    15631563 
    15641564real_t IntegerExp::toImaginary() 
    15651565{ 
    15661566    return (real_t) 0; 
    15671567} 
    15681568 
    15691569complex_t IntegerExp::toComplex() 
    15701570{ 
    15711571    return toReal(); 
    15721572} 
    15731573 
    15741574int IntegerExp::isBool(int result) 
    15751575{ 
    1576     return result ? value != 0 : value == 0; 
     1576    int r = toInteger() != 0; 
     1577    return result ? r : !r; 
    15771578} 
    15781579 
    15791580Expression *IntegerExp::semantic(Scope *sc) 
    15801581{ 
    15811582    if (!type) 
    15821583    { 
    15831584    // Determine what the type of this number is 
    15841585    dinteger_t number = value; 
    15851586 
    15861587    if (number & 0x8000000000000000LL) 
    15871588        type = Type::tuns64; 
    15881589    else if (number & 0xFFFFFFFF80000000LL) 
    15891590        type = Type::tint64; 
    15901591    else 
    15911592        type = Type::tint32; 
    15921593    } 
    15931594    else 
    15941595    {   if (!type->deco) 
    15951596        type = type->semantic(loc, sc); 
    15961597    }