diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 7873bc03..09cc91f6 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -19161,9 +19161,7 @@ void BfExprEvaluator::Visit(BfIndexerExpression* indexerExpr) mResult = BfTypedValue(mModule->mBfIRBuilder->GetFakeVal(), underlyingType, true); else { - mResult = mModule->GetDefaultTypedValue(underlyingType); - if (sizedArrayType->mElementCount != 0) - mModule->AssertErrorState(); + mResult = mModule->GetDefaultTypedValue(underlyingType, false, BfDefaultValueKind_Addr); } } else if (target.IsAddr()) diff --git a/IDEHelper/Compiler/BfModule.cpp b/IDEHelper/Compiler/BfModule.cpp index 5ff8fad8..cdbcd87c 100644 --- a/IDEHelper/Compiler/BfModule.cpp +++ b/IDEHelper/Compiler/BfModule.cpp @@ -5053,11 +5053,6 @@ BfIRValue BfModule::CreateTypeDataRef(BfType* type) BfMangler::Mangle(typeDataName, mCompiler->GetMangleKind(), type, this); } - if (typeDataName == "?sBfTypeData@Zoing@BeefTest@bf@@2HA") - { - NOP; - } - BfLogSysM("Creating TypeData %s\n", typeDataName.c_str()); globalVariable = mBfIRBuilder->CreateGlobalVariable(mBfIRBuilder->MapTypeInst(typeTypeInst, BfIRPopulateType_Full), true, BfIRLinkageType_External, BfIRValue(), typeDataName); diff --git a/IDEHelper/Compiler/CeMachine.cpp b/IDEHelper/Compiler/CeMachine.cpp index 64e61ff6..649a48e9 100644 --- a/IDEHelper/Compiler/CeMachine.cpp +++ b/IDEHelper/Compiler/CeMachine.cpp @@ -3686,7 +3686,7 @@ BfTypedValue CeContext::Call(BfAstNode* targetSrc, BfModule* module, BfMethodIns AutoTimer autoTimer(mCeMachine->mRevisionExecuteTime); - SetAndRestoreValue prevContext(mCeMachine->mCurContext, this); + SetAndRestoreValue prevContext(mCeMachine->mCurContext, this); SetAndRestoreValue prevEvalFlags(mCurEvalFlags, flags); SetAndRestoreValue prevTargetSrc(mCurTargetSrc, targetSrc); SetAndRestoreValue prevModule(mCurModule, module); @@ -3942,9 +3942,13 @@ BfTypedValue CeContext::Call(BfAstNode* targetSrc, BfModule* module, BfMethodIns Fail("Failed to encode return argument"); } } + else if (returnType->IsComposite()) + { + returnValue = BfTypedValue(module->mBfIRBuilder->CreateConstArrayZero(module->mBfIRBuilder->MapType(returnType)), returnType); + } else { - returnValue = BfTypedValue(module->mBfIRBuilder->GetFakeVal(), returnType); + returnValue = BfTypedValue(module->mBfIRBuilder->GetFakeVal(), returnType); } } diff --git a/IDEHelper/Tests/src/Comptime.bf b/IDEHelper/Tests/src/Comptime.bf index c2a13b21..3f995890 100644 --- a/IDEHelper/Tests/src/Comptime.bf +++ b/IDEHelper/Tests/src/Comptime.bf @@ -109,6 +109,58 @@ namespace Tests return (.)val; } + public struct TypePrinter + { + const int cFieldCount = GetFieldCount(); + const (int32, StringView)[cFieldCount] cMembers = Make(); + + static int GetFieldCount() + { + int fieldCount = 0; + for (let field in typeof(T).GetFields()) + if (!field.IsStatic) + fieldCount++; + + //Debug.WriteLine($"{fieldCount}"); + + return fieldCount; + } + + static decltype(cMembers) Make() + { + if (cFieldCount == 0) + return default(decltype(cMembers)); + + decltype(cMembers) fields = ?; + + int i = 0; + for (let field in typeof(T).GetFields()) + { + if (!field.IsStatic) + fields[i++] = (field.MemberOffset, field.Name); + } + + return fields; + } + + public override void ToString(String strBuffer) + { + for (var t in cMembers) + { + if (@t != 0) + strBuffer.Append("\n"); + strBuffer.AppendF($"{t.0} {t.1}"); + } + } + } + + struct TestType + { + public float mX; + public float mY; + public float mZ; + } + [Test] public static void TestBasics() { @@ -122,12 +174,20 @@ namespace Tests Compiler.Mixin("int val = 99;"); Test.Assert(val == 99); - MethodA(34, 45).IgnoreError(); Debug.Assert(LogAttribute.gLog == "Called Tests.Comptime.MethodA(int a, int b) 34 45\nError: Err(ErrorB)"); var v0 = GetBigger((int8)123); Test.Assert(v0.GetType() == typeof(int16)); + + String str = scope .(); + TypePrinter tp = .(); + tp.ToString(str); + Debug.Assert(str == """ + 0 mX + 4 mY + 8 mZ + """); } } } diff --git a/IDEHelper/Tests/src/Loops.bf b/IDEHelper/Tests/src/Loops.bf index ac7508c5..b08a07c2 100644 --- a/IDEHelper/Tests/src/Loops.bf +++ b/IDEHelper/Tests/src/Loops.bf @@ -1,9 +1,17 @@ +#pragma warning disable 168 + using System; namespace Tests { class Loops { + struct StructA + { + public int32 mA; + public int32 mB; + } + [Test] public static void TestBasics() { @@ -11,6 +19,13 @@ namespace Tests { } + + StructA[0] zeroLoop = default; + for (var val in zeroLoop) + { + StructA sa = val; + int idx = @val; + } } } }