From 7f340f7c82fb1f8064e695d592ab342bc92c5df8 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Sat, 21 May 2022 11:58:26 -0700 Subject: [PATCH] Improved warning taking address of parameters --- IDEHelper/Compiler/BfExprEvaluator.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index e97ab86a..6e5508d4 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -18863,14 +18863,28 @@ bool BfExprEvaluator::CheckModifyResult(BfTypedValue& typedVal, BfAstNode* refNo if (!mModule->mCurMethodInstance->IsMixin()) { if (mModule->mCurMethodState->mMixinState != NULL) + { error = _Fail(StrFormat("Cannot %s mixin parameter '%s'", modifyType, localVar->mName.c_str()), refNode); + } else if ((onlyNeedsMut) && (localVar->mResolvedType != NULL) && (localVar->mResolvedType->IsGenericParam())) - error = _Fail(StrFormat("Cannot %s parameter '%s'. Consider adding 'mut' or 'ref' specifier to parameter or declaring 'var %s;' to create a mutable copy.", modifyType, - localVar->mName.c_str(), localVar->mName.c_str()), refNode); + { + if (emitWarning) + error = _Fail(StrFormat("The address of '%s' may be temporary or immutable. Consider adding 'mut' or 'ref' specifier to parameter or declaring 'var %s;' to create a mutable copy.", + localVar->mName.c_str(), localVar->mName.c_str()), refNode); + else + error = _Fail(StrFormat("Cannot %s parameter '%s'. Consider adding 'mut' or 'ref' specifier to parameter or declaring 'var %s;' to create a mutable copy.", modifyType, + localVar->mName.c_str(), localVar->mName.c_str()), refNode); + } else - error = _Fail(StrFormat("Cannot %s parameter '%s'. Consider adding 'ref' specifier to parameter or declaring 'var %s;' to create a mutable copy.", modifyType, - localVar->mName.c_str(), localVar->mName.c_str()), refNode); + { + if (emitWarning) + error = _Fail(StrFormat("The address of '%s' may be temporary or immutable. Consider adding 'ref' specifier to parameter or declaring 'var %s;' to create a mutable copy.", + localVar->mName.c_str(), localVar->mName.c_str()), refNode); + else + error = _Fail(StrFormat("Cannot %s parameter '%s'. Consider adding 'ref' specifier to parameter or declaring 'var %s;' to create a mutable copy.", modifyType, + localVar->mName.c_str(), localVar->mName.c_str()), refNode); + } return false; } }