Closed
Description
Zig Version
0.11.0-dev.2912+d65b42e07
Steps to Reproduce and Observed Behavior
I'm not confident that the title is the correct way to frame the issue. But the following code leads to compiler crash below.
// /tmp/tmp.zig
test {
var value: f64 = undefined;
var word: u64 = undefined;
@memcpy(@ptrCast([*]u8, &value), @ptrCast([*]const u8, &word)[0..@sizeOf(f64)]);
// properly slicing dest does not cause the crash
// @memcpy(@ptrCast([*]u8, &value)[0..@sizeOf(f64)], @ptrCast([*]const u8, &word)[0..@sizeOf(f64)]);
}
$ zig version
0.11.0-dev.2912+d65b42e07
$ zig test /tmp/tmp.zig
thread 72774 panic: reached unreachable code
~/projects/zig/zig/src/codegen/llvm.zig:5807:26: 0x1828d6f in sliceOrArrayLenInBytes (zig)
.Many, .C => unreachable,
^
~/projects/zig/zig/src/codegen/llvm.zig:8553:48: 0x18290a2 in airMemcpy (zig)
const len = self.sliceOrArrayLenInBytes(dest_slice, dest_ptr_ty);
^
~/projects/zig/zig/src/codegen/llvm.zig:4678:54: 0x11cfcfd in genBody (zig)
.memcpy => try self.airMemcpy(inst),
^
~/projects/zig/zig/src/codegen/llvm.zig:1232:35: 0x11c9e51 in updateFunc (zig)
fg.genBody(air.getMainBody()) catch |err| switch (err) {
^
~/projects/zig/zig/src/link/Elf.zig:2533:74: 0x11d2b2e in updateFunc (zig)
if (self.llvm_object) |llvm_object| return llvm_object.updateFunc(module, func, air, liveness);
^
~/projects/zig/zig/src/link.zig:578:77: 0xf0794d in updateFunc (zig)
.elf => return @fieldParentPtr(Elf, "base", base).updateFunc(module, func, air, liveness),
^
~/projects/zig/zig/src/Module.zig:4383:37: 0xcca74c in ensureFuncBodyAnalyzed (zig)
comp.bin_file.updateFunc(mod, func, air, liveness) catch |err| switch (err) {
^
~/projects/zig/zig/src/Compilation.zig:3127:42: 0xcc7c5d in processOneJob (zig)
module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
^
~/projects/zig/zig/src/Compilation.zig:3064:30: 0xb5961e in performAllTheWork (zig)
try processOneJob(comp, work_item, main_progress_node);
^
~/projects/zig/zig/src/Compilation.zig:2020:31: 0xb5596d in update (zig)
try comp.performAllTheWork(main_progress_node);
^
~/projects/zig/zig/src/main.zig:3820:24: 0xb87104 in updateModule (zig)
try comp.update(main_progress_node);
^
~/projects/zig/zig/src/main.zig:3255:17: 0x9f397e in buildOutputType (zig)
updateModule(comp) catch |err| switch (err) {
^
~/projects/zig/zig/src/main.zig:273:31: 0x9c4806 in mainArgs (zig)
return buildOutputType(gpa, arena, args, .zig_test);
^
~/projects/zig/zig/src/main.zig:211:20: 0x9c3a85 in main (zig)
return mainArgs(gpa, arena, args);
^
~/projects/zig/zig/lib/std/start.zig:609:37: 0x9c63a4 in main (zig)
const result = root.main() catch |err| {
^
Aborted
Expected Behavior
no crash. i would expect this to compile as dest is allowed to be a multiptr in the docs.