# HG changeset patch # User ChristianK # Date 1216055845 -7200 # Node ID 932229a851a477590a39c0b325550ba297d592c2 # Parent 9c9544fd769d70a66029edc6cd7a44c215d4d54e [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. diff -r 9c9544fd769d -r 932229a851a4 gen/dvalue.h --- 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; } }; diff -r 9c9544fd769d -r 932229a851a4 gen/toir.cpp --- 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!