Changeset 380

Show
Ignore:
Timestamp:
02/12/10 04:35:06 (7 months ago)
Author:
walter
Message:

bugzilla 3736 corrupted struct returned by function with optimizations (-O)

Files:

Legend:

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

    r288 r380  
    11// Copyright (C) 1986-1997 by Symantec 
    2 // Copyright (C) 2000-2009 by Digital Mars 
     2// Copyright (C) 2000-2010 by Digital Mars 
    33// All Rights Reserved 
    44// http://www.digitalmars.com 
    55// Written by Walter Bright 
    66/* 
    77 * This source file is made available for personal use 
     
    735735             //|| (bc2 == BCret && b3->BC == BCret) 
    736736            ) 
    737737        {   elem *e; 
    738738 
    739739            if (PARSER) 
    740             {   type *t; 
    741  
    742             t = (bc2 == BCretexp) ? b2->Belem->ET : tsvoid; 
     740            { 
     741            type *t = (bc2 == BCretexp) ? b2->Belem->ET : tsvoid; 
    743742            e = el_bint(OPcolon2,t,b2->Belem,b3->Belem); 
    744743            b->Belem = el_bint(OPcond,t,b->Belem,e); 
    745744            } 
    746745            else 
    747             {   tym_t ty; 
    748  
     746            { 
    749747            if (EOP(b3->Belem)) 
    750748                continue; 
    751             ty = (bc2 == BCretexp) ? b2->Belem->Ety : TYvoid; 
     749            tym_t ty = (bc2 == BCretexp) ? b2->Belem->Ety : TYvoid; 
    752750            e = el_bin(OPcolon2,ty,b2->Belem,b3->Belem); 
    753751            b->Belem = el_bin(OPcond,ty,b->Belem,e); 
    754752            } 
    755753            b->BC = bc2; 
     754            b->Belem->Enumbytes = b2->Belem->Enumbytes; 
    756755            b2->Belem = NULL; 
    757756            b3->Belem = NULL; 
    758757            list_free(&b->Bsucc,FPNULL); 
    759758            list_subtract(&(b2->Bpred),b); 
    760759            list_subtract(&(b3->Bpred),b); 
     
    791790                if (EOP(b3->Belem)) 
    792791                    continue; 
    793792                e = el_bin(OPcolon2,b2->Belem->Ety, 
    794793                    b2->Belem,b3->Belem); 
    795794                e = el_bin(OPcond,e->Ety,b->Belem,e); 
     795                e->Enumbytes = b2->Belem->Enumbytes; 
    796796                } 
    797797                else 
    798798                { 
    799799                op = OPandand; 
    800800                e = el_bin(op,TYint,b->Belem,b2->Belem); 
  • branches/dmd-1.x/src/backend/cgelem.c

    r289 r380  
    11// Copyright (C) 1985-1998 by Symantec 
    2 // Copyright (C) 2000-2009 by Digital Mars 
     2// Copyright (C) 2000-2010 by Digital Mars 
    33// All Rights Reserved 
    44// http://www.digitalmars.com 
    55// Written by Walter Bright 
    66/* 
    77 * This source file is made available for personal use 
     
    43724372 
    43734373      if (!OTrtol(op) && op != OPparam && op != OPcolon && op != OPcolon2 && 
    43744374          e1->Eoper == OPcomma) 
    43754375      { // Convert ((a,b) op c) to (a,(b op c)) 
    43764376        e1->Ety = e->Ety; 
     4377        e1->Enumbytes = e->Enumbytes; 
    43774378        e->E1 = e1->E2; 
    43784379        e1->E2 = e; 
    43794380        e = e1; 
    43804381        goto beg; 
    43814382      } 
  • trunk/src/backend/blockopt.c

    r288 r380  
    11// Copyright (C) 1986-1997 by Symantec 
    2 // Copyright (C) 2000-2009 by Digital Mars 
     2// Copyright (C) 2000-2010 by Digital Mars 
    33// All Rights Reserved 
    44// http://www.digitalmars.com 
    55// Written by Walter Bright 
    66/* 
    77 * This source file is made available for personal use 
     
    735735             //|| (bc2 == BCret && b3->BC == BCret) 
    736736            ) 
    737737        {   elem *e; 
    738738 
    739739            if (PARSER) 
    740             {   type *t; 
    741  
    742             t = (bc2 == BCretexp) ? b2->Belem->ET : tsvoid; 
     740            { 
     741            type *t = (bc2 == BCretexp) ? b2->Belem->ET : tsvoid; 
    743742            e = el_bint(OPcolon2,t,b2->Belem,b3->Belem); 
    744743            b->Belem = el_bint(OPcond,t,b->Belem,e); 
    745744            } 
    746745            else 
    747             {   tym_t ty; 
    748  
     746            { 
    749747            if (EOP(b3->Belem)) 
    750748                continue; 
    751             ty = (bc2 == BCretexp) ? b2->Belem->Ety : TYvoid; 
     749            tym_t ty = (bc2 == BCretexp) ? b2->Belem->Ety : TYvoid; 
    752750            e = el_bin(OPcolon2,ty,b2->Belem,b3->Belem); 
    753751            b->Belem = el_bin(OPcond,ty,b->Belem,e); 
    754752            } 
    755753            b->BC = bc2; 
     754            b->Belem->Enumbytes = b2->Belem->Enumbytes; 
    756755            b2->Belem = NULL; 
    757756            b3->Belem = NULL; 
    758757            list_free(&b->Bsucc,FPNULL); 
    759758            list_subtract(&(b2->Bpred),b); 
    760759            list_subtract(&(b3->Bpred),b); 
     
    791790                if (EOP(b3->Belem)) 
    792791                    continue; 
    793792                e = el_bin(OPcolon2,b2->Belem->Ety, 
    794793                    b2->Belem,b3->Belem); 
    795794                e = el_bin(OPcond,e->Ety,b->Belem,e); 
     795                e->Enumbytes = b2->Belem->Enumbytes; 
    796796                } 
    797797                else 
    798798                { 
    799799                op = OPandand; 
    800800                e = el_bin(op,TYint,b->Belem,b2->Belem); 
  • trunk/src/backend/cgelem.c

    r289 r380  
    11// Copyright (C) 1985-1998 by Symantec 
    2 // Copyright (C) 2000-2009 by Digital Mars 
     2// Copyright (C) 2000-2010 by Digital Mars 
    33// All Rights Reserved 
    44// http://www.digitalmars.com 
    55// Written by Walter Bright 
    66/* 
    77 * This source file is made available for personal use 
     
    43724372 
    43734373      if (!OTrtol(op) && op != OPparam && op != OPcolon && op != OPcolon2 && 
    43744374          e1->Eoper == OPcomma) 
    43754375      { // Convert ((a,b) op c) to (a,(b op c)) 
    43764376        e1->Ety = e->Ety; 
     4377        e1->Enumbytes = e->Enumbytes; 
    43774378        e->E1 = e1->E2; 
    43784379        e1->E2 = e; 
    43794380        e = e1; 
    43804381        goto beg; 
    43814382      }