Wiki Roadmap Timeline Tickets New Ticket Source Search Help / Guide About Trac Login

Changeset 1605:1d5721f9ae18

Show
Ignore:
Timestamp:
01/06/10 13:18:19 (2 years ago)
Author:
Leandro Lucarella <llucax@gmail.com>
branch:
default
Message:

[WIP] Merge DMD r251: bugzilla 111 (appending a dchar to a char[])
This patch needs some work in the code generation, because of the runtime
changes (functions "_d_arrayappendcd" and "_d_arrayappendwd" are added).

This doesn't affect existing code though, it just makes with patch
a little useless, because something like this:

char [] s;
s ~= '\u6211';

That failed to compile with a nice error message previously to this
change, now fails with and ugly error message (a failed assertion).

Apparently there is a regression introduced by this patch too, when
compiling Dil I get this assertion message:

ldc: /home/luca/tesis/ldc/gen/statements.cpp:132: virtual void ReturnStatement::toIR(IRState*): Assertion `p->topfunc()->getReturnType() == llvm::Type::getVoidTy(gIR->context())' failed.
0 ldc 0x08a91628

Thank god we have bisecting capabilities in VCSs now ;)
---

dmd/expression.c | 47 +++++++++++++++++++++++++++++++++++++++++------
1 files changed, 41 insertions(+), 6 deletions(-)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • dmd/expression.c

    Revision 1604:2afcaab30a6a Revision 1605:1d5721f9ae18
    8418    Type *tb1 = e1->type->toBasetype(); 8418    Type *tb1 = e1->type->toBasetype(); 
    8419    Type *tb2 = e2->type->toBasetype(); 8419    Type *tb2 = e2->type->toBasetype(); 
    8420 8420 
    8421    e2->rvalue(); 8421    e2->rvalue(); 
    8422 8422 
      8423    Type *tb1next = tb1->nextOf(); 
      8424 
    8423    if ((tb1->ty == Tarray) && 8425    if ((tb1->ty == Tarray) && 
    8424    (tb2->ty == Tarray || tb2->ty == Tsarray) && 8426    (tb2->ty == Tarray || tb2->ty == Tsarray) && 
    8425    e2->implicitConvTo(e1->type)  8427     (e2->implicitConvTo(e1->type) 
    8426    //e1->type->next->equals(e2->type->next)  8428 #if DMDV2 
       8429      || tb2->nextOf()->implicitConvTo(tb1next) 
       8430 #endif 
       8431     ) 
    8427       ) 8432       ) 
    8428    {   // Append array 8433    {   // Append array 
    8429    e2 = e2->castTo(sc, e1->type); 8434    e2 = e2->castTo(sc, e1->type); 
    8430    type = e1->type; 8435    type = e1->type; 
    8431    e = this; 8436    e = this; 
    8432    } 8437    } 
    8433    else if ((tb1->ty == Tarray) && 8438    else if ((tb1->ty == Tarray) && 
    8434    e2->implicitConvTo(tb1->nextOf()8439    e2->implicitConvTo(tb1next
    8435       ) 8440       ) 
    8436    {   // Append element 8441    {   // Append element 
    8437    e2 = e2->castTo(sc, tb1->nextOf()); 8442    e2 = e2->castTo(sc, tb1next); 
    8438    type = e1->type; 8443    type = e1->type; 
    8439    e = this; 8444    e = this; 
    8440    } 8445    } 
      8446    else if (tb1->ty == Tarray && 
      8447    (tb1next->ty == Tchar || tb1next->ty == Twchar) && 
      8448    e2->implicitConvTo(Type::tdchar) 
      8449       ) 
      8450    {   // Append dchar to char[] or wchar[] 
      8451    e2 = e2->castTo(sc, Type::tdchar); 
      8452    type = e1->type; 
      8453    e = this; 
      8454 
      8455    /* Do not allow appending wchar to char[] because if wchar happens 
      8456     * to be a surrogate pair, nothing good can result. 
      8457     */ 
      8458    } 
    8441    else 8459    else 
    8442    { 8460    { 
    8443    error("cannot append type %s to type %s", tb2->toChars(), tb1->toChars()); 8461    error("cannot append type %s to type %s", tb2->toChars(), tb1->toChars()); 
    8444    type = Type::tint32; 8462    e = new ErrorExp(); 
    8445    e = this;   
    8446    } 8463    } 
    8447    return e; 8464    return e; 
    8448} 8465} 
    8449 8466 
    8450/************************************************************/ 8467/************************************************************/ 
      
    8461    e2 = resolveProperties(sc, e2); 8478    e2 = resolveProperties(sc, e2); 
    8462 8479 
    8463    e = op_overload(sc); 8480    e = op_overload(sc); 
    8464    if (e) 8481    if (e) 
    8465    return e; 8482    return e; 
      8483 
      8484#if DMDV2 
      8485    if (e1->op == TOKarraylength) 
      8486    { 
      8487    e = ArrayLengthExp::rewriteOpAssign(this); 
      8488    e = e->semantic(sc); 
      8489    return e; 
      8490    } 
      8491#endif 
    8466 8492 
    8467    if (e1->op == TOKslice) 8493    if (e1->op == TOKslice) 
    8468    {   // T[] -= ... 8494    {   // T[] -= ... 
    8469    typeCombine(sc); 8495    typeCombine(sc); 
    8470    type = e1->type; 8496    type = e1->type; 
      
    8528    e2 = resolveProperties(sc, e2); 8554    e2 = resolveProperties(sc, e2); 
    8529 8555 
    8530    e = op_overload(sc); 8556    e = op_overload(sc); 
    8531    if (e) 8557    if (e) 
    8532    return e; 8558    return e; 
      8559 
      8560#if DMDV2 
      8561    if (e1->op == TOKarraylength) 
      8562    { 
      8563    e = ArrayLengthExp::rewriteOpAssign(this); 
      8564    e = e->semantic(sc); 
      8565    return e; 
      8566    } 
      8567#endif 
    8533 8568 
    8534    if (e1->op == TOKslice) 8569    if (e1->op == TOKslice) 
    8535    {   // T[] -= ... 8570    {   // T[] -= ... 
    8536    typeCombine(sc); 8571    typeCombine(sc); 
    8537    type = e1->type; 8572    type = e1->type; 
Copyright © 2008, LDC Development Team.