authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-25 07:08:48-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-06-10 20:47:55-07:00
log72e4ea38216aab7e7ed05978d04c5d32de44b5ce
tree9b11f31d39590a767d420dd036682438a6ede634
parent1a4626d2cf8b9985833f97b6fea6ea03011ada4e

InternPool: fix crashes up to in progress comptime mutation


4 files changed, 132 insertions(+), 91 deletions(-)

src/InternPool.zig+29-16
......@@ -730,21 +730,11 @@ pub const Key = union(enum) {
730730
731731 switch (aggregate.storage) {
732732 .bytes => unreachable,
733 .elems => |elems| {
734 var buffer: Key.Int.Storage.BigIntSpace = undefined;
735 for (elems) |elem| std.hash.autoHash(
736 hasher,
737 ip.indexToKey(elem).int.storage.toBigInt(&buffer).to(u8) catch
738 unreachable,
739 );
740 },
733 .elems => |elems| for (elems) |elem| std.hash.autoHash(hasher, elem),
741734 .repeated_elem => |elem| {
742735 const len = ip.aggregateTypeLen(aggregate.ty);
743 var buffer: Key.Int.Storage.BigIntSpace = undefined;
744 const byte = ip.indexToKey(elem).int.storage.toBigInt(&buffer).to(u8) catch
745 unreachable;
746736 var i: u64 = 0;
747 while (i < len) : (i += 1) std.hash.autoHash(hasher, byte);
737 while (i < len) : (i += 1) std.hash.autoHash(hasher, elem);
748738 },
749739 }
750740 },
......@@ -2044,6 +2034,10 @@ pub const Alignment = enum(u6) {
20442034 assert(n != 0);
20452035 return fromByteUnits(n);
20462036 }
2037
2038 pub fn min(a: Alignment, b: Alignment) Alignment {
2039 return @intToEnum(Alignment, @min(@enumToInt(a), @enumToInt(b)));
2040 }
20472041};
20482042
20492043/// Used for non-sentineled arrays that have length fitting in u32, as well as
......@@ -3514,16 +3508,35 @@ pub fn get(ip: *InternPool, gpa: Allocator, key: Key) Allocator.Error!Index {
35143508 const ty_key = ip.indexToKey(aggregate.ty);
35153509 const aggregate_len = ip.aggregateTypeLen(aggregate.ty);
35163510 switch (aggregate.storage) {
3517 .bytes => {
3511 .bytes => |bytes| {
35183512 assert(ty_key.array_type.child == .u8_type);
3513 assert(bytes.len == aggregate_len);
35193514 },
35203515 .elems => |elems| {
35213516 assert(elems.len == aggregate_len);
3522 for (elems) |elem| assert(elem != .none);
35233517 },
3524 .repeated_elem => |elem| {
3525 assert(elem != .none);
3518 .repeated_elem => {},
3519 }
3520 switch (ty_key) {
3521 inline .array_type, .vector_type => |seq_type| {
3522 for (aggregate.storage.values()) |elem| {
3523 assert(ip.typeOf(elem) == seq_type.child);
3524 }
3525 },
3526 .struct_type => |struct_type| {
3527 for (
3528 aggregate.storage.values(),
3529 ip.structPtrUnwrapConst(struct_type.index).?.fields.values(),
3530 ) |elem, field| {
3531 assert(ip.typeOf(elem) == field.ty.toIntern());
3532 }
3533 },
3534 .anon_struct_type => |anon_struct_type| {
3535 for (aggregate.storage.values(), anon_struct_type.types) |elem, ty| {
3536 assert(ip.typeOf(elem) == ty);
3537 }
35263538 },
3539 else => unreachable,
35273540 }
35283541
35293542 if (aggregate_len == 0) {
src/Sema.zig+70-70
......@@ -10252,7 +10252,7 @@ fn zirSwitchCapture(
1025210252 if (try sema.resolveDefinedValue(block, operand_src, operand)) |operand_val| {
1025310253 return sema.addConstant(
1025410254 first_field.ty,
10255 operand_val.castTag(.@"union").?.data.val,
10255 mod.intern_pool.indexToKey(operand_val.toIntern()).un.val.toValue(),
1025610256 );
1025710257 }
1025810258 try sema.requireRuntimeBlock(block, operand_src, null);
......@@ -19042,10 +19042,10 @@ fn zirReify(
1904219042 const operand_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = extra.node };
1904319043 const type_info = try sema.coerce(block, type_info_ty, uncasted_operand, operand_src);
1904419044 const val = try sema.resolveConstValue(block, operand_src, type_info, "operand to @Type must be comptime-known");
19045 const union_val = val.cast(Value.Payload.Union).?.data;
19045 const union_val = mod.intern_pool.indexToKey(val.toIntern()).un;
1904619046 const target = mod.getTarget();
19047 const tag_index = type_info_ty.unionTagFieldIndex(union_val.tag, mod).?;
19048 if (try union_val.val.anyUndef(mod)) return sema.failWithUseOfUndef(block, src);
19047 if (try union_val.val.toValue().anyUndef(mod)) return sema.failWithUseOfUndef(block, src);
19048 const tag_index = type_info_ty.unionTagFieldIndex(union_val.tag.toValue(), mod).?;
1904919049 const ip = &mod.intern_pool;
1905019050 switch (@intToEnum(std.builtin.TypeId, tag_index)) {
1905119051 .Type => return Air.Inst.Ref.type_type,
......@@ -19059,9 +19059,9 @@ fn zirReify(
1905919059 .AnyFrame => return sema.failWithUseOfAsync(block, src),
1906019060 .EnumLiteral => return Air.Inst.Ref.enum_literal_type,
1906119061 .Int => {
19062 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19063 const signedness_val = try union_val.val.fieldValue(mod, fields.getIndex("signedness").?);
19064 const bits_val = try union_val.val.fieldValue(mod, fields.getIndex("bits").?);
19062 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19063 const signedness_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("signedness").?);
19064 const bits_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("bits").?);
1906519065
1906619066 const signedness = mod.toEnum(std.builtin.Signedness, signedness_val);
1906719067 const bits = @intCast(u16, bits_val.toUnsignedInt(mod));
......@@ -19069,9 +19069,9 @@ fn zirReify(
1906919069 return sema.addType(ty);
1907019070 },
1907119071 .Vector => {
19072 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19073 const len_val = try union_val.val.fieldValue(mod, fields.getIndex("len").?);
19074 const child_val = try union_val.val.fieldValue(mod, fields.getIndex("child").?);
19072 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19073 const len_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("len").?);
19074 const child_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("child").?);
1907519075
1907619076 const len = @intCast(u32, len_val.toUnsignedInt(mod));
1907719077 const child_ty = child_val.toType();
......@@ -19085,8 +19085,8 @@ fn zirReify(
1908519085 return sema.addType(ty);
1908619086 },
1908719087 .Float => {
19088 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19089 const bits_val = try union_val.val.fieldValue(mod, fields.getIndex("bits").?);
19088 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19089 const bits_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("bits").?);
1909019090
1909119091 const bits = @intCast(u16, bits_val.toUnsignedInt(mod));
1909219092 const ty = switch (bits) {
......@@ -19100,15 +19100,15 @@ fn zirReify(
1910019100 return sema.addType(ty);
1910119101 },
1910219102 .Pointer => {
19103 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19104 const size_val = try union_val.val.fieldValue(mod, fields.getIndex("size").?);
19105 const is_const_val = try union_val.val.fieldValue(mod, fields.getIndex("is_const").?);
19106 const is_volatile_val = try union_val.val.fieldValue(mod, fields.getIndex("is_volatile").?);
19107 const alignment_val = try union_val.val.fieldValue(mod, fields.getIndex("alignment").?);
19108 const address_space_val = try union_val.val.fieldValue(mod, fields.getIndex("address_space").?);
19109 const child_val = try union_val.val.fieldValue(mod, fields.getIndex("child").?);
19110 const is_allowzero_val = try union_val.val.fieldValue(mod, fields.getIndex("is_allowzero").?);
19111 const sentinel_val = try union_val.val.fieldValue(mod, fields.getIndex("sentinel").?);
19103 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19104 const size_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("size").?);
19105 const is_const_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("is_const").?);
19106 const is_volatile_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("is_volatile").?);
19107 const alignment_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("alignment").?);
19108 const address_space_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("address_space").?);
19109 const child_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("child").?);
19110 const is_allowzero_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("is_allowzero").?);
19111 const sentinel_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("sentinel").?);
1911219112
1911319113 if (!try sema.intFitsInType(alignment_val, Type.u32, null)) {
1911419114 return sema.fail(block, src, "alignment must fit in 'u32'", .{});
......@@ -19191,10 +19191,10 @@ fn zirReify(
1919119191 return sema.addType(ty);
1919219192 },
1919319193 .Array => {
19194 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19195 const len_val = try union_val.val.fieldValue(mod, fields.getIndex("len").?);
19196 const child_val = try union_val.val.fieldValue(mod, fields.getIndex("child").?);
19197 const sentinel_val = try union_val.val.fieldValue(mod, fields.getIndex("sentinel").?);
19194 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19195 const len_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("len").?);
19196 const child_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("child").?);
19197 const sentinel_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("sentinel").?);
1919819198
1919919199 const len = len_val.toUnsignedInt(mod);
1920019200 const child_ty = child_val.toType();
......@@ -19210,8 +19210,8 @@ fn zirReify(
1921019210 return sema.addType(ty);
1921119211 },
1921219212 .Optional => {
19213 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19214 const child_val = try union_val.val.fieldValue(mod, fields.getIndex("child").?);
19213 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19214 const child_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("child").?);
1921519215
1921619216 const child_ty = child_val.toType();
1921719217
......@@ -19219,9 +19219,9 @@ fn zirReify(
1921919219 return sema.addType(ty);
1922019220 },
1922119221 .ErrorUnion => {
19222 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19223 const error_set_val = try union_val.val.fieldValue(mod, fields.getIndex("error_set").?);
19224 const payload_val = try union_val.val.fieldValue(mod, fields.getIndex("payload").?);
19222 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19223 const error_set_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("error_set").?);
19224 const payload_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("payload").?);
1922519225
1922619226 const error_set_ty = error_set_val.toType();
1922719227 const payload_ty = payload_val.toType();
......@@ -19234,7 +19234,7 @@ fn zirReify(
1923419234 return sema.addType(ty);
1923519235 },
1923619236 .ErrorSet => {
19237 const payload_val = union_val.val.optionalValue(mod) orelse
19237 const payload_val = union_val.val.toValue().optionalValue(mod) orelse
1923819238 return sema.addType(Type.anyerror);
1923919239
1924019240 const len = try sema.usizeCast(block, src, payload_val.sliceLen(mod));
......@@ -19258,12 +19258,12 @@ fn zirReify(
1925819258 return sema.addType(ty);
1925919259 },
1926019260 .Struct => {
19261 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19262 const layout_val = try union_val.val.fieldValue(mod, fields.getIndex("layout").?);
19263 const backing_integer_val = try union_val.val.fieldValue(mod, fields.getIndex("backing_integer").?);
19264 const fields_val = try union_val.val.fieldValue(mod, fields.getIndex("fields").?);
19265 const decls_val = try union_val.val.fieldValue(mod, fields.getIndex("decls").?);
19266 const is_tuple_val = try union_val.val.fieldValue(mod, fields.getIndex("is_tuple").?);
19261 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19262 const layout_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("layout").?);
19263 const backing_integer_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("backing_integer").?);
19264 const fields_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("fields").?);
19265 const decls_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("decls").?);
19266 const is_tuple_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("is_tuple").?);
1926719267
1926819268 const layout = mod.toEnum(std.builtin.Type.ContainerLayout, layout_val);
1926919269
......@@ -19279,11 +19279,11 @@ fn zirReify(
1927919279 return try sema.reifyStruct(block, inst, src, layout, backing_integer_val, fields_val, name_strategy, is_tuple_val.toBool(mod));
1928019280 },
1928119281 .Enum => {
19282 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19283 const tag_type_val = try union_val.val.fieldValue(mod, fields.getIndex("tag_type").?);
19284 const fields_val = try union_val.val.fieldValue(mod, fields.getIndex("fields").?);
19285 const decls_val = try union_val.val.fieldValue(mod, fields.getIndex("decls").?);
19286 const is_exhaustive_val = try union_val.val.fieldValue(mod, fields.getIndex("is_exhaustive").?);
19282 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19283 const tag_type_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("tag_type").?);
19284 const fields_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("fields").?);
19285 const decls_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("decls").?);
19286 const is_exhaustive_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("is_exhaustive").?);
1928719287
1928819288 // Decls
1928919289 if (decls_val.sliceLen(mod) > 0) {
......@@ -19318,7 +19318,7 @@ fn zirReify(
1931819318 .nonexhaustive
1931919319 else
1932019320 .explicit,
19321 .tag_ty = int_tag_ty.ip_index,
19321 .tag_ty = int_tag_ty.toIntern(),
1932219322 });
1932319323 errdefer mod.intern_pool.remove(incomplete_enum.index);
1932419324
......@@ -19360,7 +19360,7 @@ fn zirReify(
1936019360 return sema.failWithOwnedErrorMsg(msg);
1936119361 }
1936219362
19363 if (try incomplete_enum.addFieldValue(&mod.intern_pool, gpa, value_val.ip_index)) |other| {
19363 if (try incomplete_enum.addFieldValue(&mod.intern_pool, gpa, value_val.toIntern())) |other| {
1936419364 const msg = msg: {
1936519365 const msg = try sema.errMsg(block, src, "enum tag value {} already taken", .{value_val.fmtValue(Type.comptime_int, mod)});
1936619366 errdefer msg.destroy(gpa);
......@@ -19375,8 +19375,8 @@ fn zirReify(
1937519375 return sema.analyzeDeclVal(block, src, new_decl_index);
1937619376 },
1937719377 .Opaque => {
19378 const fields = ip.typeOf(union_val.val.ip_index).toType().structFields(mod);
19379 const decls_val = try union_val.val.fieldValue(mod, fields.getIndex("decls").?);
19378 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19379 const decls_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("decls").?);
1938019380
1938119381 // Decls
1938219382 if (decls_val.sliceLen(mod) > 0) {
......@@ -19419,11 +19419,11 @@ fn zirReify(
1941919419 return sema.analyzeDeclVal(block, src, new_decl_index);
1942019420 },
1942119421 .Union => {
19422 const fields = ip.typeOf(union_val.val.ip_index).toType().structFields(mod);
19423 const layout_val = try union_val.val.fieldValue(mod, fields.getIndex("layout").?);
19424 const tag_type_val = try union_val.val.fieldValue(mod, fields.getIndex("tag_type").?);
19425 const fields_val = try union_val.val.fieldValue(mod, fields.getIndex("fields").?);
19426 const decls_val = try union_val.val.fieldValue(mod, fields.getIndex("decls").?);
19422 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19423 const layout_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("layout").?);
19424 const tag_type_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("tag_type").?);
19425 const fields_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("fields").?);
19426 const decls_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("decls").?);
1942719427
1942819428 // Decls
1942919429 if (decls_val.sliceLen(mod) > 0) {
......@@ -19491,7 +19491,7 @@ fn zirReify(
1949119491 if (tag_type_val.optionalValue(mod)) |payload_val| {
1949219492 union_obj.tag_ty = payload_val.toType();
1949319493
19494 const enum_type = switch (mod.intern_pool.indexToKey(union_obj.tag_ty.ip_index)) {
19494 const enum_type = switch (mod.intern_pool.indexToKey(union_obj.tag_ty.toIntern())) {
1949519495 .enum_type => |x| x,
1949619496 else => return sema.fail(block, src, "Type.Union.tag_type must be an enum type", .{}),
1949719497 };
......@@ -19620,13 +19620,13 @@ fn zirReify(
1962019620 return sema.analyzeDeclVal(block, src, new_decl_index);
1962119621 },
1962219622 .Fn => {
19623 const fields = ip.typeOf(union_val.val.toIntern()).toType().structFields(mod);
19624 const calling_convention_val = try union_val.val.fieldValue(mod, fields.getIndex("calling_convention").?);
19625 const alignment_val = try union_val.val.fieldValue(mod, fields.getIndex("alignment").?);
19626 const is_generic_val = try union_val.val.fieldValue(mod, fields.getIndex("is_generic").?);
19627 const is_var_args_val = try union_val.val.fieldValue(mod, fields.getIndex("is_var_args").?);
19628 const return_type_val = try union_val.val.fieldValue(mod, fields.getIndex("return_type").?);
19629 const params_val = try union_val.val.fieldValue(mod, fields.getIndex("params").?);
19623 const fields = ip.typeOf(union_val.val).toType().structFields(mod);
19624 const calling_convention_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("calling_convention").?);
19625 const alignment_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("alignment").?);
19626 const is_generic_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("is_generic").?);
19627 const is_var_args_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("is_var_args").?);
19628 const return_type_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("return_type").?);
19629 const params_val = try union_val.val.toValue().fieldValue(mod, fields.getIndex("params").?);
1963019630
1963119631 const is_generic = is_generic_val.toBool(mod);
1963219632 if (is_generic) {
......@@ -25204,12 +25204,12 @@ fn unionFieldPtr(
2520425204 if (union_val.isUndef(mod)) {
2520525205 return sema.failWithUseOfUndef(block, src);
2520625206 }
25207 const tag_and_val = union_val.castTag(.@"union").?.data;
25207 const un = mod.intern_pool.indexToKey(union_val.toIntern()).un;
2520825208 const field_tag = try mod.enumValueFieldIndex(union_obj.tag_ty, enum_field_index);
25209 const tag_matches = tag_and_val.tag.eql(field_tag, union_obj.tag_ty, mod);
25209 const tag_matches = un.tag == field_tag.toIntern();
2521025210 if (!tag_matches) {
2521125211 const msg = msg: {
25212 const active_index = union_obj.tag_ty.enumTagFieldIndex(tag_and_val.tag, mod).?;
25212 const active_index = union_obj.tag_ty.enumTagFieldIndex(un.tag.toValue(), mod).?;
2521325213 const active_field_name = union_obj.tag_ty.enumFieldName(active_index, mod);
2521425214 const msg = try sema.errMsg(block, src, "access of union field '{s}' while field '{s}' is active", .{ field_name, active_field_name });
2521525215 errdefer msg.destroy(sema.gpa);
......@@ -25269,16 +25269,16 @@ fn unionFieldVal(
2526925269 if (try sema.resolveMaybeUndefVal(union_byval)) |union_val| {
2527025270 if (union_val.isUndef(mod)) return sema.addConstUndef(field.ty);
2527125271
25272 const tag_and_val = union_val.castTag(.@"union").?.data;
25272 const un = mod.intern_pool.indexToKey(union_val.toIntern()).un;
2527325273 const field_tag = try mod.enumValueFieldIndex(union_obj.tag_ty, enum_field_index);
25274 const tag_matches = tag_and_val.tag.eql(field_tag, union_obj.tag_ty, mod);
25274 const tag_matches = un.tag == field_tag.toIntern();
2527525275 switch (union_obj.layout) {
2527625276 .Auto => {
2527725277 if (tag_matches) {
25278 return sema.addConstant(field.ty, tag_and_val.val);
25278 return sema.addConstant(field.ty, un.val.toValue());
2527925279 } else {
2528025280 const msg = msg: {
25281 const active_index = union_obj.tag_ty.enumTagFieldIndex(tag_and_val.tag, mod).?;
25281 const active_index = union_obj.tag_ty.enumTagFieldIndex(un.tag.toValue(), mod).?;
2528225282 const active_field_name = union_obj.tag_ty.enumFieldName(active_index, mod);
2528325283 const msg = try sema.errMsg(block, src, "access of union field '{s}' while field '{s}' is active", .{ field_name, active_field_name });
2528425284 errdefer msg.destroy(sema.gpa);
......@@ -25290,10 +25290,10 @@ fn unionFieldVal(
2529025290 },
2529125291 .Packed, .Extern => {
2529225292 if (tag_matches) {
25293 return sema.addConstant(field.ty, tag_and_val.val);
25293 return sema.addConstant(field.ty, un.val.toValue());
2529425294 } else {
25295 const old_ty = union_ty.unionFieldType(tag_and_val.tag, mod);
25296 if (try sema.bitCastVal(block, src, tag_and_val.val, old_ty, field.ty, 0)) |new_val| {
25295 const old_ty = union_ty.unionFieldType(un.tag.toValue(), mod);
25296 if (try sema.bitCastVal(block, src, un.val.toValue(), old_ty, field.ty, 0)) |new_val| {
2529725297 return sema.addConstant(field.ty, new_val);
2529825298 }
2529925299 }
......@@ -27626,7 +27626,7 @@ fn obtainBitCastedVectorPtr(sema: *Sema, ptr: Air.Inst.Ref) ?Air.Inst.Ref {
2762627626 // allocations is relevant to this function, or why it would have
2762727627 // different behavior depending on whether the types were inferred.
2762827628 // Something seems wrong here.
27629 switch (prev_ptr_ty.ip_index) {
27629 switch (prev_ptr_ty.toIntern()) {
2763027630 .inferred_alloc_mut_type, .inferred_alloc_const_type => return null,
2763127631 else => {},
2763227632 }
src/codegen/llvm.zig+12-3
......@@ -3208,7 +3208,8 @@ pub const DeclGen = struct {
32083208 return llvm_type.getUndef();
32093209 }
32103210
3211 switch (mod.intern_pool.indexToKey(tv.val.toIntern())) {
3211 const val_key = mod.intern_pool.indexToKey(tv.val.toIntern());
3212 switch (val_key) {
32123213 .int_type,
32133214 .ptr_type,
32143215 .array_type,
......@@ -3242,10 +3243,18 @@ pub const DeclGen = struct {
32423243 },
32433244 },
32443245 .variable,
3245 .extern_func,
3246 .func,
32473246 .enum_literal,
32483247 => unreachable, // non-runtime values
3248 .extern_func, .func => {
3249 const fn_decl_index = switch (val_key) {
3250 .extern_func => |extern_func| extern_func.decl,
3251 .func => |func| mod.funcPtr(func.index).owner_decl,
3252 else => unreachable,
3253 };
3254 const fn_decl = dg.module.declPtr(fn_decl_index);
3255 dg.module.markDeclAlive(fn_decl);
3256 return dg.resolveLlvmFunction(fn_decl_index);
3257 },
32493258 .int => |int| {
32503259 var bigint_space: Value.BigIntSpace = undefined;
32513260 const bigint = int.storage.toBigInt(&bigint_space);
src/value.zig+21-2
......@@ -1961,12 +1961,31 @@ pub const Value = struct {
19611961 mod: *Module,
19621962 ) Allocator.Error!Value {
19631963 const elem_ty = ty.elemType2(mod);
1964 const ptr_ty_key = mod.intern_pool.indexToKey(ty.toIntern()).ptr_type;
1965 assert(ptr_ty_key.host_size == 0);
1966 assert(ptr_ty_key.bit_offset == 0);
1967 assert(ptr_ty_key.vector_index == .none);
1968 const elem_alignment = InternPool.Alignment.fromByteUnits(elem_ty.abiAlignment(mod));
1969 const alignment = switch (ptr_ty_key.alignment) {
1970 .none => .none,
1971 else => ptr_ty_key.alignment.min(
1972 @intToEnum(InternPool.Alignment, @ctz(index * elem_ty.abiSize(mod))),
1973 ),
1974 };
1975 const ptr_ty = try mod.ptrType(.{
1976 .elem_type = elem_ty.toIntern(),
1977 .alignment = if (alignment == elem_alignment) .none else alignment,
1978 .is_const = ptr_ty_key.is_const,
1979 .is_volatile = ptr_ty_key.is_volatile,
1980 .is_allowzero = ptr_ty_key.is_allowzero,
1981 .address_space = ptr_ty_key.address_space,
1982 });
19641983 const ptr_val = switch (mod.intern_pool.indexToKey(val.toIntern())) {
19651984 .ptr => |ptr| ptr: {
19661985 switch (ptr.addr) {
19671986 .elem => |elem| if (mod.intern_pool.typeOf(elem.base).toType().elemType2(mod).eql(elem_ty, mod))
19681987 return (try mod.intern(.{ .ptr = .{
1969 .ty = ty.toIntern(),
1988 .ty = ptr_ty.toIntern(),
19701989 .addr = .{ .elem = .{
19711990 .base = elem.base,
19721991 .index = elem.index + index,
......@@ -1982,7 +2001,7 @@ pub const Value = struct {
19822001 else => val,
19832002 };
19842003 return (try mod.intern(.{ .ptr = .{
1985 .ty = ty.toIntern(),
2004 .ty = ptr_ty.toIntern(),
19862005 .addr = .{ .elem = .{
19872006 .base = ptr_val.toIntern(),
19882007 .index = index,