@@ -953,6 +953,7 @@ fn analyzeBodyInner(
953953 .int_type => try sema.zirIntType(block, inst),
954954 .is_non_err => try sema.zirIsNonErr(block, inst),
955955 .is_non_err_ptr => try sema.zirIsNonErrPtr(block, inst),
956+ .ret_is_non_err => try sema.zirRetIsNonErr(block, inst),
956957 .is_non_null => try sema.zirIsNonNull(block, inst),
957958 .is_non_null_ptr => try sema.zirIsNonNullPtr(block, inst),
958959 .merge_error_sets => try sema.zirMergeErrorSets(block, inst),
@@ -9004,7 +9005,7 @@ fn zirParam(
90049005 else => |e| return e,
90059006 } or comptime_syntax;
90069007 if (sema.inst_map.get(inst)) |arg| {
9007- if (is_comptime) {
9008+ if (is_comptime and sema.preallocated_new_func != null ) {
90089009 // We have a comptime value for this parameter so it should be elided from the
90099010 // function type of the function instruction in this block.
90109011 const coerced_arg = try sema.coerce(block, param_ty, arg, src);
@@ -10288,6 +10289,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1028810289 .ret_err_value_code,
1028910290 .restore_err_ret_index,
1029010291 .is_non_err,
10292+ .ret_is_non_err,
1029110293 .condbr,
1029210294 => {},
1029310295 else => break,
@@ -16215,11 +16217,54 @@ fn typeInfoDecls(
1621516217 };
1621616218 try sema.queueFullTypeResolution(try declaration_ty.copy(sema.arena));
1621716219
16218- const decls_len = if (opt_namespace) |ns| ns.decls.count() else 0;
16219- const decls_vals = try decls_anon_decl.arena().alloc(Value, decls_len);
16220- for (decls_vals) |*decls_val, i| {
16221- const decl_index = opt_namespace.?.decls.keys()[i];
16220+ var decl_vals = std.ArrayList(Value).init(sema.gpa);
16221+ defer decl_vals.deinit();
16222+
16223+ var seen_namespaces = std.AutoHashMap(*Namespace, void).init(sema.gpa);
16224+ defer seen_namespaces.deinit();
16225+
16226+ if (opt_namespace) |some| {
16227+ try sema.typeInfoNamespaceDecls(block, decls_anon_decl.arena(), some, &decl_vals, &seen_namespaces);
16228+ }
16229+
16230+ const new_decl = try decls_anon_decl.finish(
16231+ try Type.Tag.array.create(decls_anon_decl.arena(), .{
16232+ .len = decl_vals.items.len,
16233+ .elem_type = declaration_ty,
16234+ }),
16235+ try Value.Tag.aggregate.create(
16236+ decls_anon_decl.arena(),
16237+ try decls_anon_decl.arena().dupe(Value, decl_vals.items),
16238+ ),
16239+ 0, // default alignment
16240+ );
16241+ return try Value.Tag.slice.create(sema.arena, .{
16242+ .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),
16243+ .len = try Value.Tag.int_u64.create(sema.arena, decl_vals.items.len),
16244+ });
16245+ }
16246+
16247+ fn typeInfoNamespaceDecls(
16248+ sema: *Sema,
16249+ block: *Block,
16250+ decls_anon_decl: Allocator,
16251+ namespace: *Namespace,
16252+ decl_vals: *std.ArrayList(Value),
16253+ seen_namespaces: *std.AutoHashMap(*Namespace, void),
16254+ ) !void {
16255+ const gop = try seen_namespaces.getOrPut(namespace);
16256+ if (gop.found_existing) return;
16257+ const decls = namespace.decls.keys();
16258+ for (decls) |decl_index| {
1622216259 const decl = sema.mod.declPtr(decl_index);
16260+ if (decl.kind == .@"usingnamespace") {
16261+ try sema.mod.ensureDeclAnalyzed(decl_index);
16262+ var buf: Value.ToTypeBuffer = undefined;
16263+ const new_ns = decl.val.toType(&buf).getNamespace().?;
16264+ try sema.typeInfoNamespaceDecls(block, decls_anon_decl, new_ns, decl_vals, seen_namespaces);
16265+ continue;
16266+ }
16267+ if (decl.kind != .named) continue;
1622316268 const name_val = v: {
1622416269 var anon_decl = try block.startAnonDecl();
1622516270 defer anon_decl.deinit();
@@ -16229,37 +16274,21 @@ fn typeInfoDecls(
1622916274 try Value.Tag.bytes.create(anon_decl.arena(), bytes[0 .. bytes.len + 1]),
1623016275 0, // default alignment
1623116276 );
16232- break :v try Value.Tag.slice.create(decls_anon_decl.arena() , .{
16233- .ptr = try Value.Tag.decl_ref.create(decls_anon_decl.arena() , new_decl),
16234- .len = try Value.Tag.int_u64.create(decls_anon_decl.arena() , bytes.len),
16277+ break :v try Value.Tag.slice.create(decls_anon_decl, .{
16278+ .ptr = try Value.Tag.decl_ref.create(decls_anon_decl, new_decl),
16279+ .len = try Value.Tag.int_u64.create(decls_anon_decl, bytes.len),
1623516280 });
1623616281 };
1623716282
16238- const fields = try decls_anon_decl.arena(). create([2]Value);
16283+ const fields = try decls_anon_decl.create([2]Value);
1623916284 fields.* = .{
1624016285 //name: []const u8,
1624116286 name_val,
1624216287 //is_pub: bool,
1624316288 Value.makeBool(decl.is_pub),
1624416289 };
16245- decls_val.* = try Value.Tag.aggregate.create(decls_anon_decl.arena() , fields);
16290+ try decl_vals.append( try Value.Tag.aggregate.create(decls_anon_decl, fields) );
1624616291 }
16247-
16248- const new_decl = try decls_anon_decl.finish(
16249- try Type.Tag.array.create(decls_anon_decl.arena(), .{
16250- .len = decls_vals.len,
16251- .elem_type = declaration_ty,
16252- }),
16253- try Value.Tag.aggregate.create(
16254- decls_anon_decl.arena(),
16255- try decls_anon_decl.arena().dupe(Value, decls_vals),
16256- ),
16257- 0, // default alignment
16258- );
16259- return try Value.Tag.slice.create(sema.arena, .{
16260- .ptr = try Value.Tag.decl_ref.create(sema.arena, new_decl),
16261- .len = try Value.Tag.int_u64.create(sema.arena, decls_vals.len),
16262- });
1626316292}
1626416293
1626516294fn zirTypeof(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
@@ -16577,7 +16606,7 @@ fn zirIsNonErr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1657716606 const src = inst_data.src();
1657816607 const operand = try sema.resolveInst(inst_data.operand);
1657916608 try sema.checkErrorType(block, src, sema.typeOf(operand));
16580- return sema.analyzeIsNonErr(block, inst_data. src() , operand);
16609+ return sema.analyzeIsNonErr(block, src, operand);
1658116610}
1658216611
1658316612fn zirIsNonErrPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
@@ -16592,6 +16621,16 @@ fn zirIsNonErrPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
1659216621 return sema.analyzeIsNonErr(block, src, loaded);
1659316622}
1659416623
16624+ fn zirRetIsNonErr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
16625+ const tracy = trace(@src());
16626+ defer tracy.end();
16627+
16628+ const inst_data = sema.code.instructions.items(.data)[inst].un_node;
16629+ const src = inst_data.src();
16630+ const operand = try sema.resolveInst(inst_data.operand);
16631+ return sema.analyzeIsNonErr(block, src, operand);
16632+ }
16633+
1659516634fn zirCondbr(
1659616635 sema: *Sema,
1659716636 parent_block: *Block,
@@ -29847,6 +29886,11 @@ fn resolveStructLayout(sema: *Sema, ty: Type) CompileError!void {
2984729886 },
2984829887 .have_layout, .fully_resolved_wip, .fully_resolved => return,
2984929888 }
29889+ const prev_status = struct_obj.status;
29890+ errdefer if (struct_obj.status == .layout_wip) {
29891+ struct_obj.status = prev_status;
29892+ };
29893+
2985029894 struct_obj.status = .layout_wip;
2985129895 for (struct_obj.fields.values()) |field, i| {
2985229896 sema.resolveTypeLayout(field.ty) catch |err| switch (err) {
@@ -30026,6 +30070,11 @@ fn resolveUnionLayout(sema: *Sema, ty: Type) CompileError!void {
3002630070 },
3002730071 .have_layout, .fully_resolved_wip, .fully_resolved => return,
3002830072 }
30073+ const prev_status = union_obj.status;
30074+ errdefer if (union_obj.status == .layout_wip) {
30075+ union_obj.status = prev_status;
30076+ };
30077+
3002930078 union_obj.status = .layout_wip;
3003030079 for (union_obj.fields.values()) |field, i| {
3003130080 sema.resolveTypeLayout(field.ty) catch |err| switch (err) {
0 commit comments