From 3ef627e3e2d379772823d7cc5fbc7975b2ab42bd Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Tue, 19 Apr 2022 08:26:52 -0700 Subject: [PATCH] No error on return type mismatch on NoReturn expression-bodied calls --- IDEHelper/Compiler/BfExprEvaluator.cpp | 6 ++++++ IDEHelper/Compiler/BfModule.cpp | 2 +- IDEHelper/Compiler/BfModule.h | 1 + 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 54cb63f3..bc1737bf 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -8149,6 +8149,12 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu auto func = moduleMethodInstance.mFunc; BfTypedValue callResult = CreateCall(targetSrc, methodInstance, func, bypassVirtual, irArgs, NULL, physCallFlags); + if ((methodInstance->mMethodDef->mIsNoReturn) && ((mBfEvalExprFlags & BfEvalExprFlags_IsExpressionBody) != 0) && + (mExpectingType != NULL) && (callResult.mType != mExpectingType)) + { + callResult = mModule->GetDefaultTypedValue(mExpectingType); + } + // This gets triggered for non-sret (ie: comptime) composite returns so they aren't considered readonly if ((callResult.mKind == BfTypedValueKind_Value) && (!callResult.mValue.IsConst()) && (!callResult.mType->IsValuelessType()) && (callResult.mType->IsComposite()) && (!methodInstance->GetLoweredReturnType())) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 490aab5a..f3738af3 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -21179,7 +21179,7 @@ void BfModule::ProcessMethod(BfMethodInstance* methodInstance, bool isInlineDup, // Warn(0, "Using a 'void' return with an expression-bodied method isn't needed. Consider removing '=>' token", methodDeclaration->mFatArrowToken); // } - BfEvalExprFlags exprEvalFlags = BfEvalExprFlags_AllowRefExpr; + BfEvalExprFlags exprEvalFlags = (BfEvalExprFlags)(BfEvalExprFlags_AllowRefExpr | BfEvalExprFlags_IsExpressionBody); if (expectingType->IsVoid()) { exprEvalFlags = (BfEvalExprFlags)(exprEvalFlags | BfEvalExprFlags_NoCast); diff --git a/IDEHelper/Compiler/BfModule.h b/IDEHelper/Compiler/BfModule.h index 9ff62081..45425a21 100644 --- a/IDEHelper/Compiler/BfModule.h +++ b/IDEHelper/Compiler/BfModule.h @@ -85,6 +85,7 @@ enum BfEvalExprFlags BfEvalExprFlags_FromConversionOp = 0x8000000, BfEvalExprFlags_FromConversionOp_Explicit = 0x10000000, BfEvalExprFlags_AllowGenericConstValue = 0x20000000, + BfEvalExprFlags_IsExpressionBody = 0x40000000, BfEvalExprFlags_InheritFlags = BfEvalExprFlags_NoAutoComplete | BfEvalExprFlags_Comptime | BfEvalExprFlags_DeclType };