From 487787b08eaf7bce9d253c455d2bdacdaf0171a7 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 25 Jun 2022 08:43:55 -0700 Subject: [PATCH] Fixed struct ref casts --- IDEHelper/Compiler/BfModuleTypeUtils.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfModuleTypeUtils.cpp b/IDEHelper/Compiler/BfModuleTypeUtils.cpp index 97ed5661..b0fe8aac 100644 --- a/IDEHelper/Compiler/BfModuleTypeUtils.cpp +++ b/IDEHelper/Compiler/BfModuleTypeUtils.cpp @@ -12597,9 +12597,11 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp // Ref X to Ref Y, X* to Y* { bool checkUnderlying = false; + bool isRef = false; if (((typedVal.mType->IsRef()) && (toType->IsRef()))) { + isRef = true; auto fromRefType = (BfRefType*)typedVal.mType; auto toRefType = (BfRefType*)toType; if (fromRefType->mRefKind == toRefType->mRefKind) @@ -12639,12 +12641,24 @@ BfIRValue BfModule::CastToValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp if (matches) { // This is either a ref or a ptr so we don't need to set the "IsAddr" flag - typedVal = MakeAddressable(typedVal); + typedVal = MakeAddressable(typedVal); return mBfIRBuilder->CreateBitCast(typedVal.mValue, mBfIRBuilder->MapType(toType)); } } } + if ((isRef) && (fromInner->IsStruct()) && (toInner->IsStruct())) + { + if (TypeIsSubTypeOf(fromInner->ToTypeInstance(), toInner->ToTypeInstance())) + { + if (toInner->IsValuelessType()) + return mBfIRBuilder->GetFakeVal(); + // Is this valid? + typedVal = MakeAddressable(typedVal); + return mBfIRBuilder->CreateBitCast(typedVal.mValue, mBfIRBuilder->MapType(toType)); + } + } + // ref int <-> ref int64/int32 (of same size) if (((fromInner->IsInteger()) && (toInner->IsInteger())) && (fromInner->mSize == toInner->mSize) &&