changeset 361:932229a851a4 trunk

[svn r382] In CastExp, after the cast to CastExp.to force the type to be CastExp.type. This is used for c.im for instance, where the cast is to idouble but type is double.
author ChristianK
date Mon, 14 Jul 2008 19:17:25 +0200
parents 9c9544fd769d
children faa03bf92f0d
files gen/dvalue.h gen/toir.cpp
diffstat 2 files changed, 12 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/gen/dvalue.h	Mon Jul 14 17:26:58 2008 +0200
+++ b/gen/dvalue.h	Mon Jul 14 19:17:25 2008 +0200
@@ -37,7 +37,7 @@
 // base class for d-values
 struct DValue : Object
 {
-    virtual Type* getType() = 0;
+    virtual Type*& getType() = 0;
 
     virtual LLValue* getLVal() { assert(0); return 0; }
     virtual LLValue* getRVal() { assert(0); return 0; }
@@ -75,7 +75,7 @@
 
     virtual LLValue* getRVal() { assert(val); return val; }
 
-    virtual Type* getType() { assert(type); return type; }
+    virtual Type*& getType() { assert(type); return type; }
     virtual DImValue* isIm() { return this; }
 
     virtual bool inPlace() { return inplace; }
@@ -91,7 +91,7 @@
 
     virtual LLValue* getRVal();
 
-    virtual Type* getType() { assert(type); return type; }
+    virtual Type*& getType() { assert(type); return type; }
     virtual DConstValue* isConst() { return this; }
 };
 
@@ -119,7 +119,7 @@
     virtual LLValue* getLVal();
     virtual LLValue* getRVal();
 
-    virtual Type* getType() { assert(type); return type; }
+    virtual Type*& getType() { assert(type); return type; }
     virtual DVarValue* isVar() { return this; }
 };
 
@@ -146,7 +146,7 @@
 
     DSliceValue(Type* t, LLValue* l, LLValue* p) { type=t; ptr=p; len=l; }
 
-    virtual Type* getType() { assert(type); return type; }
+    virtual Type*& getType() { assert(type); return type; }
     virtual DSliceValue* isSlice() { return this; }
 };
 
@@ -162,7 +162,7 @@
 
     virtual LLValue* getRVal();
 
-    virtual Type* getType() { assert(type); return type; }
+    virtual Type*& getType() { assert(type); return type; }
     virtual DFuncValue* isFunc() { return this; }
 };
 
@@ -181,9 +181,9 @@
     virtual LLValue* getLVal() { return lvalue->isLVal() ? lvalue->getLVal() : lvalue->getRVal(); }
     virtual LLValue* getRVal() { return rvalue->getRVal(); }
 
-    Type* getLType() { return lvalue->getType(); }
-    Type* getRType() { return rvalue->getType(); }
-    virtual Type* getType() { return getRType(); }
+    Type*& getLType() { return lvalue->getType(); }
+    Type*& getRType() { return rvalue->getType(); }
+    virtual Type*& getType() { return getRType(); }
     virtual DLRValue* isLRValue() { return this; }
 };
 
@@ -200,7 +200,7 @@
         im = i;
     }
 
-    virtual Type* getType() { assert(type); return type; }
+    virtual Type*& getType() { assert(type); return type; }
     virtual DComplexValue* isComplex() { return this; }
 };
 
--- a/gen/toir.cpp	Mon Jul 14 17:26:58 2008 +0200
+++ b/gen/toir.cpp	Mon Jul 14 19:17:25 2008 +0200
@@ -1250,6 +1250,8 @@
 
     DValue* u = e1->toElem(p);
     DValue* v = DtoCast(u, to);
+    // force d type to this->type
+    v->getType() = type;
 
     if (v->isSlice()) {
         // only valid as rvalue!