Mercurial > projects > ldc
comparison gen/arrays.cpp @ 399:0e6b4d65d3f8
Give error messages for invalid casts.
This required passing Loc information to certain functions.
Fixes nocompile/b/bug_cgcs_354_A/B.
author | Christian Kamm <kamm incasoftware de> |
---|---|
date | Sat, 26 Jul 2008 17:19:16 +0200 |
parents | 811f82dfddbd |
children | e6e972c5cc17 |
comparison
equal
deleted
inserted
replaced
398:811f82dfddbd | 399:0e6b4d65d3f8 |
---|---|
104 } | 104 } |
105 } | 105 } |
106 | 106 |
107 ////////////////////////////////////////////////////////////////////////////////////////// | 107 ////////////////////////////////////////////////////////////////////////////////////////// |
108 | 108 |
109 void DtoArrayInit(DValue* array, DValue* value) | 109 void DtoArrayInit(Loc& loc, DValue* array, DValue* value) |
110 { | 110 { |
111 Logger::println("DtoArrayInit"); | 111 Logger::println("DtoArrayInit"); |
112 LOG_SCOPE; | 112 LOG_SCOPE; |
113 | 113 |
114 LLValue* dim = DtoArrayLen(array); | 114 LLValue* dim = DtoArrayLen(array); |
118 // give slices and complex values storage (and thus an address to pass) | 118 // give slices and complex values storage (and thus an address to pass) |
119 if (value->isSlice() || value->isComplex()) | 119 if (value->isSlice() || value->isComplex()) |
120 { | 120 { |
121 val = new llvm::AllocaInst(DtoType(value->getType()), ".tmpparam", gIR->topallocapoint()); | 121 val = new llvm::AllocaInst(DtoType(value->getType()), ".tmpparam", gIR->topallocapoint()); |
122 DVarValue lval(value->getType(), val, true); | 122 DVarValue lval(value->getType(), val, true); |
123 DtoAssign(&lval, value); | 123 DtoAssign(loc, &lval, value); |
124 } | 124 } |
125 else | 125 else |
126 { | 126 { |
127 val = value->getRVal(); | 127 val = value->getRVal(); |
128 } | 128 } |
529 DValue* dptr = new DVarValue(exp->type, ptr, true); | 529 DValue* dptr = new DVarValue(exp->type, ptr, true); |
530 | 530 |
531 DValue* e = exp->toElem(gIR); | 531 DValue* e = exp->toElem(gIR); |
532 | 532 |
533 if (!e->inPlace()) | 533 if (!e->inPlace()) |
534 DtoAssign(dptr, e); | 534 DtoAssign(exp->loc, dptr, e); |
535 | 535 |
536 return slice; | 536 return slice; |
537 } | 537 } |
538 | 538 |
539 ////////////////////////////////////////////////////////////////////////////////////////// | 539 ////////////////////////////////////////////////////////////////////////////////////////// |
631 DValue* lenval = new DImValue(Type::tsize_t, res); | 631 DValue* lenval = new DImValue(Type::tsize_t, res); |
632 DSliceValue* slice = DtoNewDynArray(type, lenval, false); | 632 DSliceValue* slice = DtoNewDynArray(type, lenval, false); |
633 LLValue* mem = slice->ptr; | 633 LLValue* mem = slice->ptr; |
634 | 634 |
635 DVarValue* memval = new DVarValue(e1->getType(), mem, true); | 635 DVarValue* memval = new DVarValue(e1->getType(), mem, true); |
636 DtoAssign(memval, e1); | 636 DtoAssign(exp1->loc, memval, e1); |
637 | 637 |
638 src1 = DtoArrayPtr(e2); | 638 src1 = DtoArrayPtr(e2); |
639 | 639 |
640 mem = gIR->ir->CreateGEP(mem,DtoConstSize_t(1),"tmp"); | 640 mem = gIR->ir->CreateGEP(mem,DtoConstSize_t(1),"tmp"); |
641 | 641 |
662 LLValue* bytelen = gIR->ir->CreateMul(len1, elemSize, "tmp"); | 662 LLValue* bytelen = gIR->ir->CreateMul(len1, elemSize, "tmp"); |
663 DtoMemCpy(mem,src1,bytelen); | 663 DtoMemCpy(mem,src1,bytelen); |
664 | 664 |
665 mem = gIR->ir->CreateGEP(mem,len1,"tmp"); | 665 mem = gIR->ir->CreateGEP(mem,len1,"tmp"); |
666 DVarValue* memval = new DVarValue(e2->getType(), mem, true); | 666 DVarValue* memval = new DVarValue(e2->getType(), mem, true); |
667 DtoAssign(memval, e2); | 667 DtoAssign(exp1->loc, memval, e2); |
668 | 668 |
669 return slice; | 669 return slice; |
670 } | 670 } |
671 } | 671 } |
672 | 672 |