| ... | ... | @@ -8288,6 +8288,7 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 8288 | 8288 | |
| 8289 | 8289 | const dest_ty = try sema.resolveType(block, dest_ty_src, extra.lhs); |
| 8290 | 8290 | const operand = try sema.resolveInst(extra.rhs); |
| 8291 | const operand_ty = sema.typeOf(operand); |
| 8291 | 8292 | switch (dest_ty.zigTypeTag()) { |
| 8292 | 8293 | .AnyFrame, |
| 8293 | 8294 | .ComptimeFloat, |
| ... | ... | @@ -8310,8 +8311,8 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 8310 | 8311 | const msg = msg: { |
| 8311 | 8312 | const msg = try sema.errMsg(block, dest_ty_src, "cannot @bitCast to '{}'", .{dest_ty.fmt(sema.mod)}); |
| 8312 | 8313 | errdefer msg.destroy(sema.gpa); |
| 8313 | | switch (sema.typeOf(operand).zigTypeTag()) { |
| 8314 | | .Int, .ComptimeInt => try sema.errNote(block, dest_ty_src, msg, "use @intToEnum for type coercion", .{}), |
| 8314 | switch (operand_ty.zigTypeTag()) { |
| 8315 | .Int, .ComptimeInt => try sema.errNote(block, dest_ty_src, msg, "use @intToEnum to cast from '{}'", .{operand_ty.fmt(sema.mod)}), |
| 8315 | 8316 | else => {}, |
| 8316 | 8317 | } |
| 8317 | 8318 | |
| ... | ... | @@ -8320,9 +8321,20 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 8320 | 8321 | return sema.failWithOwnedErrorMsg(block, msg); |
| 8321 | 8322 | }, |
| 8322 | 8323 | |
| 8323 | | .Pointer => return sema.fail(block, dest_ty_src, "cannot @bitCast to '{}', use @ptrCast to cast to a pointer", .{ |
| 8324 | | dest_ty.fmt(sema.mod), |
| 8325 | | }), |
| 8324 | .Pointer => { |
| 8325 | const msg = msg: { |
| 8326 | const msg = try sema.errMsg(block, dest_ty_src, "cannot @bitCast to '{}'", .{dest_ty.fmt(sema.mod)}); |
| 8327 | errdefer msg.destroy(sema.gpa); |
| 8328 | switch (operand_ty.zigTypeTag()) { |
| 8329 | .Int, .ComptimeInt => try sema.errNote(block, dest_ty_src, msg, "use @intToPtr to cast from '{}'", .{operand_ty.fmt(sema.mod)}), |
| 8330 | .Pointer => try sema.errNote(block, dest_ty_src, msg, "use @ptrCast to cast from '{}'", .{operand_ty.fmt(sema.mod)}), |
| 8331 | else => {}, |
| 8332 | } |
| 8333 | |
| 8334 | break :msg msg; |
| 8335 | }; |
| 8336 | return sema.failWithOwnedErrorMsg(block, msg); |
| 8337 | }, |
| 8326 | 8338 | .Struct, .Union => if (dest_ty.containerLayout() == .Auto) { |
| 8327 | 8339 | const container = switch (dest_ty.zigTypeTag()) { |
| 8328 | 8340 | .Struct => "struct", |
| ... | ... | @@ -8342,6 +8354,70 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 8342 | 8354 | .Vector, |
| 8343 | 8355 | => {}, |
| 8344 | 8356 | } |
| 8357 | switch (operand_ty.zigTypeTag()) { |
| 8358 | .AnyFrame, |
| 8359 | .ComptimeFloat, |
| 8360 | .ComptimeInt, |
| 8361 | .EnumLiteral, |
| 8362 | .ErrorSet, |
| 8363 | .ErrorUnion, |
| 8364 | .Fn, |
| 8365 | .Frame, |
| 8366 | .NoReturn, |
| 8367 | .Null, |
| 8368 | .Opaque, |
| 8369 | .Optional, |
| 8370 | .Type, |
| 8371 | .Undefined, |
| 8372 | .Void, |
| 8373 | => return sema.fail(block, operand_src, "cannot @bitCast from '{}'", .{operand_ty.fmt(sema.mod)}), |
| 8374 | |
| 8375 | .Enum => { |
| 8376 | const msg = msg: { |
| 8377 | const msg = try sema.errMsg(block, operand_src, "cannot @bitCast from '{}'", .{operand_ty.fmt(sema.mod)}); |
| 8378 | errdefer msg.destroy(sema.gpa); |
| 8379 | switch (dest_ty.zigTypeTag()) { |
| 8380 | .Int, .ComptimeInt => try sema.errNote(block, operand_src, msg, "use @enumToInt to cast to '{}'", .{dest_ty.fmt(sema.mod)}), |
| 8381 | else => {}, |
| 8382 | } |
| 8383 | |
| 8384 | break :msg msg; |
| 8385 | }; |
| 8386 | return sema.failWithOwnedErrorMsg(block, msg); |
| 8387 | }, |
| 8388 | .Pointer => { |
| 8389 | const msg = msg: { |
| 8390 | const msg = try sema.errMsg(block, operand_src, "cannot @bitCast from '{}'", .{operand_ty.fmt(sema.mod)}); |
| 8391 | errdefer msg.destroy(sema.gpa); |
| 8392 | switch (dest_ty.zigTypeTag()) { |
| 8393 | .Int, .ComptimeInt => try sema.errNote(block, operand_src, msg, "use @ptrToInt to cast to '{}'", .{dest_ty.fmt(sema.mod)}), |
| 8394 | .Pointer => try sema.errNote(block, operand_src, msg, "use @ptrCast to cast to '{}'", .{dest_ty.fmt(sema.mod)}), |
| 8395 | else => {}, |
| 8396 | } |
| 8397 | |
| 8398 | break :msg msg; |
| 8399 | }; |
| 8400 | return sema.failWithOwnedErrorMsg(block, msg); |
| 8401 | }, |
| 8402 | .Struct, .Union => if (operand_ty.containerLayout() == .Auto) { |
| 8403 | const container = switch (operand_ty.zigTypeTag()) { |
| 8404 | .Struct => "struct", |
| 8405 | .Union => "union", |
| 8406 | else => unreachable, |
| 8407 | }; |
| 8408 | return sema.fail(block, operand_src, "cannot @bitCast from '{}', {s} does not have a guaranteed in-memory layout", .{ |
| 8409 | operand_ty.fmt(sema.mod), container, |
| 8410 | }); |
| 8411 | }, |
| 8412 | .BoundFn => @panic("TODO remove this type from the language and compiler"), |
| 8413 | |
| 8414 | .Array, |
| 8415 | .Bool, |
| 8416 | .Float, |
| 8417 | .Int, |
| 8418 | .Vector, |
| 8419 | => {}, |
| 8420 | } |
| 8345 | 8421 | return sema.bitCast(block, dest_ty, operand, operand_src); |
| 8346 | 8422 | } |
| 8347 | 8423 | |