From 25bde9e56638c3b53b7617a7ea2bb57b1db840f2 Mon Sep 17 00:00:00 2001 From: Brian Fiete Date: Mon, 6 Jun 2022 11:27:07 -0700 Subject: [PATCH] Retain argument cascade type --- IDEHelper/Compiler/BfExprEvaluator.cpp | 7 ++++++- IDEHelper/Compiler/BfExprEvaluator.h | 1 + IDEHelper/Tests/src/MethodCalls.bf | 8 ++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 1dafed87..498b73a6 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -5905,6 +5905,7 @@ void BfExprEvaluator::ResolveArgValues(BfResolvedArgs& resolvedArgs, BfResolveAr else if ((!resolvedArg.mResolvedType->IsStruct()) && (!resolvedArg.mResolvedType->IsSizedArray()) && (!resolvedArg.mResolvedType->IsValuelessType())) argValue = mModule->LoadValue(argValue, NULL, exprEvaluator.mIsVolatileReference); } + resolvedArg.mUncastedTypedValue = argValue; resolvedArg.mTypedValue = argValue; if (deferParamValues) @@ -8000,7 +8001,10 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu if ((argExprIdx != -1) && (argExprIdx < (int)argValues.size()) && ((argValues[argExprIdx].mArgFlags & BfArgFlag_Cascade) != 0)) { mUsedAsStatement = true; - argCascades.Add(argValue); + if (argValues[argExprIdx].mUncastedTypedValue) + argCascades.Add(argValues[argExprIdx].mUncastedTypedValue); + else + argCascades.Add(argValue); } if (expandedParamsArray) @@ -8430,6 +8434,7 @@ BfTypedValue BfExprEvaluator::ResolveArgValue(BfResolvedArg& resolvedArg, BfType auto expr = BfNodeDynCast(resolvedArg.mExpression); BF_ASSERT(expr != NULL); argValue = mModule->CreateValueFromExpression(expr, wantType, (BfEvalExprFlags)((mBfEvalExprFlags & BfEvalExprFlags_InheritFlags) | BfEvalExprFlags_NoCast | BfEvalExprFlags_AllowRefExpr | BfEvalExprFlags_AllowOutExpr)); + resolvedArg.mUncastedTypedValue = argValue; if ((argValue) && (wantType != NULL)) argValue = mModule->Cast(expr, argValue, wantType); } diff --git a/IDEHelper/Compiler/BfExprEvaluator.h b/IDEHelper/Compiler/BfExprEvaluator.h index e2fafeea..ca9ce83b 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.h +++ b/IDEHelper/Compiler/BfExprEvaluator.h @@ -56,6 +56,7 @@ class BfResolvedArg { public: BfTypedValue mTypedValue; + BfTypedValue mUncastedTypedValue; BfType* mResolvedType; BfAstNode* mExpression; BfArgFlags mArgFlags; diff --git a/IDEHelper/Tests/src/MethodCalls.bf b/IDEHelper/Tests/src/MethodCalls.bf index eb4e922b..b2a2a985 100644 --- a/IDEHelper/Tests/src/MethodCalls.bf +++ b/IDEHelper/Tests/src/MethodCalls.bf @@ -154,6 +154,11 @@ namespace Tests scPtr.mData[0] += 100; } + static void ObjMethod(Object obj) + { + + } + [Test] public static void TestBasics() { @@ -198,6 +203,9 @@ namespace Tests function [CallingConvention(.Cdecl)] void (StructC) scFunc2 = => ModifyC2; scFunc2(sc); Test.Assert(sc.mData[0] == 323); + + var v = ObjMethod(.. scope String()); + Test.Assert(v.GetType() == typeof(String)); } } }