authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-03 19:55:27+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-09 11:59:10+03:00
logc76b5c1a31ebe09726cd29e7a6da69613eabfd10
treebb714ca03635ecf990829cf6d2a5e31a8de203db
parentd769fd0102dee7ea24f957c3c96e2336d1c18839

stage2: correct node offset of nested declarations


9 files changed, 106 insertions(+), 114 deletions(-)

src/AstGen.zig+17-4
......@@ -4278,7 +4278,7 @@ fn structDeclInner(
42784278 var known_non_opv = false;
42794279 var known_comptime_only = false;
42804280 for (container_decl.ast.members) |member_node| {
4281 const member = switch (try containerMember(gz, &namespace.base, &wip_members, member_node)) {
4281 const member = switch (try containerMember(&block_scope, &namespace.base, &wip_members, member_node)) {
42824282 .decl => continue,
42834283 .field => |field| field,
42844284 };
......@@ -4445,7 +4445,7 @@ fn unionDeclInner(
44454445 defer wip_members.deinit();
44464446
44474447 for (members) |member_node| {
4448 const member = switch (try containerMember(gz, &namespace.base, &wip_members, member_node)) {
4448 const member = switch (try containerMember(&block_scope, &namespace.base, &wip_members, member_node)) {
44494449 .decl => continue,
44504450 .field => |field| field,
44514451 };
......@@ -4732,7 +4732,7 @@ fn containerDecl(
47324732 for (container_decl.ast.members) |member_node| {
47334733 if (member_node == counts.nonexhaustive_node)
47344734 continue;
4735 const member = switch (try containerMember(gz, &namespace.base, &wip_members, member_node)) {
4735 const member = switch (try containerMember(&block_scope, &namespace.base, &wip_members, member_node)) {
47364736 .decl => continue,
47374737 .field => |field| field,
47384738 };
......@@ -4810,13 +4810,26 @@ fn containerDecl(
48104810 };
48114811 defer namespace.deinit(gpa);
48124812
4813 astgen.advanceSourceCursorToNode(node);
4814 var block_scope: GenZir = .{
4815 .parent = &namespace.base,
4816 .decl_node_index = node,
4817 .decl_line = astgen.source_line,
4818 .astgen = astgen,
4819 .force_comptime = true,
4820 .in_defer = false,
4821 .instructions = gz.instructions,
4822 .instructions_top = gz.instructions.items.len,
4823 };
4824 defer block_scope.unstack();
4825
48134826 const decl_count = try astgen.scanDecls(&namespace, container_decl.ast.members);
48144827
48154828 var wip_members = try WipMembers.init(gpa, &astgen.scratch, decl_count, 0, 0, 0);
48164829 defer wip_members.deinit();
48174830
48184831 for (container_decl.ast.members) |member_node| {
4819 const res = try containerMember(gz, &namespace.base, &wip_members, member_node);
4832 const res = try containerMember(&block_scope, &namespace.base, &wip_members, member_node);
48204833 if (res == .field) {
48214834 return astgen.failNode(member_node, "opaque types cannot have fields", .{});
48224835 }
src/Module.zig+9-24
......@@ -853,8 +853,6 @@ pub const EmitH = struct {
853853pub const ErrorSet = struct {
854854 /// The Decl that corresponds to the error set itself.
855855 owner_decl: Decl.Index,
856 /// Offset from Decl node index, points to the error set AST node.
857 node_offset: i32,
858856 /// The string bytes are stored in the owner Decl arena.
859857 /// These must be in sorted order. See sortNames.
860858 names: NameMap,
......@@ -866,7 +864,7 @@ pub const ErrorSet = struct {
866864 return .{
867865 .file_scope = owner_decl.getFileScope(),
868866 .parent_decl_node = owner_decl.src_node,
869 .lazy = LazySrcLoc.nodeOffset(self.node_offset),
867 .lazy = LazySrcLoc.nodeOffset(0),
870868 };
871869 }
872870
......@@ -893,8 +891,6 @@ pub const Struct = struct {
893891 namespace: Namespace,
894892 /// The Decl that corresponds to the struct itself.
895893 owner_decl: Decl.Index,
896 /// Offset from `owner_decl`, points to the struct AST node.
897 node_offset: i32,
898894 /// Index of the struct_decl ZIR instruction.
899895 zir_index: Zir.Inst.Index,
900896
......@@ -953,7 +949,7 @@ pub const Struct = struct {
953949 return .{
954950 .file_scope = owner_decl.getFileScope(),
955951 .parent_decl_node = owner_decl.src_node,
956 .lazy = LazySrcLoc.nodeOffset(s.node_offset),
952 .lazy = LazySrcLoc.nodeOffset(0),
957953 };
958954 }
959955
......@@ -968,7 +964,7 @@ pub const Struct = struct {
968964 });
969965 return s.srcLoc(mod);
970966 };
971 const node = owner_decl.relativeToNodeIndex(s.node_offset);
967 const node = owner_decl.relativeToNodeIndex(0);
972968 const node_tags = tree.nodes.items(.tag);
973969 switch (node_tags[node]) {
974970 .container_decl,
......@@ -1060,8 +1056,6 @@ pub const Struct = struct {
10601056pub const EnumSimple = struct {
10611057 /// The Decl that corresponds to the enum itself.
10621058 owner_decl: Decl.Index,
1063 /// Offset from `owner_decl`, points to the enum decl AST node.
1064 node_offset: i32,
10651059 /// Set of field names in declaration order.
10661060 fields: NameMap,
10671061
......@@ -1072,7 +1066,7 @@ pub const EnumSimple = struct {
10721066 return .{
10731067 .file_scope = owner_decl.getFileScope(),
10741068 .parent_decl_node = owner_decl.src_node,
1075 .lazy = LazySrcLoc.nodeOffset(self.node_offset),
1069 .lazy = LazySrcLoc.nodeOffset(0),
10761070 };
10771071 }
10781072};
......@@ -1083,8 +1077,6 @@ pub const EnumSimple = struct {
10831077pub const EnumNumbered = struct {
10841078 /// The Decl that corresponds to the enum itself.
10851079 owner_decl: Decl.Index,
1086 /// Offset from `owner_decl`, points to the enum decl AST node.
1087 node_offset: i32,
10881080 /// An integer type which is used for the numerical value of the enum.
10891081 /// Whether zig chooses this type or the user specifies it, it is stored here.
10901082 tag_ty: Type,
......@@ -1103,7 +1095,7 @@ pub const EnumNumbered = struct {
11031095 return .{
11041096 .file_scope = owner_decl.getFileScope(),
11051097 .parent_decl_node = owner_decl.src_node,
1106 .lazy = LazySrcLoc.nodeOffset(self.node_offset),
1098 .lazy = LazySrcLoc.nodeOffset(0),
11071099 };
11081100 }
11091101};
......@@ -1113,8 +1105,6 @@ pub const EnumNumbered = struct {
11131105pub const EnumFull = struct {
11141106 /// The Decl that corresponds to the enum itself.
11151107 owner_decl: Decl.Index,
1116 /// Offset from `owner_decl`, points to the enum decl AST node.
1117 node_offset: i32,
11181108 /// An integer type which is used for the numerical value of the enum.
11191109 /// Whether zig chooses this type or the user specifies it, it is stored here.
11201110 tag_ty: Type,
......@@ -1137,7 +1127,7 @@ pub const EnumFull = struct {
11371127 return .{
11381128 .file_scope = owner_decl.getFileScope(),
11391129 .parent_decl_node = owner_decl.src_node,
1140 .lazy = LazySrcLoc.nodeOffset(self.node_offset),
1130 .lazy = LazySrcLoc.nodeOffset(0),
11411131 };
11421132 }
11431133};
......@@ -1155,8 +1145,6 @@ pub const Union = struct {
11551145 namespace: Namespace,
11561146 /// The Decl that corresponds to the union itself.
11571147 owner_decl: Decl.Index,
1158 /// Offset from `owner_decl`, points to the union decl AST node.
1159 node_offset: i32,
11601148 /// Index of the union_decl ZIR instruction.
11611149 zir_index: Zir.Inst.Index,
11621150
......@@ -1203,7 +1191,7 @@ pub const Union = struct {
12031191 return .{
12041192 .file_scope = owner_decl.getFileScope(),
12051193 .parent_decl_node = owner_decl.src_node,
1206 .lazy = LazySrcLoc.nodeOffset(self.node_offset),
1194 .lazy = LazySrcLoc.nodeOffset(0),
12071195 };
12081196 }
12091197
......@@ -1218,7 +1206,7 @@ pub const Union = struct {
12181206 });
12191207 return u.srcLoc(mod);
12201208 };
1221 const node = owner_decl.relativeToNodeIndex(u.node_offset);
1209 const node = owner_decl.relativeToNodeIndex(0);
12221210 const node_tags = tree.nodes.items(.tag);
12231211 var buf: [2]Ast.Node.Index = undefined;
12241212 switch (node_tags[node]) {
......@@ -1410,8 +1398,6 @@ pub const Union = struct {
14101398pub const Opaque = struct {
14111399 /// The Decl that corresponds to the opaque itself.
14121400 owner_decl: Decl.Index,
1413 /// Offset from `owner_decl`, points to the opaque decl AST node.
1414 node_offset: i32,
14151401 /// Represents the declarations inside this opaque.
14161402 namespace: Namespace,
14171403
......@@ -1420,7 +1406,7 @@ pub const Opaque = struct {
14201406 return .{
14211407 .file_scope = owner_decl.getFileScope(),
14221408 .parent_decl_node = owner_decl.src_node,
1423 .lazy = LazySrcLoc.nodeOffset(self.node_offset),
1409 .lazy = LazySrcLoc.nodeOffset(0),
14241410 };
14251411 }
14261412
......@@ -4337,7 +4323,6 @@ pub fn semaFile(mod: *Module, file: *File) SemaError!void {
43374323 struct_obj.* = .{
43384324 .owner_decl = undefined, // set below
43394325 .fields = .{},
4340 .node_offset = 0, // it's the struct for the root file
43414326 .zir_index = undefined, // set below
43424327 .layout = .Auto,
43434328 .status = .none,
src/Sema.zig+30-39
......@@ -1818,10 +1818,10 @@ fn failWithInvalidComptimeFieldStore(sema: *Sema, block: *Block, init_src: LazyS
18181818
18191819 const tree = try sema.getAstTree(block);
18201820 const decl = sema.mod.declPtr(decl_index);
1821 const field_src = enumFieldSrcLoc(decl, tree.*, container_ty.getNodeOffset(), field_index);
1821 const field_src = enumFieldSrcLoc(decl, tree.*, 0, field_index);
18221822 const default_value_src: LazySrcLoc = .{ .node_offset_field_default = field_src.node_offset.x };
18231823
1824 try sema.errNote(block, default_value_src, msg, "default value set here", .{});
1824 try sema.mod.errNoteNonLazy(default_value_src.toSrcLoc(decl), msg, "default value set here", .{});
18251825 break :msg msg;
18261826 };
18271827 return sema.failWithOwnedErrorMsg(msg);
......@@ -1866,7 +1866,7 @@ fn addFieldErrNote(
18661866 const decl_index = container_ty.getOwnerDecl();
18671867 const decl = mod.declPtr(decl_index);
18681868 const tree = try sema.getAstTree(block);
1869 const field_src = enumFieldSrcLoc(decl, tree.*, container_ty.getNodeOffset(), field_index);
1869 const field_src = enumFieldSrcLoc(decl, tree.*, 0, field_index);
18701870 try mod.errNoteNonLazy(field_src.toSrcLoc(decl), parent, format, args);
18711871}
18721872
......@@ -2262,7 +2262,7 @@ fn zirStructDecl(
22622262 const struct_obj = try new_decl_arena_allocator.create(Module.Struct);
22632263 const struct_ty = try Type.Tag.@"struct".create(new_decl_arena_allocator, struct_obj);
22642264 const struct_val = try Value.Tag.ty.create(new_decl_arena_allocator, struct_ty);
2265 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, .{
2265 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, src, .{
22662266 .ty = Type.type,
22672267 .val = struct_val,
22682268 }, small.name_strategy, "struct", inst);
......@@ -2272,7 +2272,6 @@ fn zirStructDecl(
22722272 struct_obj.* = .{
22732273 .owner_decl = new_decl_index,
22742274 .fields = .{},
2275 .node_offset = src.node_offset.x,
22762275 .zir_index = inst,
22772276 .layout = small.layout,
22782277 .status = .none,
......@@ -2294,6 +2293,7 @@ fn zirStructDecl(
22942293fn createAnonymousDeclTypeNamed(
22952294 sema: *Sema,
22962295 block: *Block,
2296 src: LazySrcLoc,
22972297 typed_value: TypedValue,
22982298 name_strategy: Zir.Inst.NameStrategy,
22992299 anon_prefix: []const u8,
......@@ -2303,7 +2303,8 @@ fn createAnonymousDeclTypeNamed(
23032303 const namespace = block.namespace;
23042304 const src_scope = block.wip_capture_scope;
23052305 const src_decl = mod.declPtr(block.src_decl);
2306 const new_decl_index = try mod.allocateNewDecl(namespace, src_decl.src_node, src_scope);
2306 const src_node = src_decl.relativeToNodeIndex(src.node_offset.x);
2307 const new_decl_index = try mod.allocateNewDecl(namespace, src_node, src_scope);
23072308 errdefer mod.destroyDecl(new_decl_index);
23082309
23092310 switch (name_strategy) {
......@@ -2378,7 +2379,7 @@ fn createAnonymousDeclTypeNamed(
23782379 },
23792380 else => {},
23802381 };
2381 return sema.createAnonymousDeclTypeNamed(block, typed_value, .anon, anon_prefix, null);
2382 return sema.createAnonymousDeclTypeNamed(block, src, typed_value, .anon, anon_prefix, null);
23822383 },
23832384 }
23842385}
......@@ -2442,7 +2443,7 @@ fn zirEnumDecl(
24422443 };
24432444 const enum_ty = Type.initPayload(&enum_ty_payload.base);
24442445 const enum_val = try Value.Tag.ty.create(new_decl_arena_allocator, enum_ty);
2445 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, .{
2446 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, src, .{
24462447 .ty = Type.type,
24472448 .val = enum_val,
24482449 }, small.name_strategy, "enum", inst);
......@@ -2456,7 +2457,6 @@ fn zirEnumDecl(
24562457 .tag_ty_inferred = true,
24572458 .fields = .{},
24582459 .values = .{},
2459 .node_offset = src.node_offset.x,
24602460 .namespace = .{
24612461 .parent = block.namespace,
24622462 .ty = enum_ty,
......@@ -2684,7 +2684,7 @@ fn zirUnionDecl(
26842684 const union_ty = Type.initPayload(&union_payload.base);
26852685 const union_val = try Value.Tag.ty.create(new_decl_arena_allocator, union_ty);
26862686 const mod = sema.mod;
2687 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, .{
2687 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, src, .{
26882688 .ty = Type.type,
26892689 .val = union_val,
26902690 }, small.name_strategy, "union", inst);
......@@ -2695,7 +2695,6 @@ fn zirUnionDecl(
26952695 .owner_decl = new_decl_index,
26962696 .tag_ty = Type.initTag(.@"null"),
26972697 .fields = .{},
2698 .node_offset = src.node_offset.x,
26992698 .zir_index = inst,
27002699 .layout = small.layout,
27012700 .status = .none,
......@@ -2753,7 +2752,7 @@ fn zirOpaqueDecl(
27532752 };
27542753 const opaque_ty = Type.initPayload(&opaque_ty_payload.base);
27552754 const opaque_val = try Value.Tag.ty.create(new_decl_arena_allocator, opaque_ty);
2756 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, .{
2755 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, src, .{
27572756 .ty = Type.type,
27582757 .val = opaque_val,
27592758 }, small.name_strategy, "opaque", inst);
......@@ -2763,7 +2762,6 @@ fn zirOpaqueDecl(
27632762
27642763 opaque_obj.* = .{
27652764 .owner_decl = new_decl_index,
2766 .node_offset = src.node_offset.x,
27672765 .namespace = .{
27682766 .parent = block.namespace,
27692767 .ty = opaque_ty,
......@@ -2802,7 +2800,7 @@ fn zirErrorSetDecl(
28022800 const error_set_ty = try Type.Tag.error_set.create(new_decl_arena_allocator, error_set);
28032801 const error_set_val = try Value.Tag.ty.create(new_decl_arena_allocator, error_set_ty);
28042802 const mod = sema.mod;
2805 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, .{
2803 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, src, .{
28062804 .ty = Type.type,
28072805 .val = error_set_val,
28082806 }, name_strategy, "error", inst);
......@@ -2827,7 +2825,6 @@ fn zirErrorSetDecl(
28272825
28282826 error_set.* = .{
28292827 .owner_decl = new_decl_index,
2830 .node_offset = inst_data.src_node,
28312828 .names = names,
28322829 };
28332830 try new_decl.finalizeNewArena(&new_decl_arena);
......@@ -16336,7 +16333,7 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1633616333 };
1633716334 const enum_ty = Type.initPayload(&enum_ty_payload.base);
1633816335 const enum_val = try Value.Tag.ty.create(new_decl_arena_allocator, enum_ty);
16339 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, .{
16336 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, src, .{
1634016337 .ty = Type.type,
1634116338 .val = enum_val,
1634216339 }, name_strategy, "enum", inst);
......@@ -16350,7 +16347,6 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1635016347 .tag_ty_inferred = false,
1635116348 .fields = .{},
1635216349 .values = .{},
16353 .node_offset = src.node_offset.x,
1635416350 .namespace = .{
1635516351 .parent = block.namespace,
1635616352 .ty = enum_ty,
......@@ -16433,7 +16429,7 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1643316429 };
1643416430 const opaque_ty = Type.initPayload(&opaque_ty_payload.base);
1643516431 const opaque_val = try Value.Tag.ty.create(new_decl_arena_allocator, opaque_ty);
16436 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, .{
16432 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, src, .{
1643716433 .ty = Type.type,
1643816434 .val = opaque_val,
1643916435 }, name_strategy, "opaque", inst);
......@@ -16443,7 +16439,6 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1644316439
1644416440 opaque_obj.* = .{
1644516441 .owner_decl = new_decl_index,
16446 .node_offset = src.node_offset.x,
1644716442 .namespace = .{
1644816443 .parent = block.namespace,
1644916444 .ty = opaque_ty,
......@@ -16492,7 +16487,7 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1649216487 };
1649316488 const union_ty = Type.initPayload(&union_payload.base);
1649416489 const new_union_val = try Value.Tag.ty.create(new_decl_arena_allocator, union_ty);
16495 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, .{
16490 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, src, .{
1649616491 .ty = Type.type,
1649716492 .val = new_union_val,
1649816493 }, name_strategy, "union", inst);
......@@ -16503,7 +16498,6 @@ fn zirReify(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstData, in
1650316498 .owner_decl = new_decl_index,
1650416499 .tag_ty = Type.initTag(.@"null"),
1650516500 .fields = .{},
16506 .node_offset = src.node_offset.x,
1650716501 .zir_index = inst,
1650816502 .layout = layout,
1650916503 .status = .have_field_types,
......@@ -16798,7 +16792,7 @@ fn reifyStruct(
1679816792 const struct_ty = try Type.Tag.@"struct".create(new_decl_arena_allocator, struct_obj);
1679916793 const new_struct_val = try Value.Tag.ty.create(new_decl_arena_allocator, struct_ty);
1680016794 const mod = sema.mod;
16801 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, .{
16795 const new_decl_index = try sema.createAnonymousDeclTypeNamed(block, src, .{
1680216796 .ty = Type.type,
1680316797 .val = new_struct_val,
1680416798 }, name_strategy, "struct", inst);
......@@ -16808,7 +16802,6 @@ fn reifyStruct(
1680816802 struct_obj.* = .{
1680916803 .owner_decl = new_decl_index,
1681016804 .fields = .{},
16811 .node_offset = src.node_offset.x,
1681216805 .zir_index = inst,
1681316806 .layout = layout_val.toEnum(std.builtin.Type.ContainerLayout),
1681416807 .status = .have_field_types,
......@@ -27241,7 +27234,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
2724127234 const small = @bitCast(Zir.Inst.StructDecl.Small, extended.small);
2724227235 var extra_index: usize = extended.operand;
2724327236
27244 const src = LazySrcLoc.nodeOffset(struct_obj.node_offset);
27237 const src = LazySrcLoc.nodeOffset(0);
2724527238 extra_index += @boolToInt(small.has_src_node);
2724627239
2724727240 const fields_len = if (small.has_fields_len) blk: {
......@@ -27360,12 +27353,12 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
2736027353 if (gop.found_existing) {
2736127354 const msg = msg: {
2736227355 const tree = try sema.getAstTree(&block_scope);
27363 const field_src = enumFieldSrcLoc(decl, tree.*, struct_obj.node_offset, field_i);
27356 const field_src = enumFieldSrcLoc(decl, tree.*, 0, field_i);
2736427357 const msg = try sema.errMsg(&block_scope, field_src, "duplicate struct field: '{s}'", .{field_name});
2736527358 errdefer msg.destroy(gpa);
2736627359
2736727360 const prev_field_index = struct_obj.fields.getIndex(field_name).?;
27368 const prev_field_src = enumFieldSrcLoc(decl, tree.*, struct_obj.node_offset, prev_field_index);
27361 const prev_field_src = enumFieldSrcLoc(decl, tree.*, 0, prev_field_index);
2736927362 try sema.mod.errNoteNonLazy(prev_field_src.toSrcLoc(decl), msg, "other field here", .{});
2737027363 try sema.errNote(&block_scope, src, msg, "struct declared here", .{});
2737127364 break :msg msg;
......@@ -27422,7 +27415,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
2742227415 if (field_ty.zigTypeTag() == .Opaque) {
2742327416 const msg = msg: {
2742427417 const tree = try sema.getAstTree(&block_scope);
27425 const field_src = enumFieldSrcLoc(decl, tree.*, struct_obj.node_offset, i);
27418 const field_src = enumFieldSrcLoc(decl, tree.*, 0, i);
2742627419 const msg = try sema.errMsg(&block_scope, field_src, "opaque types have unknown size and therefore cannot be directly embedded in structs", .{});
2742727420 errdefer msg.destroy(sema.gpa);
2742827421
......@@ -27434,7 +27427,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
2743427427 if (struct_obj.layout == .Extern and !sema.validateExternType(field.ty, .other)) {
2743527428 const msg = msg: {
2743627429 const tree = try sema.getAstTree(&block_scope);
27437 const fields_src = enumFieldSrcLoc(decl, tree.*, struct_obj.node_offset, i);
27430 const fields_src = enumFieldSrcLoc(decl, tree.*, 0, i);
2743827431 const msg = try sema.errMsg(&block_scope, fields_src, "extern structs cannot contain fields of type '{}'", .{field.ty.fmt(sema.mod)});
2743927432 errdefer msg.destroy(sema.gpa);
2744027433
......@@ -27447,7 +27440,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
2744727440 } else if (struct_obj.layout == .Packed and !(validatePackedType(field.ty))) {
2744827441 const msg = msg: {
2744927442 const tree = try sema.getAstTree(&block_scope);
27450 const fields_src = enumFieldSrcLoc(decl, tree.*, struct_obj.node_offset, i);
27443 const fields_src = enumFieldSrcLoc(decl, tree.*, 0, i);
2745127444 const msg = try sema.errMsg(&block_scope, fields_src, "packed structs cannot contain fields of type '{}'", .{field.ty.fmt(sema.mod)});
2745227445 errdefer msg.destroy(sema.gpa);
2745327446
......@@ -27504,7 +27497,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2750427497 const small = @bitCast(Zir.Inst.UnionDecl.Small, extended.small);
2750527498 var extra_index: usize = extended.operand;
2750627499
27507 const src = LazySrcLoc.nodeOffset(union_obj.node_offset);
27500 const src = LazySrcLoc.nodeOffset(0);
2750827501 extra_index += @boolToInt(small.has_src_node);
2750927502
2751027503 const tag_type_ref: Zir.Inst.Ref = if (small.has_tag_type) blk: {
......@@ -27728,12 +27721,12 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2772827721 if (gop.found_existing) {
2772927722 const msg = msg: {
2773027723 const tree = try sema.getAstTree(&block_scope);
27731 const field_src = enumFieldSrcLoc(decl, tree.*, union_obj.node_offset, field_i);
27724 const field_src = enumFieldSrcLoc(decl, tree.*, 0, field_i);
2773227725 const msg = try sema.errMsg(&block_scope, field_src, "duplicate union field: '{s}'", .{field_name});
2773327726 errdefer msg.destroy(gpa);
2773427727
2773527728 const prev_field_index = union_obj.fields.getIndex(field_name).?;
27736 const prev_field_src = enumFieldSrcLoc(decl, tree.*, union_obj.node_offset, prev_field_index);
27729 const prev_field_src = enumFieldSrcLoc(decl, tree.*, 0, prev_field_index);
2773727730 try sema.mod.errNoteNonLazy(prev_field_src.toSrcLoc(decl), msg, "other field here", .{});
2773827731 try sema.errNote(&block_scope, src, msg, "union declared here", .{});
2773927732 break :msg msg;
......@@ -27746,7 +27739,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2774627739 if (!enum_has_field) {
2774727740 const msg = msg: {
2774827741 const tree = try sema.getAstTree(&block_scope);
27749 const field_src = enumFieldSrcLoc(decl, tree.*, union_obj.node_offset, field_i);
27742 const field_src = enumFieldSrcLoc(decl, tree.*, 0, field_i);
2775027743 const msg = try sema.errMsg(&block_scope, field_src, "no field named '{s}' in enum '{}'", .{ field_name, union_obj.tag_ty.fmt(sema.mod) });
2775127744 errdefer msg.destroy(sema.gpa);
2775227745 try sema.addDeclaredHereNote(msg, union_obj.tag_ty);
......@@ -27759,7 +27752,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2775927752 if (field_ty.zigTypeTag() == .Opaque) {
2776027753 const msg = msg: {
2776127754 const tree = try sema.getAstTree(&block_scope);
27762 const field_src = enumFieldSrcLoc(decl, tree.*, union_obj.node_offset, field_i);
27755 const field_src = enumFieldSrcLoc(decl, tree.*, 0, field_i);
2776327756 const msg = try sema.errMsg(&block_scope, field_src, "opaque types have unknown size and therefore cannot be directly embedded in unions", .{});
2776427757 errdefer msg.destroy(sema.gpa);
2776527758
......@@ -27771,7 +27764,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2777127764 if (union_obj.layout == .Extern and !sema.validateExternType(field_ty, .union_field)) {
2777227765 const msg = msg: {
2777327766 const tree = try sema.getAstTree(&block_scope);
27774 const field_src = enumFieldSrcLoc(decl, tree.*, union_obj.node_offset, field_i);
27767 const field_src = enumFieldSrcLoc(decl, tree.*, 0, field_i);
2777527768 const msg = try sema.errMsg(&block_scope, field_src, "extern unions cannot contain fields of type '{}'", .{field_ty.fmt(sema.mod)});
2777627769 errdefer msg.destroy(sema.gpa);
2777727770
......@@ -27784,7 +27777,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2778427777 } else if (union_obj.layout == .Packed and !(validatePackedType(field_ty))) {
2778527778 const msg = msg: {
2778627779 const tree = try sema.getAstTree(&block_scope);
27787 const fields_src = enumFieldSrcLoc(decl, tree.*, union_obj.node_offset, field_i);
27780 const fields_src = enumFieldSrcLoc(decl, tree.*, 0, field_i);
2778827781 const msg = try sema.errMsg(&block_scope, fields_src, "packed unions cannot contain fields of type '{}'", .{field_ty.fmt(sema.mod)});
2778927782 errdefer msg.destroy(sema.gpa);
2779027783
......@@ -27876,7 +27869,6 @@ fn generateUnionTagTypeNumbered(
2787627869 .tag_ty = int_ty,
2787727870 .fields = .{},
2787827871 .values = .{},
27879 .node_offset = 0,
2788027872 };
2788127873 // Here we pre-allocate the maps using the decl arena.
2788227874 try enum_obj.fields.ensureTotalCapacity(new_decl_arena_allocator, fields_len);
......@@ -27934,7 +27926,6 @@ fn generateUnionTagTypeSimple(sema: *Sema, block: *Block, fields_len: usize, may
2793427926 enum_obj.* = .{
2793527927 .owner_decl = new_decl_index,
2793627928 .fields = .{},
27937 .node_offset = 0,
2793827929 };
2793927930 // Here we pre-allocate the maps using the decl arena.
2794027931 try enum_obj.fields.ensureTotalCapacity(new_decl_arena_allocator, fields_len);
......@@ -28245,7 +28236,7 @@ fn enumFieldSrcLoc(
2824528236 => tree.containerDeclArg(enum_node),
2824628237
2824728238 // Container was constructed with `@Type`.
28248 else => return LazySrcLoc.nodeOffset(node_offset),
28239 else => return LazySrcLoc.nodeOffset(0),
2824928240 };
2825028241 var it_index: usize = 0;
2825128242 for (container_decl.ast.members) |member_node| {
src/print_zir.zig+16
......@@ -1245,6 +1245,10 @@ const Writer = struct {
12451245 if (decls_len == 0) {
12461246 try stream.writeAll("{}, ");
12471247 } else {
1248 const prev_parent_decl_node = self.parent_decl_node;
1249 if (src_node) |off| self.parent_decl_node = self.relativeToNodeIndex(off);
1250 defer self.parent_decl_node = prev_parent_decl_node;
1251
12481252 try stream.writeAll("{\n");
12491253 self.indent += 2;
12501254 extra_index = try self.writeDecls(stream, decls_len, extra_index);
......@@ -1415,6 +1419,10 @@ const Writer = struct {
14151419 if (decls_len == 0) {
14161420 try stream.writeAll("{}, ");
14171421 } else {
1422 const prev_parent_decl_node = self.parent_decl_node;
1423 if (src_node) |off| self.parent_decl_node = self.relativeToNodeIndex(off);
1424 defer self.parent_decl_node = prev_parent_decl_node;
1425
14181426 try stream.writeAll("{\n");
14191427 self.indent += 2;
14201428 extra_index = try self.writeDecls(stream, decls_len, extra_index);
......@@ -1662,6 +1670,10 @@ const Writer = struct {
16621670 if (decls_len == 0) {
16631671 try stream.writeAll("{}, ");
16641672 } else {
1673 const prev_parent_decl_node = self.parent_decl_node;
1674 if (src_node) |off| self.parent_decl_node = self.relativeToNodeIndex(off);
1675 defer self.parent_decl_node = prev_parent_decl_node;
1676
16651677 try stream.writeAll("{\n");
16661678 self.indent += 2;
16671679 extra_index = try self.writeDecls(stream, decls_len, extra_index);
......@@ -1755,6 +1767,10 @@ const Writer = struct {
17551767 if (decls_len == 0) {
17561768 try stream.writeAll("{})");
17571769 } else {
1770 const prev_parent_decl_node = self.parent_decl_node;
1771 if (src_node) |off| self.parent_decl_node = self.relativeToNodeIndex(off);
1772 defer self.parent_decl_node = prev_parent_decl_node;
1773
17581774 try stream.writeAll("{\n");
17591775 self.indent += 2;
17601776 _ = try self.writeDecls(stream, decls_len, extra_index);
src/type.zig-44
......@@ -5771,50 +5771,6 @@ pub const Type = extern union {
57715771 }
57725772 }
57735773
5774 pub fn getNodeOffset(ty: Type) i32 {
5775 switch (ty.tag()) {
5776 .enum_full, .enum_nonexhaustive => {
5777 const enum_full = ty.cast(Payload.EnumFull).?.data;
5778 return enum_full.node_offset;
5779 },
5780 .enum_numbered => return ty.castTag(.enum_numbered).?.data.node_offset,
5781 .enum_simple => {
5782 const enum_simple = ty.castTag(.enum_simple).?.data;
5783 return enum_simple.node_offset;
5784 },
5785 .@"struct" => {
5786 const struct_obj = ty.castTag(.@"struct").?.data;
5787 return struct_obj.node_offset;
5788 },
5789 .error_set => {
5790 const error_set = ty.castTag(.error_set).?.data;
5791 return error_set.node_offset;
5792 },
5793 .@"union", .union_safety_tagged, .union_tagged => {
5794 const union_obj = ty.cast(Payload.Union).?.data;
5795 return union_obj.node_offset;
5796 },
5797 .@"opaque" => {
5798 const opaque_obj = ty.cast(Payload.Opaque).?.data;
5799 return opaque_obj.node_offset;
5800 },
5801 .atomic_order,
5802 .atomic_rmw_op,
5803 .calling_convention,
5804 .address_space,
5805 .float_mode,
5806 .reduce_op,
5807 .call_options,
5808 .prefetch_options,
5809 .export_options,
5810 .extern_options,
5811 .type_info,
5812 => unreachable, // These need to be resolved earlier.
5813
5814 else => unreachable,
5815 }
5816 }
5817
58185774 /// This enum does not directly correspond to `std.builtin.TypeId` because
58195775 /// it has extra enum tags in it, as a way of using less memory. For example,
58205776 /// even though Zig recognizes `*align(10) i32` and `*i32` both as Pointer types
test/cases/compile_errors/non_constant_expression_in_array_size.zig+1-1
......@@ -11,4 +11,4 @@ export fn entry() usize { return @offsetOf(Foo, "y"); }
1111// target=native
1212//
1313// :5:25: error: cannot load runtime value in comptime block
14// :2:15: note: called from here
14// :2:12: note: called from here
test/cases/compile_errors/not_an_enum_type.zig+1-1
......@@ -17,4 +17,4 @@ const ExpectedVarDeclOrFn = struct {};
1717// target=native
1818//
1919// :4:9: error: expected type '@typeInfo(tmp.Error).Union.tag_type.?', found 'type'
20// :8:1: note: enum declared here
20// :8:15: note: enum declared here
test/cases/compile_errors/tagName_on_invalid_value_of_non-exhaustive_enum.zig+1-1
......@@ -9,4 +9,4 @@ test "enum" {
99// is_test=1
1010//
1111// :3:9: error: no field with value '5' in enum 'test.enum.E'
12// :1:1: note: declared here
12// :2:15: note: declared here
test/cases/error_in_nested_declaration.zig created+31
......@@ -0,0 +1,31 @@
1const S = struct {
2 b: u32,
3 c: i32,
4 a: struct {
5 pub fn str(_: @This(), extra: []u32) []i32 {
6 return @bitCast([]i32, extra);
7 }
8 },
9};
10
11pub export fn entry() void {
12 var s: S = undefined;
13 _ = s.a.str(undefined);
14}
15
16const S2 = struct {
17 a: [*c]anyopaque,
18};
19
20pub export fn entry2() void {
21 var s: S2 = undefined;
22 _ = s;
23}
24
25// error
26// backend=llvm
27// target=native
28//
29// :17:12: error: C pointers cannot point to opaque types
30// :6:29: error: cannot @bitCast to '[]i32'
31// :6:29: note: use @ptrCast to cast from '[]u32'