diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 8c6c6341..30cf661d 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -15744,8 +15744,32 @@ bool BfExprEvaluator::CheckModifyResult(BfTypedValue typedVal, BfAstNode* refNod } else { - error = mModule->Fail(StrFormat("Cannot %s read-only local variable '%s'.", modifyType, - localVar->mName.c_str()), refNode); + if ((mResultLocalVarField != 0) && (!localVar->mIsReadOnly)) + { + auto typeInst = localVar->mResolvedType->ToTypeInstance(); + int dataIdx = mResultLocalVarField - 1; + if (typeInst != NULL) + { + for (auto& field : typeInst->mFieldInstances) + { + if (field.mDataIdx == dataIdx) + { + error = mModule->Fail(StrFormat("Cannot %s readonly field '%s.%s'.", modifyType, + mModule->TypeToString(typeInst).c_str(), + field.GetFieldDef()->mName.c_str()), refNode); + break; + } + } + + + } + } + + if (error == NULL) + { + error = mModule->Fail(StrFormat("Cannot %s read-only local variable '%s'.", modifyType, + localVar->mName.c_str()), refNode); + } return false; } } @@ -18908,8 +18932,8 @@ void BfExprEvaluator::PerformBinaryOperation(BfAstNode* leftExpression, BfAstNod mResult = BfTypedValue(phi, leftValue.mType); return; - } - + } + if ((binaryOp == BfBinaryOp_LeftShift) || (binaryOp == BfBinaryOp_RightShift)) { forceLeftType = true;