comparison gen/statements.cpp @ 109:5ab8e92611f9 trunk

[svn r113] Added initial support for associative arrays (AAs). Fixed some problems with the string runtime support functions. Fixed initialization of array of structs. Fixed slice assignment where LHS is slice but RHS is dynamic array. Fixed problems with result of assignment expressions. Fixed foreach problems with key type mismatches.
author lindquist
date Wed, 21 Nov 2007 04:13:15 +0100
parents 288fe1029e1f
children 9c79b61fb638
comparison
equal deleted inserted replaced
108:288fe1029e1f 109:5ab8e92611f9
126 { 126 {
127 static int esi = 0; 127 static int esi = 0;
128 Logger::println("ExpStatement::toIR(%d): %s", esi++, toChars()); 128 Logger::println("ExpStatement::toIR(%d): %s", esi++, toChars());
129 LOG_SCOPE; 129 LOG_SCOPE;
130 130
131 // if (global.params.symdebug) 131 if (global.params.symdebug)
132 // DtoDwarfStopPoint(loc.linnum); 132 DtoDwarfStopPoint(loc.linnum);
133 133
134 if (exp != 0) { 134 if (exp != 0) {
135 elem* e = exp->toElem(p); 135 elem* e = exp->toElem(p);
136 delete e; 136 delete e;
137 } 137 }
727 } 727 }
728 } 728 }
729 else 729 else
730 { 730 {
731 assert(0 && "aggregate type is not Tarray or Tsarray"); 731 assert(0 && "aggregate type is not Tarray or Tsarray");
732 }
733
734 if (niters->getType() != keytype)
735 {
736 size_t sz1 = gTargetData->getTypeSize(niters->getType());
737 size_t sz2 = gTargetData->getTypeSize(keytype);
738 if (sz1 < sz2)
739 niters = gIR->ir->CreateZExt(niters, keytype, "foreachtrunckey");
740 else if (sz1 > sz2)
741 niters = gIR->ir->CreateTrunc(niters, keytype, "foreachtrunckey");
742 else
743 niters = gIR->ir->CreateBitCast(niters, keytype, "foreachtrunckey");
732 } 744 }
733 745
734 llvm::Constant* delta = 0; 746 llvm::Constant* delta = 0;
735 if (op == TOKforeach) { 747 if (op == TOKforeach) {
736 new llvm::StoreInst(zerokey, keyvar, p->scopebb()); 748 new llvm::StoreInst(zerokey, keyvar, p->scopebb());