Changeset 252

Show
Ignore:
Timestamp:
11/18/09 04:52:26 (2 years ago)
Author:
walter
Message:

improved flexibility of concatenation

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/expression.c

    r251 r252  
    49974997//printf("targ: %s\n", targ->toChars()); 
    49984998//printf("tspec: %s\n", tspec->toChars()); 
    4999 //printf("test1 %d\n", m); 
    50004999    if (m == MATCHnomatch || 
    50015000        (m != MATCHexact && tok == TOKequal)) 
     
    94739472    e2->type->print(); 
    94749473#endif 
     9474    Type *tb1next = tb1->nextOf(); 
     9475    Type *tb2next = tb2->nextOf(); 
     9476 
    94759477    if ((tb1->ty == Tsarray || tb1->ty == Tarray) && 
    9476         e2->type->implicitConvTo(tb1->nextOf()) >= MATCHconst) 
    9477     { 
    9478         type = tb1->nextOf()->arrayOf(); 
     9478        e2->implicitConvTo(tb1next) >= MATCHconvert) 
     9479    { 
     9480        e2 = e2->implicitCastTo(sc, tb1next); 
     9481        type = tb1next->arrayOf(); 
    94799482        if (tb2->ty == Tarray) 
    94809483        {   // Make e2 into [e2] 
     
    94859488    } 
    94869489    else if ((tb2->ty == Tsarray || tb2->ty == Tarray) && 
    9487         e1->type->implicitConvTo(tb2->nextOf()) >= MATCHconst) 
    9488     { 
    9489         type = tb2->nextOf()->arrayOf(); 
     9490        e1->implicitConvTo(tb2next) >= MATCHconvert) 
     9491    { 
     9492        e1 = e1->implicitCastTo(sc, tb2next); 
     9493        type = tb2next->arrayOf(); 
    94909494        if (tb1->ty == Tarray) 
    94919495        {   // Make e1 into [e1] 
     
    94989502    if ((tb1->ty == Tsarray || tb1->ty == Tarray) && 
    94999503        (tb2->ty == Tsarray || tb2->ty == Tarray) && 
    9500         (tb1->nextOf()->mod || tb2->nextOf()->mod) && 
    9501         (tb1->nextOf()->mod != tb2->nextOf()->mod) 
     9504        (tb1next->mod || tb2next->mod) && 
     9505        (tb1next->mod != tb2next->mod) 
    95029506       ) 
    95039507    { 
    9504         Type *t1 = tb1->nextOf()->mutableOf()->constOf()->arrayOf(); 
    9505         Type *t2 = tb2->nextOf()->mutableOf()->constOf()->arrayOf(); 
     9508        Type *t1 = tb1next->mutableOf()->constOf()->arrayOf(); 
     9509        Type *t2 = tb2next->mutableOf()->constOf()->arrayOf(); 
    95069510        if (e1->op == TOKstring && !((StringExp *)e1)->committed) 
    95079511        e1->type = t1; 
     
    95209524    if (tb->ty == Tsarray) 
    95219525        type = tb->nextOf()->arrayOf(); 
    9522     if (type->ty == Tarray && tb1->nextOf() && tb2->nextOf() && 
    9523         tb1->nextOf()->mod != tb2->nextOf()->mod) 
     9526    if (type->ty == Tarray && tb1next && tb2next && 
     9527        tb1next->mod != tb2next->mod) 
    95249528    { 
    95259529        type = type->nextOf()->toHeadMutable()->arrayOf(); 
     
    95459549        error("Can only concatenate arrays, not (%s ~ %s)", 
    95469550        e1->type->toChars(), e2->type->toChars()); 
    9547         type = Type::tint32; 
    9548         e = this; 
     9551        return new ErrorExp(); 
    95499552    } 
    95509553    e->type = e->type->semantic(loc, sc);