diff --git a/src/Sema.zig b/src/Sema.zig index f5ee909caf..fdaad29995 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -10188,9 +10188,15 @@ fn analyzeAs( const dest_ty_tag = dest_ty.zigTypeTagOrPoison(mod) catch |err| switch (err) { error.GenericPoison => return operand, }; + + if (dest_ty_tag == .Opaque) { + return sema.fail(block, src, "cannot cast to opaque type '{}'", .{dest_ty.fmt(pt)}); + } + if (dest_ty_tag == .NoReturn) { return sema.fail(block, src, "cannot cast to noreturn", .{}); } + const is_ret = if (zir_dest_type.toIndex()) |ptr_index| sema.code.instructions.items(.tag)[@intFromEnum(ptr_index)] == .ret_type else diff --git a/test/cases/compile_errors/directly_embedding_opaque_type_in_struct_and_union.zig b/test/cases/compile_errors/directly_embedding_opaque_type_in_struct_and_union.zig index 0527f41634..8811d130ad 100644 --- a/test/cases/compile_errors/directly_embedding_opaque_type_in_struct_and_union.zig +++ b/test/cases/compile_errors/directly_embedding_opaque_type_in_struct_and_union.zig @@ -15,14 +15,13 @@ export fn b() void { _ = &bar; } export fn c() void { - const baz = &@as(O, undefined); - const qux = .{baz.*}; - _ = qux; + const baz = @as(O, undefined); + _ = baz; } export fn d() void { - const baz = &@as(O, undefined); - const qux = .{ .a = baz.* }; - _ = qux; + const ptr: *O = @ptrFromInt(0x1000); + const x = .{ptr.*}; + _ = x; } // error @@ -33,7 +32,7 @@ export fn d() void { // :1:11: note: opaque declared here // :7:10: error: opaque types have unknown size and therefore cannot be directly embedded in unions // :1:11: note: opaque declared here -// :19:22: error: cannot load opaque type 'tmp.O' +// :18:24: error: cannot cast to opaque type 'tmp.O' // :1:11: note: opaque declared here -// :24:28: error: cannot load opaque type 'tmp.O' +// :23:20: error: cannot load opaque type 'tmp.O' // :1:11: note: opaque declared here