diff --git a/BeefLibs/corlib/src/Array.bf b/BeefLibs/corlib/src/Array.bf index d6e8b8cf..7a250fed 100644 --- a/BeefLibs/corlib/src/Array.bf +++ b/BeefLibs/corlib/src/Array.bf @@ -269,7 +269,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } if ((uint)idx >= (uint)mLength) Internal.ThrowIndexOutOfRange(1); @@ -283,7 +283,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } return ref (&mFirstElement)[idx]; } diff --git a/BeefLibs/corlib/src/Collections/List.bf b/BeefLibs/corlib/src/Collections/List.bf index a53a3a20..079972f2 100644 --- a/BeefLibs/corlib/src/Collections/List.bf +++ b/BeefLibs/corlib/src/Collections/List.bf @@ -220,7 +220,7 @@ namespace System.Collections switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mSize - 1 - offset; + case .FromEnd(let offset): idx = mSize - offset; } Runtime.Assert((uint)idx < (uint)mSize); return ref mItems[idx]; @@ -233,7 +233,7 @@ namespace System.Collections switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mSize - 1 - offset; + case .FromEnd(let offset): idx = mSize - offset; } return ref mItems[idx]; } @@ -245,7 +245,7 @@ namespace System.Collections switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mSize - 1 - offset; + case .FromEnd(let offset): idx = mSize - offset; } Runtime.Assert((uint)idx < (uint)mSize); mItems[idx] = value; @@ -261,7 +261,7 @@ namespace System.Collections switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mSize - 1 - offset; + case .FromEnd(let offset): idx = mSize - offset; } mItems[idx] = value; #if VERSION_LIST diff --git a/BeefLibs/corlib/src/Span.bf b/BeefLibs/corlib/src/Span.bf index af5f8cce..f787d05e 100644 --- a/BeefLibs/corlib/src/Span.bf +++ b/BeefLibs/corlib/src/Span.bf @@ -150,7 +150,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } Runtime.Assert((uint)idx < (uint)mLength); return ref mPtr[idx]; @@ -163,7 +163,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } return ref mPtr[idx]; } @@ -184,7 +184,7 @@ namespace System start = mPtr + offset; case .FromEnd(let offset): Debug.Assert((uint)offset <= (uint)mLength); - start = mPtr + mLength - 1 - offset; + start = mPtr + mLength - offset; } T* end; if (range.[Friend]mIsClosed) @@ -195,8 +195,8 @@ namespace System Debug.Assert((uint)offset < (uint)mLength); end = mPtr + offset + 1; case .FromEnd(let offset): - Debug.Assert((uint)offset < (uint)mLength); - end = mPtr + mLength - offset; + Debug.Assert((uint)(offset - 1) <= (uint)mLength); + end = mPtr + mLength - offset + 1; } } else @@ -208,7 +208,7 @@ namespace System end = mPtr + offset; case .FromEnd(let offset): Debug.Assert((uint)offset <= (uint)mLength); - end = mPtr + mLength - 1 - offset; + end = mPtr + mLength - offset; } } diff --git a/BeefLibs/corlib/src/String.bf b/BeefLibs/corlib/src/String.bf index 44b6bff6..0f887352 100644 --- a/BeefLibs/corlib/src/String.bf +++ b/BeefLibs/corlib/src/String.bf @@ -1046,7 +1046,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } Debug.Assert((uint)idx < (uint)mLength); return ref Ptr[idx]; @@ -1059,7 +1059,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } return ref Ptr[idx]; } @@ -1071,7 +1071,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } Debug.Assert((uint)idx < (uint)mLength); Ptr[idx] = value; @@ -1084,7 +1084,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } Ptr[idx] = value; } @@ -2994,7 +2994,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } Runtime.Assert((uint)idx < (uint)mLength); return ref mPtr[idx]; @@ -3007,7 +3007,7 @@ namespace System switch (index) { case .FromFront(let offset): idx = offset; - case .FromEnd(let offset): idx = mLength - 1 - offset; + case .FromEnd(let offset): idx = mLength - offset; } return ref mPtr[idx]; } @@ -3028,7 +3028,7 @@ namespace System start = mPtr + offset; case .FromEnd(let offset): Debug.Assert((uint)offset <= (uint)mLength); - start = mPtr + mLength - 1 - offset; + start = mPtr + mLength - offset; } char8* end; if (range.[Friend]mIsClosed) @@ -3039,8 +3039,8 @@ namespace System Debug.Assert((uint)offset < (uint)mLength); end = mPtr + offset + 1; case .FromEnd(let offset): - Debug.Assert((uint)offset < (uint)mLength); - end = mPtr + mLength - offset; + Debug.Assert((uint)(offset - 1) <= (uint)mLength); + end = mPtr + mLength - offset + 1; } } else @@ -3052,7 +3052,7 @@ namespace System end = mPtr + offset; case .FromEnd(let offset): Debug.Assert((uint)offset <= (uint)mLength); - end = mPtr + mLength - 1 - offset; + end = mPtr + mLength - offset; } } diff --git a/IDEHelper/Compiler/BfExprEvaluator.cpp b/IDEHelper/Compiler/BfExprEvaluator.cpp index 05fe60c7..8d321509 100644 --- a/IDEHelper/Compiler/BfExprEvaluator.cpp +++ b/IDEHelper/Compiler/BfExprEvaluator.cpp @@ -20859,7 +20859,7 @@ void BfExprEvaluator::PerformBinaryOperation(BfExpression* leftExpression, BfExp } else { - // Add as a `^0` + // Add as a `^1` auto indexType = mModule->ResolveTypeDef(mModule->mCompiler->mIndexTypeDef)->ToTypeInstance(); rightTypedValueExpr.mRefNode = opToken; @@ -20867,7 +20867,7 @@ void BfExprEvaluator::PerformBinaryOperation(BfExpression* leftExpression, BfExp SizedArray tupleMembers; tupleMembers.Add(valueTypeEmpty); - tupleMembers.Add(mModule->mBfIRBuilder->CreateConst(BfTypeCode_IntPtr, 0)); + tupleMembers.Add(mModule->mBfIRBuilder->CreateConst(BfTypeCode_IntPtr, 1)); auto tupleValue = mModule->mBfIRBuilder->CreateConstAgg(mModule->mBfIRBuilder->MapType(indexType->mFieldInstances[0].mResolvedType), tupleMembers); SizedArray indexMembers; diff --git a/IDEHelper/Tests/src/Loops.bf b/IDEHelper/Tests/src/Loops.bf index 0462f519..cc725da1 100644 --- a/IDEHelper/Tests/src/Loops.bf +++ b/IDEHelper/Tests/src/Loops.bf @@ -145,23 +145,26 @@ namespace Tests Test.Assert(total == 20+30+40+50+60+70+80+90+100); total = 0; - for (int i in iList[...^1]) + for (int i in iList[...^2]) total += i; Test.Assert(total == 10+20+30+40+50+60+70+80+90); total = 0; - for (int i in iList[..<^1]) + for (int i in iList[..<^2]) total += i; Test.Assert(total == 10+20+30+40+50+60+70+80); total = 0; - for (int i in iList[...^1][1...^1]) + for (int i in iList[...^2][1...^2]) total += i; Test.Assert(total == 20+30+40+50+60+70+80); var str = scope String(); (2...^3).ToString(str); Test.Assert(str == "2...^3"); + + int[] iEmptyArr = scope .(); + var emptySpan = iEmptyArr[...]; } public static void TestEnumerator1(EnumeratorTest e)