diff --git a/gen/dvalue.h b/gen/dvalue.h index 8755997d..0a32aa9e 100644 --- a/gen/dvalue.h +++ b/gen/dvalue.h @@ -37,7 +37,7 @@ struct DComplexValue; // 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 @@ struct DImValue : DValue 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 @@ struct DConstValue : DValue 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 @@ struct DVarValue : DValue 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 @@ struct DSliceValue : DValue 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 @@ struct DFuncValue : DValue 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 @@ struct DLRValue : DValue 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 @@ struct DComplexValue : DValue im = i; } - virtual Type* getType() { assert(type); return type; } + virtual Type*& getType() { assert(type); return type; } virtual DComplexValue* isComplex() { return this; } }; diff --git a/gen/toir.cpp b/gen/toir.cpp index 4e1f6632..4a8edb5e 100644 --- a/gen/toir.cpp +++ b/gen/toir.cpp @@ -1250,6 +1250,8 @@ DValue* CastExp::toElem(IRState* p) 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!