Update range checking.

This commit is contained in:
Christoffer Lerno
2024-09-09 18:13:00 +02:00
parent 6f90e13502
commit 503032cbcf
9 changed files with 372 additions and 161 deletions

View File

@@ -31,13 +31,13 @@ fn void main()
%2 = load %"int[]", ptr %slice, align 8
%3 = extractvalue %"int[]" %2, 0
%4 = extractvalue %"int[]" %2, 1
%gt = icmp ugt i64 2, %4
%gt = icmp sgt i64 2, %4
%5 = call i1 @llvm.expect.i1(i1 %gt, i1 false)
br i1 %5, label %panic, label %checkok
checkok: ; preds = %entry
%ge = icmp uge i64 5, %4
%6 = call i1 @llvm.expect.i1(i1 %ge, i1 false)
%lt = icmp slt i64 %4, 6
%6 = call i1 @llvm.expect.i1(i1 %lt, i1 false)
br i1 %6, label %panic5, label %checkok12
checkok12: ; preds = %checkok
@@ -48,7 +48,7 @@ checkok12: ; preds = %checkok
%9 = load %"int[]", ptr %slice, align 8
%10 = extractvalue %"int[]" %9, 0
%11 = extractvalue %"int[]" %9, 1
%gt14 = icmp ugt i64 6, %11
%gt14 = icmp sgt i64 6, %11
%12 = call i1 @llvm.expect.i1(i1 %gt14, i1 false)
br i1 %12, label %panic15, label %checkok22
@@ -61,13 +61,13 @@ checkok22: ; preds = %checkok12
%15 = load %"int[]", ptr %slice, align 8
%16 = extractvalue %"int[]" %15, 0
%17 = extractvalue %"int[]" %15, 1
%gt24 = icmp ugt i64 0, %17
%gt24 = icmp sgt i64 0, %17
%18 = call i1 @llvm.expect.i1(i1 %gt24, i1 false)
br i1 %18, label %panic25, label %checkok32
checkok32: ; preds = %checkok22
%ge33 = icmp uge i64 9, %17
%19 = call i1 @llvm.expect.i1(i1 %ge33, i1 false)
%lt33 = icmp slt i64 %17, 10
%19 = call i1 @llvm.expect.i1(i1 %lt33, i1 false)
br i1 %19, label %panic34, label %checkok41
checkok41: ; preds = %checkok32
@@ -77,13 +77,13 @@ checkok41: ; preds = %checkok32
%22 = load %"int[]", ptr %slice, align 8
%23 = extractvalue %"int[]" %22, 0
%24 = extractvalue %"int[]" %22, 1
%gt42 = icmp ugt i64 5, %24
%gt42 = icmp sgt i64 5, %24
%25 = call i1 @llvm.expect.i1(i1 %gt42, i1 false)
br i1 %25, label %panic43, label %checkok50
checkok50: ; preds = %checkok41
%gt51 = icmp ugt i64 15, %24
%26 = call i1 @llvm.expect.i1(i1 %gt51, i1 false)
%lt51 = icmp slt i64 %24, 15
%26 = call i1 @llvm.expect.i1(i1 %lt51, i1 false)
br i1 %26, label %panic52, label %checkok59
checkok59: ; preds = %checkok50
@@ -94,13 +94,13 @@ checkok59: ; preds = %checkok50
%29 = load %"int[]", ptr %slice, align 8
%30 = extractvalue %"int[]" %29, 0
%31 = extractvalue %"int[]" %29, 1
%gt61 = icmp ugt i64 1, %31
%gt61 = icmp sgt i64 1, %31
%32 = call i1 @llvm.expect.i1(i1 %gt61, i1 false)
br i1 %32, label %panic62, label %checkok69
checkok69: ; preds = %checkok59
%ge70 = icmp uge i64 3, %31
%33 = call i1 @llvm.expect.i1(i1 %ge70, i1 false)
%lt70 = icmp slt i64 %31, 4
%33 = call i1 @llvm.expect.i1(i1 %lt70, i1 false)
br i1 %33, label %panic71, label %checkok78
checkok78: ; preds = %checkok69
@@ -111,13 +111,13 @@ checkok78: ; preds = %checkok69
%36 = load %"int[]", ptr %slice, align 8
%37 = extractvalue %"int[]" %36, 0
%38 = extractvalue %"int[]" %36, 1
%gt80 = icmp ugt i64 2, %38
%gt80 = icmp sgt i64 2, %38
%39 = call i1 @llvm.expect.i1(i1 %gt80, i1 false)
br i1 %39, label %panic81, label %checkok88
checkok88: ; preds = %checkok78
%gt89 = icmp ugt i64 12, %38
%40 = call i1 @llvm.expect.i1(i1 %gt89, i1 false)
%lt89 = icmp slt i64 %38, 12
%40 = call i1 @llvm.expect.i1(i1 %lt89, i1 false)
br i1 %40, label %panic90, label %checkok97
checkok97: ; preds = %checkok88

View File

