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); \
 }