mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Allow .. ranges to use "a..a-1" in order to express zero length.
This commit is contained in:
137
test/test_suite/arrays/slice_negative.c3t
Normal file
137
test/test_suite/arrays/slice_negative.c3t
Normal file
@@ -0,0 +1,137 @@
|
||||
// #target: macos-x64
|
||||
// #safe: yes
|
||||
module test;
|
||||
|
||||
fn void main()
|
||||
{
|
||||
int[2] x = { 1, 2 };
|
||||
int[] z = x[0..-1];
|
||||
int y = 1;
|
||||
int yy = -1;
|
||||
int[] w = x[y..yy];
|
||||
}
|
||||
|
||||
/* #expect: test.ll
|
||||
|
||||
|
||||
define void @test.main() #0 {
|
||||
entry:
|
||||
%x = alloca [2 x i32], align 4
|
||||
%z = alloca %"int[]", align 8
|
||||
%y = alloca i32, align 4
|
||||
%yy = alloca i32, align 4
|
||||
%w = alloca %"int[]", align 8
|
||||
%taddr = alloca i64, align 8
|
||||
%taddr1 = alloca i64, align 8
|
||||
%varargslots = alloca [2 x %any], align 16
|
||||
%indirectarg = alloca %"any[]", align 8
|
||||
%taddr3 = alloca i64, align 8
|
||||
%varargslots4 = alloca [1 x %any], align 16
|
||||
%indirectarg6 = alloca %"any[]", align 8
|
||||
%taddr11 = alloca i64, align 8
|
||||
%taddr12 = alloca i64, align 8
|
||||
%varargslots13 = alloca [2 x %any], align 16
|
||||
%indirectarg16 = alloca %"any[]", align 8
|
||||
%taddr19 = alloca i64, align 8
|
||||
%taddr20 = alloca i64, align 8
|
||||
%varargslots21 = alloca [2 x %any], align 16
|
||||
%indirectarg24 = alloca %"any[]", align 8
|
||||
call void @llvm.memcpy.p0.p0.i32(ptr align 4 %x, ptr align 4 @.__const, i32 8, i1 false)
|
||||
%0 = insertvalue %"int[]" undef, ptr %x, 0
|
||||
%1 = insertvalue %"int[]" %0, i64 0, 1
|
||||
store %"int[]" %1, ptr %z, align 8
|
||||
store i32 1, ptr %y, align 4
|
||||
store i32 -1, ptr %yy, align 4
|
||||
%2 = load i32, ptr %y, align 4
|
||||
%sext = sext i32 %2 to i64
|
||||
%gt = icmp sgt i64 %sext, 2
|
||||
%3 = call i1 @llvm.expect.i1(i1 %gt, i1 false)
|
||||
br i1 %3, label %panic, label %checkok
|
||||
|
||||
checkok: ; preds = %entry
|
||||
%underflow = icmp slt i64 %sext, 0
|
||||
%4 = call i1 @llvm.expect.i1(i1 %underflow, i1 false)
|
||||
br i1 %4, label %panic2, label %checkok7
|
||||
|
||||
checkok7: ; preds = %checkok
|
||||
%5 = load i32, ptr %yy, align 4
|
||||
%sext8 = sext i32 %5 to i64
|
||||
%add = add i64 %sext8, 1
|
||||
%gt9 = icmp sgt i64 %sext, %add
|
||||
%6 = call i1 @llvm.expect.i1(i1 %gt9, i1 false)
|
||||
br i1 %6, label %panic10, label %checkok17
|
||||
|
||||
checkok17: ; preds = %checkok7
|
||||
%le = icmp sle i64 2, %sext8
|
||||
%7 = call i1 @llvm.expect.i1(i1 %le, i1 false)
|
||||
br i1 %7, label %panic18, label %checkok25
|
||||
|
||||
checkok25: ; preds = %checkok17
|
||||
%8 = add i64 %sext8, 1
|
||||
%size = sub i64 %8, %sext
|
||||
%ptroffset = getelementptr inbounds [4 x i8], ptr %x, i64 %sext
|
||||
%9 = insertvalue %"int[]" undef, ptr %ptroffset, 0
|
||||
%10 = insertvalue %"int[]" %9, i64 %size, 1
|
||||
store %"int[]" %10, ptr %w, align 8
|
||||
ret void
|
||||
|
||||
panic: ; preds = %entry
|
||||
store i64 2, ptr %taddr, align 8
|
||||
%11 = insertvalue %any undef, ptr %taddr, 0
|
||||
%12 = insertvalue %any %11, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store i64 %sext, ptr %taddr1, align 8
|
||||
%13 = insertvalue %any undef, ptr %taddr1, 0
|
||||
%14 = insertvalue %any %13, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %12, ptr %varargslots, align 16
|
||||
%ptradd = getelementptr inbounds i8, ptr %varargslots, i64 16
|
||||
store %any %14, ptr %ptradd, align 16
|
||||
%15 = insertvalue %"any[]" undef, ptr %varargslots, 0
|
||||
%"$$temp" = insertvalue %"any[]" %15, i64 2, 1
|
||||
store %"any[]" %"$$temp", ptr %indirectarg, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg, i64 61, ptr @.file, i64 17, ptr @.func, i64 4, i32 9, ptr byval(%"any[]") align 8 %indirectarg) #3
|
||||
unreachable
|
||||
|
||||
panic2: ; preds = %checkok
|
||||
store i64 %sext, ptr %taddr3, align 8
|
||||
%16 = insertvalue %any undef, ptr %taddr3, 0
|
||||
%17 = insertvalue %any %16, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %17, ptr %varargslots4, align 16
|
||||
%18 = insertvalue %"any[]" undef, ptr %varargslots4, 0
|
||||
%"$$temp5" = insertvalue %"any[]" %18, i64 1, 1
|
||||
store %"any[]" %"$$temp5", ptr %indirectarg6, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg.1, i64 22, ptr @.file, i64 17, ptr @.func, i64 4, i32 9, ptr byval(%"any[]") align 8 %indirectarg6) #3
|
||||
unreachable
|
||||
|
||||
panic10: ; preds = %checkok7
|
||||
store i64 %sext, ptr %taddr11, align 8
|
||||
%19 = insertvalue %any undef, ptr %taddr11, 0
|
||||
%20 = insertvalue %any %19, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store i64 %sext8, ptr %taddr12, align 8
|
||||
%21 = insertvalue %any undef, ptr %taddr12, 0
|
||||
%22 = insertvalue %any %21, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %20, ptr %varargslots13, align 16
|
||||
%ptradd14 = getelementptr inbounds i8, ptr %varargslots13, i64 16
|
||||
store %any %22, ptr %ptradd14, align 16
|
||||
%23 = insertvalue %"any[]" undef, ptr %varargslots13, 0
|
||||
%"$$temp15" = insertvalue %"any[]" %23, i64 2, 1
|
||||
store %"any[]" %"$$temp15", ptr %indirectarg16, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg.2, i64 35, ptr @.file, i64 17, ptr @.func, i64 4, i32 9, ptr byval(%"any[]") align 8 %indirectarg16) #3
|
||||
unreachable
|
||||
|
||||
panic18: ; preds = %checkok17
|
||||
store i64 %sext8, ptr %taddr19, align 8
|
||||
%24 = insertvalue %any undef, ptr %taddr19, 0
|
||||
%25 = insertvalue %any %24, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store i64 2, ptr %taddr20, align 8
|
||||
%26 = insertvalue %any undef, ptr %taddr20, 0
|
||||
%27 = insertvalue %any %26, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %25, ptr %varargslots21, align 16
|
||||
%ptradd22 = getelementptr inbounds i8, ptr %varargslots21, i64 16
|
||||
store %any %27, ptr %ptradd22, align 16
|
||||
%28 = insertvalue %"any[]" undef, ptr %varargslots21, 0
|
||||
%"$$temp23" = insertvalue %"any[]" %28, i64 2, 1
|
||||
store %"any[]" %"$$temp23", ptr %indirectarg24, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg.3, i64 60, ptr @.file, i64 17, ptr @.func, i64 4, i32 9, ptr byval(%"any[]") align 8 %indirectarg24) #3
|
||||
unreachable
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ fn void test()
|
||||
{
|
||||
int[3] x = { 1, 2, 3};
|
||||
int[] z = x[2..2];
|
||||
z = x[2..1]; // #error: greater than the end index
|
||||
z = x[2..0]; // #error: greater than the end index
|
||||
}
|
||||
|
||||
fn void test2()
|
||||
@@ -10,7 +10,7 @@ fn void test2()
|
||||
int[3] x = { 1, 2, 3};
|
||||
int[] z = x[^2..^2];
|
||||
z = x[^3..];
|
||||
z = x[^1..^2]; // #error: greater than the end index
|
||||
z = x[^1..^3]; // #error: greater than the end index
|
||||
}
|
||||
|
||||
fn void test3()
|
||||
@@ -29,7 +29,7 @@ fn void test4()
|
||||
fn void test5()
|
||||
{
|
||||
int[3] x = { 1, 2, 3 };
|
||||
int[] z = x[..^4]; // #error: An index may only be negative
|
||||
int[] z = x[..^5]; // #error: An index may only be negative
|
||||
}
|
||||
|
||||
fn void test6()
|
||||
|
||||
Reference in New Issue
Block a user