diff --git a/lib/std/special/compiler_rt.zig b/lib/std/special/compiler_rt.zig index f5e83b5278..8d49fdbd2a 100644 --- a/lib/std/special/compiler_rt.zig +++ b/lib/std/special/compiler_rt.zig @@ -149,7 +149,7 @@ comptime { @export(@import("compiler_rt/clzsi2.zig").__clzsi2, .{ .name = "__clzsi2", .linkage = linkage }); - if (builtin.arch.isARM() and !is_test) { + if ((builtin.arch.isARM() or builtin.arch.isThumb()) and !is_test) { @export(@import("compiler_rt/arm.zig").__aeabi_unwind_cpp_pr0, .{ .name = "__aeabi_unwind_cpp_pr0", .linkage = linkage }); @export(@import("compiler_rt/arm.zig").__aeabi_unwind_cpp_pr1, .{ .name = "__aeabi_unwind_cpp_pr1", .linkage = linkage }); @export(@import("compiler_rt/arm.zig").__aeabi_unwind_cpp_pr2, .{ .name = "__aeabi_unwind_cpp_pr2", .linkage = linkage }); diff --git a/lib/std/target/riscv.zig b/lib/std/target/riscv.zig index 315329306e..ddf1049a20 100644 --- a/lib/std/target/riscv.zig +++ b/lib/std/target/riscv.zig @@ -78,7 +78,6 @@ pub const cpu = struct { .d, .f, .m, - .relax, }), }; @@ -92,7 +91,6 @@ pub const cpu = struct { .d, .f, .m, - .relax, }), }; diff --git a/src/ir.cpp b/src/ir.cpp index 7f2348caf2..3fc2ddadeb 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -11873,10 +11873,15 @@ static ConstCastOnly types_match_const_cast_only(IrAnalyze *ira, ZigType *wanted } if (wanted_type->id == ZigTypeIdInt && actual_type->id == ZigTypeIdInt) { - result.id = ConstCastResultIdIntShorten; - result.data.int_shorten = heap::c_allocator.allocate_nonzero(1); - result.data.int_shorten->wanted_type = wanted_type; - result.data.int_shorten->actual_type = actual_type; + if (wanted_type->data.integral.is_signed != actual_type->data.integral.is_signed || + wanted_type->data.integral.bit_count != actual_type->data.integral.bit_count) + { + result.id = ConstCastResultIdIntShorten; + result.data.int_shorten = heap::c_allocator.allocate_nonzero(1); + result.data.int_shorten->wanted_type = wanted_type; + result.data.int_shorten->actual_type = actual_type; + return result; + } return result; } diff --git a/test/stage1/behavior/atomics.zig b/test/stage1/behavior/atomics.zig index 7155e80094..0347f6f94a 100644 --- a/test/stage1/behavior/atomics.zig +++ b/test/stage1/behavior/atomics.zig @@ -146,8 +146,8 @@ fn testAtomicStore() void { } test "atomicrmw with floats" { - if (builtin.arch == .aarch64 or builtin.arch == .arm) - return; + if (builtin.arch == .aarch64 or builtin.arch == .arm or builtin.arch == .riscv64) + return error.SkipZigTest; testAtomicRmwFloat(); } diff --git a/test/stage1/behavior/cast.zig b/test/stage1/behavior/cast.zig index a70467e199..f393bfebb5 100644 --- a/test/stage1/behavior/cast.zig +++ b/test/stage1/behavior/cast.zig @@ -782,3 +782,16 @@ test "cast between [*c]T and ?[*:0]T on fn parameter" { }; S.doTheTest(); } + +test "cast between C pointer with different but compatible types" { + const S = struct { + fn foo(arg: [*]c_ushort) u16 { + return arg[0]; + } + fn doTheTest() void { + var x = [_]u16{ 4, 2, 1, 3 }; + expect(foo(@ptrCast([*]u16, &x)) == 4); + } + }; + S.doTheTest(); +}