| ... | @@ -8288,6 +8288,7 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air | ... | @@ -8288,6 +8288,7 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 8288 | | 8288 | |
| 8289 | const dest_ty = try sema.resolveType(block, dest_ty_src, extra.lhs); | 8289 | const dest_ty = try sema.resolveType(block, dest_ty_src, extra.lhs); |
| 8290 | const operand = try sema.resolveInst(extra.rhs); | 8290 | const operand = try sema.resolveInst(extra.rhs); |
| | 8291 | const operand_ty = sema.typeOf(operand); |
| 8291 | switch (dest_ty.zigTypeTag()) { | 8292 | switch (dest_ty.zigTypeTag()) { |
| 8292 | .AnyFrame, | 8293 | .AnyFrame, |
| 8293 | .ComptimeFloat, | 8294 | .ComptimeFloat, |
| ... | @@ -8310,8 +8311,8 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air | ... | @@ -8310,8 +8311,8 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 8310 | const msg = msg: { | 8311 | const msg = msg: { |
| 8311 | const msg = try sema.errMsg(block, dest_ty_src, "cannot @bitCast to '{}'", .{dest_ty.fmt(sema.mod)}); | 8312 | const msg = try sema.errMsg(block, dest_ty_src, "cannot @bitCast to '{}'", .{dest_ty.fmt(sema.mod)}); |
| 8312 | errdefer msg.destroy(sema.gpa); | 8313 | errdefer msg.destroy(sema.gpa); |
| 8313 | switch (sema.typeOf(operand).zigTypeTag()) { | 8314 | switch (operand_ty.zigTypeTag()) { |
| 8314 | .Int, .ComptimeInt => try sema.errNote(block, dest_ty_src, msg, "use @intToEnum for type coercion", .{}), | 8315 | .Int, .ComptimeInt => try sema.errNote(block, dest_ty_src, msg, "use @intToEnum to cast from '{}'", .{operand_ty.fmt(sema.mod)}), |
| 8315 | else => {}, | 8316 | else => {}, |
| 8316 | } | 8317 | } |
| 8317 | | 8318 | |
| ... | @@ -8320,9 +8321,20 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air | ... | @@ -8320,9 +8321,20 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 8320 | return sema.failWithOwnedErrorMsg(block, msg); | 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 | .Pointer => { |
| 8324 | dest_ty.fmt(sema.mod), | 8325 | const msg = msg: { |
| 8325 | }), | 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 | .Struct, .Union => if (dest_ty.containerLayout() == .Auto) { | 8338 | .Struct, .Union => if (dest_ty.containerLayout() == .Auto) { |
| 8327 | const container = switch (dest_ty.zigTypeTag()) { | 8339 | const container = switch (dest_ty.zigTypeTag()) { |
| 8328 | .Struct => "struct", | 8340 | .Struct => "struct", |
| ... | @@ -8342,6 +8354,70 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air | ... | @@ -8342,6 +8354,70 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air |
| 8342 | .Vector, | 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 | return sema.bitCast(block, dest_ty, operand, operand_src); | 8421 | return sema.bitCast(block, dest_ty, operand, operand_src); |
| 8346 | } | 8422 | } |
| 8347 | | 8423 | |