| ... | @@ -1110,14 +1110,16 @@ pub const DeclGen = struct { | ... | @@ -1110,14 +1110,16 @@ pub const DeclGen = struct { |
| 1110 | | 1110 | |
| 1111 | .undef, .runtime_value => unreachable, // handled above | 1111 | .undef, .runtime_value => unreachable, // handled above |
| 1112 | .simple_value => |simple_value| switch (simple_value) { | 1112 | .simple_value => |simple_value| switch (simple_value) { |
| 1113 | .undefined, | 1113 | // non-runtime values |
| 1114 | .void, | 1114 | .undefined => unreachable, |
| 1115 | .null, | 1115 | .void => unreachable, |
| 1116 | .empty_struct, | 1116 | .null => unreachable, |
| 1117 | .@"unreachable", | 1117 | .empty_struct => unreachable, |
| 1118 | .generic_poison, | 1118 | .@"unreachable" => unreachable, |
| 1119 | => unreachable, // non-runtime values | 1119 | .generic_poison => unreachable, |
| 1120 | .false, .true => try writer.writeAll(@tagName(simple_value)), | 1120 | |
| | 1121 | .false => try writer.writeAll("false"), |
| | 1122 | .true => try writer.writeAll("true"), |
| 1121 | }, | 1123 | }, |
| 1122 | .variable, | 1124 | .variable, |
| 1123 | .extern_func, | 1125 | .extern_func, |
| ... | @@ -1138,10 +1140,10 @@ pub const DeclGen = struct { | ... | @@ -1138,10 +1140,10 @@ pub const DeclGen = struct { |
| 1138 | .error_union => |error_union| { | 1140 | .error_union => |error_union| { |
| 1139 | const payload_ty = ty.errorUnionPayload(mod); | 1141 | const payload_ty = ty.errorUnionPayload(mod); |
| 1140 | const error_ty = ty.errorUnionSet(mod); | 1142 | const error_ty = ty.errorUnionSet(mod); |
| 1141 | const error_val = if (val.errorUnionIsPayload(mod)) try mod.intValue(Type.anyerror, 0) else val; | 1143 | const error_val = if (val.errorUnionIsPayload(mod)) try mod.intValue(Type.err_int, 0) else val; |
| 1142 | | 1144 | |
| 1143 | if (!payload_ty.hasRuntimeBitsIgnoreComptime(mod)) { | 1145 | if (!payload_ty.hasRuntimeBitsIgnoreComptime(mod)) { |
| 1144 | return dg.renderValue(writer, error_ty, error_val, location); | 1146 | return dg.renderValue(writer, Type.err_int, error_val, location); |
| 1145 | } | 1147 | } |
| 1146 | | 1148 | |
| 1147 | if (!location.isInitializer()) { | 1149 | if (!location.isInitializer()) { |
| ... | @@ -1305,12 +1307,10 @@ pub const DeclGen = struct { | ... | @@ -1305,12 +1307,10 @@ pub const DeclGen = struct { |
| 1305 | if (!payload_ty.hasRuntimeBitsIgnoreComptime(mod)) | 1307 | if (!payload_ty.hasRuntimeBitsIgnoreComptime(mod)) |
| 1306 | return dg.renderValue(writer, Type.bool, is_null_val, location); | 1308 | return dg.renderValue(writer, Type.bool, is_null_val, location); |
| 1307 | | 1309 | |
| 1308 | if (ty.optionalReprIsPayload(mod)) { | 1310 | if (ty.optionalReprIsPayload(mod)) switch (opt.val) { |
| 1309 | return dg.renderValue(writer, payload_ty, switch (opt.val) { | 1311 | .none => return writer.writeByte('0'), |
| 1310 | .none => try mod.intValue(payload_ty, 0), | 1312 | else => return dg.renderValue(writer, payload_ty, opt.val.toValue(), location), |
| 1311 | else => opt.val.toValue(), | 1313 | }; |
| 1312 | }, location); | | |
| 1313 | } | | |
| 1314 | | 1314 | |
| 1315 | if (!location.isInitializer()) { | 1315 | if (!location.isInitializer()) { |
| 1316 | try writer.writeByte('('); | 1316 | try writer.writeByte('('); |
| ... | @@ -1327,7 +1327,7 @@ pub const DeclGen = struct { | ... | @@ -1327,7 +1327,7 @@ pub const DeclGen = struct { |
| 1327 | try dg.renderValue(writer, Type.bool, is_null_val, initializer_type); | 1327 | try dg.renderValue(writer, Type.bool, is_null_val, initializer_type); |
| 1328 | try writer.writeAll(" }"); | 1328 | try writer.writeAll(" }"); |
| 1329 | }, | 1329 | }, |
| 1330 | .aggregate => switch (mod.intern_pool.indexToKey(ty.ip_index)) { | 1330 | .aggregate => |aggregate| switch (mod.intern_pool.indexToKey(ty.ip_index)) { |
| 1331 | .array_type, .vector_type => { | 1331 | .array_type, .vector_type => { |
| 1332 | if (location == .FunctionArgument) { | 1332 | if (location == .FunctionArgument) { |
| 1333 | try writer.writeByte('('); | 1333 | try writer.writeByte('('); |
| ... | @@ -1385,131 +1385,179 @@ pub const DeclGen = struct { | ... | @@ -1385,131 +1385,179 @@ pub const DeclGen = struct { |
| 1385 | try writer.writeByte('}'); | 1385 | try writer.writeByte('}'); |
| 1386 | } | 1386 | } |
| 1387 | }, | 1387 | }, |
| 1388 | .struct_type, .anon_struct_type => switch (ty.containerLayout(mod)) { | 1388 | .anon_struct_type => |tuple| { |
| 1389 | .Auto, .Extern => { | 1389 | if (!location.isInitializer()) { |
| 1390 | const field_vals = val.castTag(.aggregate).?.data; | 1390 | try writer.writeByte('('); |
| 1391 | | 1391 | try dg.renderType(writer, ty); |
| 1392 | if (!location.isInitializer()) { | 1392 | try writer.writeByte(')'); |
| 1393 | try writer.writeByte('('); | 1393 | } |
| 1394 | try dg.renderType(writer, ty); | | |
| 1395 | try writer.writeByte(')'); | | |
| 1396 | } | | |
| 1397 | | | |
| 1398 | try writer.writeByte('{'); | | |
| 1399 | var empty = true; | | |
| 1400 | for (field_vals, 0..) |field_val, field_i| { | | |
| 1401 | if (ty.structFieldIsComptime(field_i, mod)) continue; | | |
| 1402 | const field_ty = ty.structFieldType(field_i, mod); | | |
| 1403 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; | | |
| 1404 | | | |
| 1405 | if (!empty) try writer.writeByte(','); | | |
| 1406 | try dg.renderValue(writer, field_ty, field_val, initializer_type); | | |
| 1407 | | 1394 | |
| 1408 | empty = false; | 1395 | try writer.writeByte('{'); |
| 1409 | } | 1396 | var empty = true; |
| 1410 | try writer.writeByte('}'); | 1397 | for (tuple.types, tuple.values, 0..) |field_ty, comptime_ty, field_i| { |
| 1411 | }, | 1398 | if (comptime_ty != .none) continue; |
| 1412 | .Packed => { | 1399 | if (!field_ty.toType().hasRuntimeBitsIgnoreComptime(mod)) continue; |
| 1413 | const field_vals = val.castTag(.aggregate).?.data; | | |
| 1414 | const int_info = ty.intInfo(mod); | | |
| 1415 | | 1400 | |
| 1416 | const bits = Type.smallestUnsignedBits(int_info.bits - 1); | 1401 | if (!empty) try writer.writeByte(','); |
| 1417 | const bit_offset_ty = try mod.intType(.unsigned, bits); | | |
| 1418 | | 1402 | |
| 1419 | var bit_offset: u64 = 0; | 1403 | const field_val = switch (aggregate.storage) { |
| | 1404 | .bytes => |bytes| try mod.intern_pool.get(mod.gpa, .{ .int = .{ |
| | 1405 | .ty = field_ty, |
| | 1406 | .storage = .{ .u64 = bytes[field_i] }, |
| | 1407 | } }), |
| | 1408 | .elems => |elems| elems[field_i], |
| | 1409 | .repeated_elem => |elem| elem, |
| | 1410 | }; |
| | 1411 | try dg.renderValue(writer, field_ty.toType(), field_val.toValue(), initializer_type); |
| 1420 | | 1412 | |
| 1421 | var eff_num_fields: usize = 0; | 1413 | empty = false; |
| 1422 | for (0..field_vals.len) |field_i| { | 1414 | } |
| 1423 | if (ty.structFieldIsComptime(field_i, mod)) continue; | 1415 | try writer.writeByte('}'); |
| 1424 | const field_ty = ty.structFieldType(field_i, mod); | 1416 | }, |
| 1425 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; | 1417 | .struct_type => |struct_type| { |
| | 1418 | const struct_obj = mod.structPtrUnwrap(struct_type.index).?; |
| | 1419 | switch (struct_obj.layout) { |
| | 1420 | .Auto, .Extern => { |
| | 1421 | if (!location.isInitializer()) { |
| | 1422 | try writer.writeByte('('); |
| | 1423 | try dg.renderType(writer, ty); |
| | 1424 | try writer.writeByte(')'); |
| | 1425 | } |
| 1426 | | 1426 | |
| 1427 | eff_num_fields += 1; | 1427 | try writer.writeByte('{'); |
| 1428 | } | 1428 | var empty = true; |
| | 1429 | for (struct_obj.fields.values(), 0..) |field, field_i| { |
| | 1430 | if (field.is_comptime) continue; |
| | 1431 | if (!field.ty.hasRuntimeBitsIgnoreComptime(mod)) continue; |
| | 1432 | |
| | 1433 | if (!empty) try writer.writeByte(','); |
| | 1434 | const field_val = switch (aggregate.storage) { |
| | 1435 | .bytes => |bytes| try mod.intern_pool.get(mod.gpa, .{ .int = .{ |
| | 1436 | .ty = field.ty.toIntern(), |
| | 1437 | .storage = .{ .u64 = bytes[field_i] }, |
| | 1438 | } }), |
| | 1439 | .elems => |elems| elems[field_i], |
| | 1440 | .repeated_elem => |elem| elem, |
| | 1441 | }; |
| | 1442 | try dg.renderValue(writer, field.ty, field_val.toValue(), initializer_type); |
| 1429 | | 1443 | |
| 1430 | if (eff_num_fields == 0) { | 1444 | empty = false; |
| 1431 | try writer.writeByte('('); | | |
| 1432 | try dg.renderValue(writer, ty, Value.undef, initializer_type); | | |
| 1433 | try writer.writeByte(')'); | | |
| 1434 | } else if (ty.bitSize(mod) > 64) { | | |
| 1435 | // zig_or_u128(zig_or_u128(zig_shl_u128(a, a_off), zig_shl_u128(b, b_off)), zig_shl_u128(c, c_off)) | | |
| 1436 | var num_or = eff_num_fields - 1; | | |
| 1437 | while (num_or > 0) : (num_or -= 1) { | | |
| 1438 | try writer.writeAll("zig_or_"); | | |
| 1439 | try dg.renderTypeForBuiltinFnName(writer, ty); | | |
| 1440 | try writer.writeByte('('); | | |
| 1441 | } | 1445 | } |
| | 1446 | try writer.writeByte('}'); |
| | 1447 | }, |
| | 1448 | .Packed => { |
| | 1449 | const int_info = ty.intInfo(mod); |
| 1442 | | 1450 | |
| 1443 | var eff_index: usize = 0; | 1451 | const bits = Type.smallestUnsignedBits(int_info.bits - 1); |
| 1444 | var needs_closing_paren = false; | 1452 | const bit_offset_ty = try mod.intType(.unsigned, bits); |
| 1445 | for (field_vals, 0..) |field_val, field_i| { | | |
| 1446 | if (ty.structFieldIsComptime(field_i, mod)) continue; | | |
| 1447 | const field_ty = ty.structFieldType(field_i, mod); | | |
| 1448 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; | | |
| 1449 | | 1453 | |
| 1450 | const cast_context = IntCastContext{ .value = .{ .value = field_val } }; | 1454 | var bit_offset: u64 = 0; |
| 1451 | if (bit_offset != 0) { | 1455 | var eff_num_fields: usize = 0; |
| 1452 | try writer.writeAll("zig_shl_"); | | |
| 1453 | try dg.renderTypeForBuiltinFnName(writer, ty); | | |
| 1454 | try writer.writeByte('('); | | |
| 1455 | try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument); | | |
| 1456 | try writer.writeAll(", "); | | |
| 1457 | const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); | | |
| 1458 | try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); | | |
| 1459 | try writer.writeByte(')'); | | |
| 1460 | } else { | | |
| 1461 | try dg.renderIntCast(writer, ty, cast_context, field_ty, .FunctionArgument); | | |
| 1462 | } | | |
| 1463 | | 1456 | |
| 1464 | if (needs_closing_paren) try writer.writeByte(')'); | 1457 | for (struct_obj.fields.values()) |field| { |
| 1465 | if (eff_index != eff_num_fields - 1) try writer.writeAll(", "); | 1458 | if (field.is_comptime) continue; |
| | 1459 | if (!field.ty.hasRuntimeBitsIgnoreComptime(mod)) continue; |
| 1466 | | 1460 | |
| 1467 | bit_offset += field_ty.bitSize(mod); | 1461 | eff_num_fields += 1; |
| 1468 | needs_closing_paren = true; | | |
| 1469 | eff_index += 1; | | |
| 1470 | } | 1462 | } |
| 1471 | } else { | | |
| 1472 | try writer.writeByte('('); | | |
| 1473 | // a << a_off | b << b_off | c << c_off | | |
| 1474 | var empty = true; | | |
| 1475 | for (field_vals, 0..) |field_val, field_i| { | | |
| 1476 | if (ty.structFieldIsComptime(field_i, mod)) continue; | | |
| 1477 | const field_ty = ty.structFieldType(field_i, mod); | | |
| 1478 | if (!field_ty.hasRuntimeBitsIgnoreComptime(mod)) continue; | | |
| 1479 | | 1463 | |
| 1480 | if (!empty) try writer.writeAll(" | "); | 1464 | if (eff_num_fields == 0) { |
| 1481 | try writer.writeByte('('); | 1465 | try writer.writeByte('('); |
| 1482 | try dg.renderType(writer, ty); | 1466 | try dg.renderValue(writer, ty, Value.undef, initializer_type); |
| 1483 | try writer.writeByte(')'); | 1467 | try writer.writeByte(')'); |
| | 1468 | } else if (ty.bitSize(mod) > 64) { |
| | 1469 | // zig_or_u128(zig_or_u128(zig_shl_u128(a, a_off), zig_shl_u128(b, b_off)), zig_shl_u128(c, c_off)) |
| | 1470 | var num_or = eff_num_fields - 1; |
| | 1471 | while (num_or > 0) : (num_or -= 1) { |
| | 1472 | try writer.writeAll("zig_or_"); |
| | 1473 | try dg.renderTypeForBuiltinFnName(writer, ty); |
| | 1474 | try writer.writeByte('('); |
| | 1475 | } |
| 1484 | | 1476 | |
| 1485 | if (bit_offset != 0) { | 1477 | var eff_index: usize = 0; |
| 1486 | try dg.renderValue(writer, field_ty, field_val, .Other); | 1478 | var needs_closing_paren = false; |
| 1487 | try writer.writeAll(" << "); | 1479 | for (struct_obj.fields.values(), 0..) |field, field_i| { |
| 1488 | const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); | 1480 | if (field.is_comptime) continue; |
| 1489 | try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); | 1481 | if (!field.ty.hasRuntimeBitsIgnoreComptime(mod)) continue; |
| 1490 | } else { | 1482 | |
| 1491 | try dg.renderValue(writer, field_ty, field_val, .Other); | 1483 | const field_val = switch (aggregate.storage) { |
| | 1484 | .bytes => |bytes| try mod.intern_pool.get(mod.gpa, .{ .int = .{ |
| | 1485 | .ty = field.ty.toIntern(), |
| | 1486 | .storage = .{ .u64 = bytes[field_i] }, |
| | 1487 | } }), |
| | 1488 | .elems => |elems| elems[field_i], |
| | 1489 | .repeated_elem => |elem| elem, |
| | 1490 | }; |
| | 1491 | const cast_context = IntCastContext{ .value = .{ .value = field_val.toValue() } }; |
| | 1492 | if (bit_offset != 0) { |
| | 1493 | try writer.writeAll("zig_shl_"); |
| | 1494 | try dg.renderTypeForBuiltinFnName(writer, ty); |
| | 1495 | try writer.writeByte('('); |
| | 1496 | try dg.renderIntCast(writer, ty, cast_context, field.ty, .FunctionArgument); |
| | 1497 | try writer.writeAll(", "); |
| | 1498 | const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); |
| | 1499 | try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); |
| | 1500 | try writer.writeByte(')'); |
| | 1501 | } else { |
| | 1502 | try dg.renderIntCast(writer, ty, cast_context, field.ty, .FunctionArgument); |
| | 1503 | } |
| | 1504 | |
| | 1505 | if (needs_closing_paren) try writer.writeByte(')'); |
| | 1506 | if (eff_index != eff_num_fields - 1) try writer.writeAll(", "); |
| | 1507 | |
| | 1508 | bit_offset += field.ty.bitSize(mod); |
| | 1509 | needs_closing_paren = true; |
| | 1510 | eff_index += 1; |
| 1492 | } | 1511 | } |
| | 1512 | } else { |
| | 1513 | try writer.writeByte('('); |
| | 1514 | // a << a_off | b << b_off | c << c_off |
| | 1515 | var empty = true; |
| | 1516 | for (struct_obj.fields.values(), 0..) |field, field_i| { |
| | 1517 | if (field.is_comptime) continue; |
| | 1518 | if (!field.ty.hasRuntimeBitsIgnoreComptime(mod)) continue; |
| 1493 | | 1519 | |
| 1494 | bit_offset += field_ty.bitSize(mod); | 1520 | if (!empty) try writer.writeAll(" | "); |
| 1495 | empty = false; | 1521 | try writer.writeByte('('); |
| | 1522 | try dg.renderType(writer, ty); |
| | 1523 | try writer.writeByte(')'); |
| | 1524 | |
| | 1525 | const field_val = switch (aggregate.storage) { |
| | 1526 | .bytes => |bytes| try mod.intern_pool.get(mod.gpa, .{ .int = .{ |
| | 1527 | .ty = field.ty.toIntern(), |
| | 1528 | .storage = .{ .u64 = bytes[field_i] }, |
| | 1529 | } }), |
| | 1530 | .elems => |elems| elems[field_i], |
| | 1531 | .repeated_elem => |elem| elem, |
| | 1532 | }; |
| | 1533 | |
| | 1534 | if (bit_offset != 0) { |
| | 1535 | try dg.renderValue(writer, field.ty, field_val.toValue(), .Other); |
| | 1536 | try writer.writeAll(" << "); |
| | 1537 | const bit_offset_val = try mod.intValue(bit_offset_ty, bit_offset); |
| | 1538 | try dg.renderValue(writer, bit_offset_ty, bit_offset_val, .FunctionArgument); |
| | 1539 | } else { |
| | 1540 | try dg.renderValue(writer, field.ty, field_val.toValue(), .Other); |
| | 1541 | } |
| | 1542 | |
| | 1543 | bit_offset += field.ty.bitSize(mod); |
| | 1544 | empty = false; |
| | 1545 | } |
| | 1546 | try writer.writeByte(')'); |
| 1496 | } | 1547 | } |
| 1497 | try writer.writeByte(')'); | 1548 | }, |
| 1498 | } | 1549 | } |
| 1499 | }, | | |
| 1500 | }, | 1550 | }, |
| 1501 | else => unreachable, | 1551 | else => unreachable, |
| 1502 | }, | 1552 | }, |
| 1503 | .un => { | 1553 | .un => |un| { |
| 1504 | const union_obj = val.castTag(.@"union").?.data; | | |
| 1505 | | | |
| 1506 | if (!location.isInitializer()) { | 1554 | if (!location.isInitializer()) { |
| 1507 | try writer.writeByte('('); | 1555 | try writer.writeByte('('); |
| 1508 | try dg.renderType(writer, ty); | 1556 | try dg.renderType(writer, ty); |
| 1509 | try writer.writeByte(')'); | 1557 | try writer.writeByte(')'); |
| 1510 | } | 1558 | } |
| 1511 | | 1559 | |
| 1512 | const field_i = ty.unionTagFieldIndex(union_obj.tag, mod).?; | 1560 | const field_i = ty.unionTagFieldIndex(un.tag.toValue(), mod).?; |
| 1513 | const field_ty = ty.unionFields(mod).values()[field_i].ty; | 1561 | const field_ty = ty.unionFields(mod).values()[field_i].ty; |
| 1514 | const field_name = ty.unionFields(mod).keys()[field_i]; | 1562 | const field_name = ty.unionFields(mod).keys()[field_i]; |
| 1515 | if (ty.containerLayout(mod) == .Packed) { | 1563 | if (ty.containerLayout(mod) == .Packed) { |
| ... | @@ -1523,7 +1571,7 @@ pub const DeclGen = struct { | ... | @@ -1523,7 +1571,7 @@ pub const DeclGen = struct { |
| 1523 | try dg.renderType(writer, ty); | 1571 | try dg.renderType(writer, ty); |
| 1524 | try writer.writeByte(')'); | 1572 | try writer.writeByte(')'); |
| 1525 | } | 1573 | } |
| 1526 | try dg.renderValue(writer, field_ty, union_obj.val, initializer_type); | 1574 | try dg.renderValue(writer, field_ty, un.val.toValue(), initializer_type); |
| 1527 | } else { | 1575 | } else { |
| 1528 | try writer.writeAll("0"); | 1576 | try writer.writeAll("0"); |
| 1529 | } | 1577 | } |
| ... | @@ -1535,7 +1583,7 @@ pub const DeclGen = struct { | ... | @@ -1535,7 +1583,7 @@ pub const DeclGen = struct { |
| 1535 | const layout = ty.unionGetLayout(mod); | 1583 | const layout = ty.unionGetLayout(mod); |
| 1536 | if (layout.tag_size != 0) { | 1584 | if (layout.tag_size != 0) { |
| 1537 | try writer.writeAll(" .tag = "); | 1585 | try writer.writeAll(" .tag = "); |
| 1538 | try dg.renderValue(writer, tag_ty, union_obj.tag, initializer_type); | 1586 | try dg.renderValue(writer, tag_ty, un.tag.toValue(), initializer_type); |
| 1539 | } | 1587 | } |
| 1540 | if (ty.unionHasAllZeroBitFieldTypes(mod)) return try writer.writeByte('}'); | 1588 | if (ty.unionHasAllZeroBitFieldTypes(mod)) return try writer.writeByte('}'); |
| 1541 | if (layout.tag_size != 0) try writer.writeByte(','); | 1589 | if (layout.tag_size != 0) try writer.writeByte(','); |
| ... | @@ -1543,7 +1591,7 @@ pub const DeclGen = struct { | ... | @@ -1543,7 +1591,7 @@ pub const DeclGen = struct { |
| 1543 | } | 1591 | } |
| 1544 | if (field_ty.hasRuntimeBits(mod)) { | 1592 | if (field_ty.hasRuntimeBits(mod)) { |
| 1545 | try writer.print(" .{ } = ", .{fmtIdent(field_name)}); | 1593 | try writer.print(" .{ } = ", .{fmtIdent(field_name)}); |
| 1546 | try dg.renderValue(writer, field_ty, union_obj.val, initializer_type); | 1594 | try dg.renderValue(writer, field_ty, un.val.toValue(), initializer_type); |
| 1547 | try writer.writeByte(' '); | 1595 | try writer.writeByte(' '); |
| 1548 | } else for (ty.unionFields(mod).values()) |field| { | 1596 | } else for (ty.unionFields(mod).values()) |field| { |
| 1549 | if (!field.ty.hasRuntimeBits(mod)) continue; | 1597 | if (!field.ty.hasRuntimeBits(mod)) continue; |
| ... | @@ -5113,13 +5161,14 @@ fn airIsNull( | ... | @@ -5113,13 +5161,14 @@ fn airIsNull( |
| 5113 | TypedValue{ .ty = Type.bool, .val = Value.true } | 5161 | TypedValue{ .ty = Type.bool, .val = Value.true } |
| 5114 | else if (optional_ty.isPtrLikeOptional(mod)) | 5162 | else if (optional_ty.isPtrLikeOptional(mod)) |
| 5115 | // operand is a regular pointer, test `operand !=/== NULL` | 5163 | // operand is a regular pointer, test `operand !=/== NULL` |
| 5116 | TypedValue{ .ty = optional_ty, .val = Value.null } | 5164 | TypedValue{ .ty = optional_ty, .val = try mod.nullValue(optional_ty) } |
| 5117 | else if (payload_ty.zigTypeTag(mod) == .ErrorSet) | 5165 | else if (payload_ty.zigTypeTag(mod) == .ErrorSet) |
| 5118 | TypedValue{ .ty = payload_ty, .val = try mod.intValue(payload_ty, 0) } | 5166 | TypedValue{ .ty = Type.err_int, .val = try mod.intValue(Type.err_int, 0) } |
| 5119 | else if (payload_ty.isSlice(mod) and optional_ty.optionalReprIsPayload(mod)) rhs: { | 5167 | else if (payload_ty.isSlice(mod) and optional_ty.optionalReprIsPayload(mod)) rhs: { |
| 5120 | try writer.writeAll(".ptr"); | 5168 | try writer.writeAll(".ptr"); |
| 5121 | const slice_ptr_ty = payload_ty.slicePtrFieldType(mod); | 5169 | const slice_ptr_ty = payload_ty.slicePtrFieldType(mod); |
| 5122 | break :rhs TypedValue{ .ty = slice_ptr_ty, .val = Value.null }; | 5170 | const opt_slice_ptr_ty = try mod.optionalType(slice_ptr_ty.toIntern()); |
| | 5171 | break :rhs TypedValue{ .ty = opt_slice_ptr_ty, .val = try mod.nullValue(opt_slice_ptr_ty) }; |
| 5123 | } else rhs: { | 5172 | } else rhs: { |
| 5124 | try writer.writeAll(".is_null"); | 5173 | try writer.writeAll(".is_null"); |
| 5125 | break :rhs TypedValue{ .ty = Type.bool, .val = Value.true }; | 5174 | break :rhs TypedValue{ .ty = Type.bool, .val = Value.true }; |
| ... | @@ -5781,7 +5830,7 @@ fn airWrapErrUnionPay(f: *Function, inst: Air.Inst.Index) !CValue { | ... | @@ -5781,7 +5830,7 @@ fn airWrapErrUnionPay(f: *Function, inst: Air.Inst.Index) !CValue { |
| 5781 | else | 5830 | else |
| 5782 | try f.writeCValueMember(writer, local, .{ .identifier = "error" }); | 5831 | try f.writeCValueMember(writer, local, .{ .identifier = "error" }); |
| 5783 | try a.assign(f, writer); | 5832 | try a.assign(f, writer); |
| 5784 | try f.object.dg.renderValue(writer, err_ty, try mod.intValue(err_ty, 0), .Other); | 5833 | try f.object.dg.renderValue(writer, Type.err_int, try mod.intValue(Type.err_int, 0), .Other); |
| 5785 | try a.end(f, writer); | 5834 | try a.end(f, writer); |
| 5786 | } | 5835 | } |
| 5787 | return local; | 5836 | return local; |
| ... | @@ -5812,11 +5861,11 @@ fn airIsErr(f: *Function, inst: Air.Inst.Index, is_ptr: bool, operator: []const | ... | @@ -5812,11 +5861,11 @@ fn airIsErr(f: *Function, inst: Air.Inst.Index, is_ptr: bool, operator: []const |
| 5812 | else | 5861 | else |
| 5813 | try f.writeCValue(writer, operand, .Other) | 5862 | try f.writeCValue(writer, operand, .Other) |
| 5814 | else | 5863 | else |
| 5815 | try f.object.dg.renderValue(writer, error_ty, try mod.intValue(error_ty, 0), .Other); | 5864 | try f.object.dg.renderValue(writer, Type.err_int, try mod.intValue(Type.err_int, 0), .Other); |
| 5816 | try writer.writeByte(' '); | 5865 | try writer.writeByte(' '); |
| 5817 | try writer.writeAll(operator); | 5866 | try writer.writeAll(operator); |
| 5818 | try writer.writeByte(' '); | 5867 | try writer.writeByte(' '); |
| 5819 | try f.object.dg.renderValue(writer, error_ty, try mod.intValue(error_ty, 0), .Other); | 5868 | try f.object.dg.renderValue(writer, Type.err_int, try mod.intValue(Type.err_int, 0), .Other); |
| 5820 | try writer.writeAll(";\n"); | 5869 | try writer.writeAll(";\n"); |
| 5821 | return local; | 5870 | return local; |
| 5822 | } | 5871 | } |