@@ -58,7 +58,7 @@ slice_cmp_values: ; preds = %entry
slice_loop_start: ; preds = %slice_loop_comparison, %slice_cmp_values
%3 = load i64, ptr %cmp.idx, align 8
%lt = icmp ult i64 %3, %1
%lt = icmp slt i64 %3, %1
br i1 %lt, label %slice_loop_comparison, label %slice_cmp_exit
slice_loop_comparison: ; preds = %slice_loop_start
@@ -95,7 +95,7 @@ slice_cmp_values4: ; preds = %if.exit
slice_loop_start6: ; preds = %slice_loop_comparison8, %slice_cmp_values4
%13 = load i64, ptr %cmp.idx5, align 8
%lt7 = icmp ult i64 %13, %9
%lt7 = icmp slt i64 %13, %9
br i1 %lt7, label %slice_loop_comparison8, label %slice_cmp_exit12
slice_loop_comparison8: ; preds = %slice_loop_start6
@@ -133,7 +133,7 @@ slice_cmp_values17: ; preds = %switch.entry
slice_loop_start19: ; preds = %slice_loop_comparison21, %slice_cmp_values17
%20 = load i64, ptr %cmp.idx18, align 8
%lt20 = icmp ult i64 %20, 4
%lt20 = icmp slt i64 %20, 4
br i1 %lt20, label %slice_loop_comparison21, label %slice_cmp_exit25
slice_loop_comparison21: ; preds = %slice_loop_start19
@@ -166,7 +166,7 @@ slice_cmp_values28: ; preds = %next_if
slice_loop_start30: ; preds = %slice_loop_comparison32, %slice_cmp_values28
%26 = load i64, ptr %cmp.idx29, align 8
%lt31 = icmp ult i64 %26, 5
%lt31 = icmp slt i64 %26, 5
br i1 %lt31, label %slice_loop_comparison32, label %slice_cmp_exit36
slice_loop_comparison32: ; preds = %slice_loop_start30
@@ -199,7 +199,7 @@ slice_cmp_values41: ; preds = %next_if39
slice_loop_start43: ; preds = %slice_loop_comparison45, %slice_cmp_values41
%32 = load i64, ptr %cmp.idx42, align 8
%lt44 = icmp ult i64 %32, 4
%lt44 = icmp slt i64 %32, 4
br i1 %lt44, label %slice_loop_comparison45, label %slice_cmp_exit49
slice_loop_comparison45: ; preds = %slice_loop_start43

View File

@@ -2,7 +2,7 @@ fn void test()
{
int[3] x = { 1, 2, 3};
int[] z = x[2..2];
z = x[2..1]; // #error: Start index greater than end index.
z = x[2..1]; // #error: greater than the end index
}
fn void test2()
@@ -10,13 +10,13 @@ fn void test2()
int[3] x = { 1, 2, 3};
int[] z = x[^2..^2];
z = x[^3..];
z = x[^1..^2]; // #error: Start index greater than end index.
z = x[^1..^2]; // #error: greater than the end index
}
fn void test3()
{
int[3] x = { 1, 2, 3 };
int[] z = x[..4]; // #error: End index out of bounds, was 4, exceeding 3.
int[] z = x[..4]; // #error: End index out of bounds, was 4, exceeding
}
fn void test4()
@@ -29,31 +29,31 @@ fn void test4()
fn void test5()
{
int[3] x = { 1, 2, 3 };
int[] z = x[..^4]; // #error: Index out of bounds, using a negative index is only allowed for pointers.
int[] z = x[..^4]; // #error: An index may only be negative
}
fn void test6()
{
int[3] x = { 1, 2, 3 };
int[] z = x[3..]; // #error: Index out of bounds, was 3, exceeding maximum (2).
int[] z = x[3..]; // #error: Index out of bounds: the start index was
}
fn void test7()
{
int[3] x = { 1, 2, 3 };
int[] z = x[-1..]; // #error: Index out of bounds, using a negative index is only allowed for pointers
int[] z = x[-1..]; // #error: An index may only be negative
}
fn void test8()
{
int[3] x = { 1, 2, 3 };
int[] z = x[^4..]; // #error: Index out of bounds, using a negative index is only allowed for pointers
int[] z = x[^4..]; // #error: An index may only be negative
}
fn void test9()
{
int[3] x = { 1, 2, 3 };
int[] z = x[^0..]; // #error: Index out of bounds, was 3, exceeding maximum (2)
int[] z = x[^0..]; // #error: Index out of bounds: the start
}
fn void test10()
@@ -77,11 +77,11 @@ fn void test105()
int[] w = a.z[0..]; // #error: Omitting end index is not allowed for pointers
int[] z = a.z[^2..]; // #error: Indexing from the end is not allowed for pointers
int[] y = a.z[..^2]; // #error: Indexing from the end is not allowed for pointers
a.z[-10..-3]; // #error: Index out of bounds, using a negative index is only allowed for pointers
a.z[-10..-3]; // #error: An index may only be negative for pointers
}
fn void test11()
{
int[3] x = { 1, 2, 3 };
int[] z = x[..^0]; // #error: End index out of bounds, was 3, exceeding 3.
int[] z = x[..^0]; // #error: End index out of bounds, was 3, exceeding
}