mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Upgrade of mingw in CI. Fix problems using reflection on interface types #1203. Improved debug information on defer. $foreach doesn't create an implicit syntactic scope. Error if `@if` depends on `@if`. Updated Linux stacktrace. Fix of default argument stacktrace. Allow linking libraries directly by file path. Improve inlining warning messages. Added `index_of_char_from`. Compiler crash using enum nameof from different module #1205. Removed unused fields in find_msvc. Use vswhere to find msvc. Update tests for LLVM 19
120 lines
4.2 KiB
Plaintext
120 lines
4.2 KiB
Plaintext
// #target: macos-x64
|
|
module foo;
|
|
import std::io;
|
|
|
|
struct Test {
|
|
ushort afff;
|
|
bitstruct : ushort @overlap {
|
|
ushort ab : 0..15;
|
|
char a : 8..15;
|
|
char b : 0..7;
|
|
bool c : 7;
|
|
bool d : 6;
|
|
bool e : 5;
|
|
bool f : 4;
|
|
}
|
|
}
|
|
|
|
fn void main() {
|
|
|
|
|
|
Test test;
|
|
test.ab = 0xAFBA;
|
|
|
|
io::printfn("%02x %02x -> %04x\n", test.a, test.b, test.ab);
|
|
io::printfn("%x %x %x %x\n", test.c, test.d, test.e, test.f);
|
|
}
|
|
|
|
/* #expect: foo.ll
|
|
|
|
|
|
define void @foo.main() #0 {
|
|
entry:
|
|
%test = alloca %Test, align 2
|
|
%varargslots = alloca [3 x %any], align 16
|
|
%taddr = alloca i8, align 1
|
|
%taddr5 = alloca i8, align 1
|
|
%taddr8 = alloca i16, align 2
|
|
%retparam = alloca i64, align 8
|
|
%varargslots10 = alloca [4 x %any], align 16
|
|
%taddr14 = alloca i8, align 1
|
|
%taddr18 = alloca i8, align 1
|
|
%taddr23 = alloca i8, align 1
|
|
%taddr28 = alloca i8, align 1
|
|
%retparam30 = alloca i64, align 8
|
|
store i16 0, ptr %test, align 2
|
|
%ptradd = getelementptr inbounds i8, ptr %test, i64 2
|
|
store i16 0, ptr %ptradd, align 2
|
|
%ptradd1 = getelementptr inbounds i8, ptr %test, i64 2
|
|
%0 = load i16, ptr %ptradd1, align 2
|
|
store i16 -20550, ptr %ptradd1, align 2
|
|
%ptradd2 = getelementptr inbounds i8, ptr %test, i64 2
|
|
%1 = load i16, ptr %ptradd2, align 2
|
|
%lshrl = lshr i16 %1, 8
|
|
%2 = and i16 255, %lshrl
|
|
%trunc = trunc i16 %2 to i8
|
|
store i8 %trunc, ptr %taddr, align 1
|
|
%3 = insertvalue %any undef, ptr %taddr, 0
|
|
%4 = insertvalue %any %3, i64 ptrtoint (ptr @"$ct.char" to i64), 1
|
|
store %any %4, ptr %varargslots, align 16
|
|
%ptradd3 = getelementptr inbounds i8, ptr %test, i64 2
|
|
%5 = load i16, ptr %ptradd3, align 2
|
|
%6 = and i16 255, %5
|
|
%trunc4 = trunc i16 %6 to i8
|
|
store i8 %trunc4, ptr %taddr5, align 1
|
|
%7 = insertvalue %any undef, ptr %taddr5, 0
|
|
%8 = insertvalue %any %7, i64 ptrtoint (ptr @"$ct.char" to i64), 1
|
|
%ptradd6 = getelementptr inbounds i8, ptr %varargslots, i64 16
|
|
store %any %8, ptr %ptradd6, align 16
|
|
%ptradd7 = getelementptr inbounds i8, ptr %test, i64 2
|
|
%9 = load i16, ptr %ptradd7, align 2
|
|
store i16 %9, ptr %taddr8, align 2
|
|
%10 = insertvalue %any undef, ptr %taddr8, 0
|
|
%11 = insertvalue %any %10, i64 ptrtoint (ptr @"$ct.ushort" to i64), 1
|
|
%ptradd9 = getelementptr inbounds i8, ptr %varargslots, i64 32
|
|
store %any %11, ptr %ptradd9, align 16
|
|
%12 = call i64 @std.io.printfn(ptr %retparam, ptr @.str, i64 18, ptr %varargslots, i64 3)
|
|
%ptradd11 = getelementptr inbounds i8, ptr %test, i64 2
|
|
%13 = load i16, ptr %ptradd11, align 2
|
|
%lshrl12 = lshr i16 %13, 7
|
|
%14 = and i16 1, %lshrl12
|
|
%trunc13 = trunc i16 %14 to i8
|
|
store i8 %trunc13, ptr %taddr14, align 1
|
|
%15 = insertvalue %any undef, ptr %taddr14, 0
|
|
%16 = insertvalue %any %15, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
|
|
store %any %16, ptr %varargslots10, align 16
|
|
%ptradd15 = getelementptr inbounds i8, ptr %test, i64 2
|
|
%17 = load i16, ptr %ptradd15, align 2
|
|
%lshrl16 = lshr i16 %17, 6
|
|
%18 = and i16 1, %lshrl16
|
|
%trunc17 = trunc i16 %18 to i8
|
|
store i8 %trunc17, ptr %taddr18, align 1
|
|
%19 = insertvalue %any undef, ptr %taddr18, 0
|
|
%20 = insertvalue %any %19, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
|
|
%ptradd19 = getelementptr inbounds i8, ptr %varargslots10, i64 16
|
|
store %any %20, ptr %ptradd19, align 16
|
|
%ptradd20 = getelementptr inbounds i8, ptr %test, i64 2
|
|
%21 = load i16, ptr %ptradd20, align 2
|
|
%lshrl21 = lshr i16 %21, 5
|
|
%22 = and i16 1, %lshrl21
|
|
%trunc22 = trunc i16 %22 to i8
|
|
store i8 %trunc22, ptr %taddr23, align 1
|
|
%23 = insertvalue %any undef, ptr %taddr23, 0
|
|
%24 = insertvalue %any %23, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
|
|
%ptradd24 = getelementptr inbounds i8, ptr %varargslots10, i64 32
|
|
store %any %24, ptr %ptradd24, align 16
|
|
%ptradd25 = getelementptr inbounds i8, ptr %test, i64 2
|
|
%25 = load i16, ptr %ptradd25, align 2
|
|
%lshrl26 = lshr i16 %25, 4
|
|
%26 = and i16 1, %lshrl26
|
|
%trunc27 = trunc i16 %26 to i8
|
|
store i8 %trunc27, ptr %taddr28, align 1
|
|
%27 = insertvalue %any undef, ptr %taddr28, 0
|
|
%28 = insertvalue %any %27, i64 ptrtoint (ptr @"$ct.bool" to i64), 1
|
|
%ptradd29 = getelementptr inbounds i8, ptr %varargslots10, i64 48
|
|
store %any %28, ptr %ptradd29, align 16
|
|
%29 = call i64 @std.io.printfn(ptr %retparam30, ptr @.str.1, i64 12, ptr %varargslots10, i64 4)
|
|
ret void
|
|
}
|
|
|