Mercurial > projects > ldc
diff gen/toir.cpp @ 1211:50dc0db06238
Merge
author | Frits van Bommel <fvbommel wxs.nl> |
---|---|
date | Sun, 12 Apr 2009 22:22:15 +0200 |
parents | 83d3b25c2213 7c7072437a89 |
children | 837f48560863 79758fd2f48a |
line wrap: on
line diff
--- a/gen/toir.cpp Sun Apr 12 21:56:43 2009 +0200 +++ b/gen/toir.cpp Sun Apr 12 22:22:15 2009 +0200 @@ -596,6 +596,23 @@ ////////////////////////////////////////////////////////////////////////////////////////// +static void errorOnIllegalArrayOp(Expression* base, Expression* e1, Expression* e2) +{ + Type* t1 = e1->type->toBasetype(); + Type* t2 = e2->type->toBasetype(); + + // valid array ops would have been transformed by optimize + if ((t1->ty == Tarray || t1->ty == Tsarray) && + (t2->ty == Tarray || t2->ty == Tsarray) + ) + { + error("Array operation %s not recognized", base->toChars()); + fatal(); + } +} + +////////////////////////////////////////////////////////////////////////////////////////// + DValue* AddExp::toElem(IRState* p) { Logger::print("AddExp::toElem: %s @ %s\n", toChars(), type->toChars()); @@ -609,6 +626,8 @@ Type* e1next = e1type->nextOf() ? e1type->nextOf()->toBasetype() : NULL; Type* e2type = e2->type->toBasetype(); + errorOnIllegalArrayOp(this, e1, e2); + if (e1type != e2type) { if (e1type->ty == Tpointer) { Logger::println("add to pointer"); @@ -648,6 +667,8 @@ Type* t1 = e1->type->toBasetype(); Type* t2 = e2->type->toBasetype(); + errorOnIllegalArrayOp(this, e1, e2); + if (t1->ty == Tpointer && t2->ty == Tpointer) { LLValue* lv = l->getRVal(); LLValue* rv = r->getRVal(); @@ -683,6 +704,8 @@ DValue* l = e1->toElem(p); DValue* r = e2->toElem(p); + errorOnIllegalArrayOp(this, e1, e2); + if (type->iscomplex()) { return DtoComplexMul(loc, type, l, r); } @@ -700,6 +723,8 @@ DValue* l = e1->toElem(p); DValue* r = e2->toElem(p); + errorOnIllegalArrayOp(this, e1, e2); + if (type->iscomplex()) { return DtoComplexDiv(loc, type, l, r); } @@ -717,6 +742,8 @@ DValue* l = e1->toElem(p); DValue* r = e2->toElem(p); + errorOnIllegalArrayOp(this, e1, e2); + return DtoBinRem(type, l, r); } @@ -1878,6 +1905,7 @@ LOG_SCOPE; \ DValue* u = e1->toElem(p); \ DValue* v = e2->toElem(p); \ + errorOnIllegalArrayOp(this, e1, e2); \ LLValue* x = llvm::BinaryOperator::Create(llvm::Instruction::Y, u->getRVal(), v->getRVal(), "tmp", p->scopebb()); \ return new DImValue(type, x); \ }