mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Fix No index OOB check for [:^n] #2123
This commit is contained in:
186
test/test_suite/arrays/slice_end_assert.c3t
Normal file
186
test/test_suite/arrays/slice_end_assert.c3t
Normal file
@@ -0,0 +1,186 @@
|
||||
// #target: macos-x64
|
||||
// #safe: yes
|
||||
module test;
|
||||
fn int main()
|
||||
{
|
||||
String x = "ABCD";
|
||||
int z = 5;
|
||||
String y = x[1:^8];
|
||||
x[0:^z];
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* #expect: test.ll
|
||||
|
||||
define i32 @main() #0 {
|
||||
entry:
|
||||
%x = alloca %"char[]", align 8
|
||||
%z = alloca i32, align 4
|
||||
%y = alloca %"char[]", align 8
|
||||
%taddr = alloca i64, align 8
|
||||
%taddr1 = alloca i64, align 8
|
||||
%varargslots = alloca [2 x %any], align 16
|
||||
%indirectarg = alloca %"any[]", align 8
|
||||
%taddr5 = alloca i64, align 8
|
||||
%varargslots6 = alloca [1 x %any], align 16
|
||||
%indirectarg8 = alloca %"any[]", align 8
|
||||
%taddr12 = alloca i64, align 8
|
||||
%taddr13 = alloca i64, align 8
|
||||
%varargslots14 = alloca [2 x %any], align 16
|
||||
%indirectarg17 = alloca %"any[]", align 8
|
||||
%taddr22 = alloca i64, align 8
|
||||
%taddr23 = alloca i64, align 8
|
||||
%varargslots24 = alloca [2 x %any], align 16
|
||||
%indirectarg27 = alloca %"any[]", align 8
|
||||
%taddr34 = alloca i64, align 8
|
||||
%varargslots35 = alloca [1 x %any], align 16
|
||||
%indirectarg37 = alloca %"any[]", align 8
|
||||
%taddr42 = alloca i64, align 8
|
||||
%taddr43 = alloca i64, align 8
|
||||
%varargslots44 = alloca [2 x %any], align 16
|
||||
%indirectarg47 = alloca %"any[]", align 8
|
||||
store %"char[]" { ptr @.str, i64 4 }, ptr %x, align 8
|
||||
store i32 5, ptr %z, align 4
|
||||
%0 = load %"char[]", ptr %x, align 8
|
||||
%1 = extractvalue %"char[]" %0, 0
|
||||
%2 = extractvalue %"char[]" %0, 1
|
||||
%gt = icmp sgt i64 1, %2
|
||||
%3 = call i1 @llvm.expect.i1(i1 %gt, i1 false)
|
||||
br i1 %3, label %panic, label %checkok
|
||||
|
||||
checkok: ; preds = %entry
|
||||
%sub = sub i64 %2, 8
|
||||
%add = add i64 1, %sub
|
||||
%gt2 = icmp sgt i64 1, %add
|
||||
%sub3 = sub i64 %add, 1
|
||||
%4 = call i1 @llvm.expect.i1(i1 %gt2, i1 false)
|
||||
br i1 %4, label %panic4, label %checkok9
|
||||
|
||||
checkok9: ; preds = %checkok
|
||||
%lt = icmp slt i64 %2, %add
|
||||
%sub10 = sub i64 %add, 1
|
||||
%5 = call i1 @llvm.expect.i1(i1 %lt, i1 false)
|
||||
br i1 %5, label %panic11, label %checkok18
|
||||
|
||||
checkok18: ; preds = %checkok9
|
||||
%size = sub i64 %add, 1
|
||||
%ptradd19 = getelementptr inbounds i8, ptr %1, i64 1
|
||||
%6 = insertvalue %"char[]" undef, ptr %ptradd19, 0
|
||||
%7 = insertvalue %"char[]" %6, i64 %size, 1
|
||||
store %"char[]" %7, ptr %y, align 8
|
||||
%8 = load %"char[]", ptr %x, align 8
|
||||
%9 = extractvalue %"char[]" %8, 0
|
||||
%10 = extractvalue %"char[]" %8, 1
|
||||
%gt20 = icmp sgt i64 0, %10
|
||||
%11 = call i1 @llvm.expect.i1(i1 %gt20, i1 false)
|
||||
br i1 %11, label %panic21, label %checkok28
|
||||
|
||||
checkok28: ; preds = %checkok18
|
||||
%12 = load i32, ptr %z, align 4
|
||||
%sext = sext i32 %12 to i64
|
||||
%sub29 = sub i64 %10, %sext
|
||||
%add30 = add i64 0, %sub29
|
||||
%gt31 = icmp sgt i64 0, %add30
|
||||
%sub32 = sub i64 %add30, 0
|
||||
%13 = call i1 @llvm.expect.i1(i1 %gt31, i1 false)
|
||||
br i1 %13, label %panic33, label %checkok38
|
||||
|
||||
checkok38: ; preds = %checkok28
|
||||
%lt39 = icmp slt i64 %10, %add30
|
||||
%sub40 = sub i64 %add30, 1
|
||||
%14 = call i1 @llvm.expect.i1(i1 %lt39, i1 false)
|
||||
br i1 %14, label %panic41, label %checkok48
|
||||
|
||||
checkok48: ; preds = %checkok38
|
||||
%size49 = sub i64 %add30, 0
|
||||
%15 = insertvalue %"char[]" undef, ptr %9, 0
|
||||
%16 = insertvalue %"char[]" %15, i64 %size49, 1
|
||||
ret i32 0
|
||||
|
||||
panic: ; preds = %entry
|
||||
store i64 %2, ptr %taddr, align 8
|
||||
%17 = insertvalue %any undef, ptr %taddr, 0
|
||||
%18 = insertvalue %any %17, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store i64 1, ptr %taddr1, align 8
|
||||
%19 = insertvalue %any undef, ptr %taddr1, 0
|
||||
%20 = insertvalue %any %19, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %18, ptr %varargslots, align 16
|
||||
%ptradd = getelementptr inbounds i8, ptr %varargslots, i64 16
|
||||
store %any %20, ptr %ptradd, align 16
|
||||
%21 = insertvalue %"any[]" undef, ptr %varargslots, 0
|
||||
%"$$temp" = insertvalue %"any[]" %21, i64 2, 1
|
||||
store %"any[]" %"$$temp", ptr %indirectarg, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg, i64 61, ptr @.file, i64 19, ptr @.func, i64 4, i32 6, ptr byval(%"any[]") align 8 %indirectarg) #2
|
||||
unreachable
|
||||
|
||||
panic4: ; preds = %checkok
|
||||
store i64 %sub3, ptr %taddr5, align 8
|
||||
%22 = insertvalue %any undef, ptr %taddr5, 0
|
||||
%23 = insertvalue %any %22, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %23, ptr %varargslots6, align 16
|
||||
%24 = insertvalue %"any[]" undef, ptr %varargslots6, 0
|
||||
%"$$temp7" = insertvalue %"any[]" %24, i64 1, 1
|
||||
store %"any[]" %"$$temp7", ptr %indirectarg8, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg.1, i64 43, ptr @.file, i64 19, ptr @.func, i64 4, i32 6, ptr byval(%"any[]") align 8 %indirectarg8) #2
|
||||
unreachable
|
||||
|
||||
panic11: ; preds = %checkok9
|
||||
store i64 %sub10, ptr %taddr12, align 8
|
||||
%25 = insertvalue %any undef, ptr %taddr12, 0
|
||||
%26 = insertvalue %any %25, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store i64 %2, ptr %taddr13, align 8
|
||||
%27 = insertvalue %any undef, ptr %taddr13, 0
|
||||
%28 = insertvalue %any %27, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %26, ptr %varargslots14, align 16
|
||||
%ptradd15 = getelementptr inbounds i8, ptr %varargslots14, i64 16
|
||||
store %any %28, ptr %ptradd15, align 16
|
||||
%29 = insertvalue %"any[]" undef, ptr %varargslots14, 0
|
||||
%"$$temp16" = insertvalue %"any[]" %29, i64 2, 1
|
||||
store %"any[]" %"$$temp16", ptr %indirectarg17, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg.2, i64 60, ptr @.file, i64 19, ptr @.func, i64 4, i32 6, ptr byval(%"any[]") align 8 %indirectarg17) #2
|
||||
unreachable
|
||||
|
||||
panic21: ; preds = %checkok18
|
||||
store i64 %10, ptr %taddr22, align 8
|
||||
%30 = insertvalue %any undef, ptr %taddr22, 0
|
||||
%31 = insertvalue %any %30, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store i64 0, ptr %taddr23, align 8
|
||||
%32 = insertvalue %any undef, ptr %taddr23, 0
|
||||
%33 = insertvalue %any %32, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %31, ptr %varargslots24, align 16
|
||||
%ptradd25 = getelementptr inbounds i8, ptr %varargslots24, i64 16
|
||||
store %any %33, ptr %ptradd25, align 16
|
||||
%34 = insertvalue %"any[]" undef, ptr %varargslots24, 0
|
||||
%"$$temp26" = insertvalue %"any[]" %34, i64 2, 1
|
||||
store %"any[]" %"$$temp26", ptr %indirectarg27, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg, i64 61, ptr @.file, i64 19, ptr @.func, i64 4, i32 7, ptr byval(%"any[]") align 8 %indirectarg27) #2
|
||||
unreachable
|
||||
|
||||
panic33: ; preds = %checkok28
|
||||
store i64 %sub32, ptr %taddr34, align 8
|
||||
%35 = insertvalue %any undef, ptr %taddr34, 0
|
||||
%36 = insertvalue %any %35, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %36, ptr %varargslots35, align 16
|
||||
%37 = insertvalue %"any[]" undef, ptr %varargslots35, 0
|
||||
%"$$temp36" = insertvalue %"any[]" %37, i64 1, 1
|
||||
store %"any[]" %"$$temp36", ptr %indirectarg37, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg.1, i64 43, ptr @.file, i64 19, ptr @.func, i64 4, i32 7, ptr byval(%"any[]") align 8 %indirectarg37) #2
|
||||
unreachable
|
||||
|
||||
panic41: ; preds = %checkok38
|
||||
store i64 %sub40, ptr %taddr42, align 8
|
||||
%38 = insertvalue %any undef, ptr %taddr42, 0
|
||||
%39 = insertvalue %any %38, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store i64 %10, ptr %taddr43, align 8
|
||||
%40 = insertvalue %any undef, ptr %taddr43, 0
|
||||
%41 = insertvalue %any %40, i64 ptrtoint (ptr @"$ct.long" to i64), 1
|
||||
store %any %39, ptr %varargslots44, align 16
|
||||
%ptradd45 = getelementptr inbounds i8, ptr %varargslots44, i64 16
|
||||
store %any %41, ptr %ptradd45, align 16
|
||||
%42 = insertvalue %"any[]" undef, ptr %varargslots44, 0
|
||||
%"$$temp46" = insertvalue %"any[]" %42, i64 2, 1
|
||||
store %"any[]" %"$$temp46", ptr %indirectarg47, align 8
|
||||
call void @std.core.builtin.panicf(ptr @.panic_msg.2, i64 60, ptr @.file, i64 19, ptr @.func, i64 4, i32 7, ptr byval(%"any[]") align 8 %indirectarg47) #2
|
||||
unreachable
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user