authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-08-03 20:13:07-07:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2022-08-03 20:13:07-07:00
loge483336ba454743e65fd72a5d4dd74732dc1ef0f
tree51f5ee800c4c423fe5224fbc9c2ff9d2dc576ba3
parent4c750016eb9b1c0831cbb0398a4d6ee9dbdc932e
parent4ab60dc18b44cffad88d470c567920bcc34b1214
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #12318 from Vexu/stage2-compile-errors

Stage2: misc compile error improvements

41 files changed, 693 insertions(+), 428 deletions(-)

src/AstGen.zig+111-23
......@@ -768,12 +768,12 @@ fn expr(gz: *GenZir, scope: *Scope, rl: ResultLoc, node: Ast.Node.Index) InnerEr
768768 .if_simple => return ifExpr(gz, scope, rl.br(), node, tree.ifSimple(node)),
769769 .@"if" => return ifExpr(gz, scope, rl.br(), node, tree.ifFull(node)),
770770
771 .while_simple => return whileExpr(gz, scope, rl.br(), node, tree.whileSimple(node)),
772 .while_cont => return whileExpr(gz, scope, rl.br(), node, tree.whileCont(node)),
773 .@"while" => return whileExpr(gz, scope, rl.br(), node, tree.whileFull(node)),
771 .while_simple => return whileExpr(gz, scope, rl.br(), node, tree.whileSimple(node), false),
772 .while_cont => return whileExpr(gz, scope, rl.br(), node, tree.whileCont(node), false),
773 .@"while" => return whileExpr(gz, scope, rl.br(), node, tree.whileFull(node), false),
774774
775 .for_simple => return forExpr(gz, scope, rl.br(), node, tree.forSimple(node)),
776 .@"for" => return forExpr(gz, scope, rl.br(), node, tree.forFull(node)),
775 .for_simple => return forExpr(gz, scope, rl.br(), node, tree.forSimple(node), false),
776 .@"for" => return forExpr(gz, scope, rl.br(), node, tree.forFull(node), false),
777777
778778 .slice_open => {
779779 const lhs = try expr(gz, scope, .ref, node_datas[node].lhs);
......@@ -1899,6 +1899,17 @@ fn breakExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index) Inn
18991899 .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent,
19001900 .namespace => break,
19011901 .defer_normal, .defer_error => scope = scope.cast(Scope.Defer).?.parent,
1902 .defer_gen => {
1903 const defer_gen = scope.cast(Scope.DeferGen).?;
1904
1905 return astgen.failNodeNotes(node, "cannot break out of defer expression", .{}, &.{
1906 try astgen.errNoteNode(
1907 defer_gen.defer_node,
1908 "defer expression here",
1909 .{},
1910 ),
1911 });
1912 },
19021913 .top => unreachable,
19031914 }
19041915 }
......@@ -1958,6 +1969,17 @@ fn continueExpr(parent_gz: *GenZir, parent_scope: *Scope, node: Ast.Node.Index)
19581969 try unusedResultDeferExpr(parent_gz, defer_scope, defer_scope.parent, expr_node);
19591970 },
19601971 .defer_error => scope = scope.cast(Scope.Defer).?.parent,
1972 .defer_gen => {
1973 const defer_gen = scope.cast(Scope.DeferGen).?;
1974
1975 return astgen.failNodeNotes(node, "cannot continue out of defer expression", .{}, &.{
1976 try astgen.errNoteNode(
1977 defer_gen.defer_node,
1978 "defer expression here",
1979 .{},
1980 ),
1981 });
1982 },
19611983 .namespace => break,
19621984 .top => unreachable,
19631985 }
......@@ -2022,6 +2044,7 @@ fn checkLabelRedefinition(astgen: *AstGen, parent_scope: *Scope, label: Ast.Toke
20222044 .local_val => scope = scope.cast(Scope.LocalVal).?.parent,
20232045 .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent,
20242046 .defer_normal, .defer_error => scope = scope.cast(Scope.Defer).?.parent,
2047 .defer_gen => scope = scope.cast(Scope.DeferGen).?.parent,
20252048 .namespace => break,
20262049 .top => unreachable,
20272050 }
......@@ -2129,6 +2152,7 @@ fn blockExprStmts(gz: *GenZir, parent_scope: *Scope, statements: []const Ast.Nod
21292152 const astgen = gz.astgen;
21302153 const tree = astgen.tree;
21312154 const node_tags = tree.nodes.items(.tag);
2155 const node_data = tree.nodes.items(.data);
21322156
21332157 if (statements.len == 0) return;
21342158
......@@ -2155,8 +2179,10 @@ fn blockExprStmts(gz: *GenZir, parent_scope: *Scope, statements: []const Ast.Nod
21552179 },
21562180 );
21572181 }
2158 switch (node_tags[statement]) {
2159 // zig fmt: off
2182 var inner_node = statement;
2183 while (true) {
2184 switch (node_tags[inner_node]) {
2185 // zig fmt: off
21602186 .global_var_decl => scope = try varDecl(gz, scope, statement, block_arena_allocator, tree.globalVarDecl(statement)),
21612187 .local_var_decl => scope = try varDecl(gz, scope, statement, block_arena_allocator, tree.localVarDecl(statement)),
21622188 .simple_var_decl => scope = try varDecl(gz, scope, statement, block_arena_allocator, tree.simpleVarDecl(statement)),
......@@ -2181,9 +2207,23 @@ fn blockExprStmts(gz: *GenZir, parent_scope: *Scope, statements: []const Ast.Nod
21812207 .assign_add_wrap => try assignOp(gz, scope, statement, .addwrap),
21822208 .assign_mul => try assignOp(gz, scope, statement, .mul),
21832209 .assign_mul_wrap => try assignOp(gz, scope, statement, .mulwrap),
2210
2211 .grouped_expression => {
2212 inner_node = node_data[statement].lhs;
2213 continue;
2214 },
2215
2216 .while_simple => _ = try whileExpr(gz, scope, .discard, inner_node, tree.whileSimple(inner_node), true),
2217 .while_cont => _ = try whileExpr(gz, scope, .discard, inner_node, tree.whileCont(inner_node), true),
2218 .@"while" => _ = try whileExpr(gz, scope, .discard, inner_node, tree.whileFull(inner_node), true),
2219
2220 .for_simple => _ = try forExpr(gz, scope, .discard, inner_node, tree.forSimple(inner_node), true),
2221 .@"for" => _ = try forExpr(gz, scope, .discard, inner_node, tree.forFull(inner_node), true),
21842222
2185 else => noreturn_src_node = try unusedResultExpr(gz, scope, statement),
2223 else => noreturn_src_node = try unusedResultExpr(gz, scope, inner_node),
21862224 // zig fmt: on
2225 }
2226 break;
21872227 }
21882228 }
21892229
......@@ -2206,7 +2246,13 @@ fn unusedResultDeferExpr(gz: *GenZir, defer_scope: *Scope.Defer, expr_scope: *Sc
22062246 astgen.source_offset = defer_scope.source_offset;
22072247 astgen.source_line = defer_scope.source_line;
22082248 astgen.source_column = defer_scope.source_column;
2209 _ = try unusedResultExpr(gz, expr_scope, expr_node);
2249
2250 var defer_gen: Scope.DeferGen = .{
2251 .parent = expr_scope,
2252 .defer_node = defer_scope.defer_node,
2253 };
2254
2255 _ = try unusedResultExpr(gz, &defer_gen.base, expr_node);
22102256}
22112257
22122258/// Returns AST source node of the thing that is noreturn if the statement is
......@@ -2216,6 +2262,10 @@ fn unusedResultExpr(gz: *GenZir, scope: *Scope, statement: Ast.Node.Index) Inner
22162262 // We need to emit an error if the result is not `noreturn` or `void`, but
22172263 // we want to avoid adding the ZIR instruction if possible for performance.
22182264 const maybe_unused_result = try expr(gz, scope, .none, statement);
2265 return addEnsureResult(gz, maybe_unused_result, statement);
2266}
2267
2268fn addEnsureResult(gz: *GenZir, maybe_unused_result: Zir.Inst.Ref, statement: Ast.Node.Index) InnerError!Ast.Node.Index {
22192269 var noreturn_src_node: Ast.Node.Index = 0;
22202270 const elide_check = if (refToIndex(maybe_unused_result)) |inst| b: {
22212271 // Note that this array becomes invalid after appending more items to it
......@@ -2553,6 +2603,7 @@ fn countDefers(astgen: *AstGen, outer_scope: *Scope, inner_scope: *Scope) struct
25532603 .gen_zir => scope = scope.cast(GenZir).?.parent,
25542604 .local_val => scope = scope.cast(Scope.LocalVal).?.parent,
25552605 .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent,
2606 .defer_gen => scope = scope.cast(Scope.DeferGen).?.parent,
25562607 .defer_normal => {
25572608 const defer_scope = scope.cast(Scope.Defer).?;
25582609 scope = defer_scope.parent;
......@@ -2602,6 +2653,7 @@ fn genDefers(
26022653 .gen_zir => scope = scope.cast(GenZir).?.parent,
26032654 .local_val => scope = scope.cast(Scope.LocalVal).?.parent,
26042655 .local_ptr => scope = scope.cast(Scope.LocalPtr).?.parent,
2656 .defer_gen => scope = scope.cast(Scope.DeferGen).?.parent,
26052657 .defer_normal => {
26062658 const defer_scope = scope.cast(Scope.Defer).?;
26072659 scope = defer_scope.parent;
......@@ -2644,6 +2696,7 @@ fn genDefers(
26442696 break :blk &local_val_scope.base;
26452697 };
26462698 try unusedResultDeferExpr(gz, defer_scope, sub_scope, expr_node);
2699 try checkUsed(gz, scope, sub_scope);
26472700 try gz.addDbgBlockEnd();
26482701 },
26492702 .normal_only => continue,
......@@ -2681,6 +2734,7 @@ fn checkUsed(
26812734 scope = s.parent;
26822735 },
26832736 .defer_normal, .defer_error => scope = scope.cast(Scope.Defer).?.parent,
2737 .defer_gen => scope = scope.cast(Scope.DeferGen).?.parent,
26842738 .namespace => unreachable,
26852739 .top => unreachable,
26862740 }
......@@ -4040,6 +4094,7 @@ fn testDecl(
40404094 .local_val, .local_ptr => unreachable, // a test cannot be in a local scope
40414095 .gen_zir => s = s.cast(GenZir).?.parent,
40424096 .defer_normal, .defer_error => s = s.cast(Scope.Defer).?.parent,
4097 .defer_gen => s = s.cast(Scope.DeferGen).?.parent,
40434098 .namespace => {
40444099 const ns = s.cast(Scope.Namespace).?;
40454100 if (ns.decls.get(name_str_index)) |i| {
......@@ -5330,7 +5385,7 @@ fn ifExpr(
53305385 const tag: Zir.Inst.Tag = if (payload_is_ref) .is_non_err_ptr else .is_non_err;
53315386 break :c .{
53325387 .inst = err_union,
5333 .bool_bit = try block_scope.addUnNode(tag, err_union, node),
5388 .bool_bit = try block_scope.addUnNode(tag, err_union, if_full.ast.cond_expr),
53345389 };
53355390 } else if (if_full.payload_token) |_| {
53365391 const cond_rl: ResultLoc = if (payload_is_ref) .ref else .none;
......@@ -5338,7 +5393,7 @@ fn ifExpr(
53385393 const tag: Zir.Inst.Tag = if (payload_is_ref) .is_non_null_ptr else .is_non_null;
53395394 break :c .{
53405395 .inst = optional,
5341 .bool_bit = try block_scope.addUnNode(tag, optional, node),
5396 .bool_bit = try block_scope.addUnNode(tag, optional, if_full.ast.cond_expr),
53425397 };
53435398 } else {
53445399 const cond = try expr(&block_scope, &block_scope.base, bool_rl, if_full.ast.cond_expr);
......@@ -5369,7 +5424,7 @@ fn ifExpr(
53695424 .err_union_payload_unsafe_ptr
53705425 else
53715426 .err_union_payload_unsafe;
5372 const payload_inst = try then_scope.addUnNode(tag, cond.inst, node);
5427 const payload_inst = try then_scope.addUnNode(tag, cond.inst, if_full.ast.then_expr);
53735428 const token_name_index = payload_token + @boolToInt(payload_is_ref);
53745429 const ident_name = try astgen.identAsString(token_name_index);
53755430 const token_name_str = tree.tokenSlice(token_name_index);
......@@ -5398,7 +5453,7 @@ fn ifExpr(
53985453 const ident_bytes = tree.tokenSlice(ident_token);
53995454 if (mem.eql(u8, "_", ident_bytes))
54005455 break :s &then_scope.base;
5401 const payload_inst = try then_scope.addUnNode(tag, cond.inst, node);
5456 const payload_inst = try then_scope.addUnNode(tag, cond.inst, if_full.ast.then_expr);
54025457 const ident_name = try astgen.identAsString(ident_token);
54035458 try astgen.detectLocalShadowing(&then_scope.base, ident_name, ident_token, ident_bytes);
54045459 payload_val_scope = .{
......@@ -5441,7 +5496,7 @@ fn ifExpr(
54415496 .err_union_code_ptr
54425497 else
54435498 .err_union_code;
5444 const payload_inst = try else_scope.addUnNode(tag, cond.inst, node);
5499 const payload_inst = try else_scope.addUnNode(tag, cond.inst, if_full.ast.cond_expr);
54455500 const ident_name = try astgen.identAsString(error_token);
54465501 const error_token_str = tree.tokenSlice(error_token);
54475502 if (mem.eql(u8, "_", error_token_str))
......@@ -5615,6 +5670,7 @@ fn whileExpr(
56155670 rl: ResultLoc,
56165671 node: Ast.Node.Index,
56175672 while_full: Ast.full.While,
5673 is_statement: bool,
56185674) InnerError!Zir.Inst.Ref {
56195675 const astgen = parent_gz.astgen;
56205676 const tree = astgen.tree;
......@@ -5654,7 +5710,7 @@ fn whileExpr(
56545710 const tag: Zir.Inst.Tag = if (payload_is_ref) .is_non_err_ptr else .is_non_err;
56555711 break :c .{
56565712 .inst = err_union,
5657 .bool_bit = try continue_scope.addUnNode(tag, err_union, node),
5713 .bool_bit = try continue_scope.addUnNode(tag, err_union, while_full.ast.then_expr),
56585714 };
56595715 } else if (while_full.payload_token) |_| {
56605716 const cond_rl: ResultLoc = if (payload_is_ref) .ref else .none;
......@@ -5662,7 +5718,7 @@ fn whileExpr(
56625718 const tag: Zir.Inst.Tag = if (payload_is_ref) .is_non_null_ptr else .is_non_null;
56635719 break :c .{
56645720 .inst = optional,
5665 .bool_bit = try continue_scope.addUnNode(tag, optional, node),
5721 .bool_bit = try continue_scope.addUnNode(tag, optional, while_full.ast.then_expr),
56665722 };
56675723 } else {
56685724 const cond = try expr(&continue_scope, &continue_scope.base, bool_rl, while_full.ast.cond_expr);
......@@ -5700,7 +5756,7 @@ fn whileExpr(
57005756 else
57015757 .err_union_payload_unsafe;
57025758 // will add this instruction to then_scope.instructions below
5703 payload_inst = try then_scope.makeUnNode(tag, cond.inst, node);
5759 payload_inst = try then_scope.makeUnNode(tag, cond.inst, while_full.ast.cond_expr);
57045760 const ident_token = if (payload_is_ref) payload_token + 1 else payload_token;
57055761 const ident_bytes = tree.tokenSlice(ident_token);
57065762 if (mem.eql(u8, "_", ident_bytes))
......@@ -5729,7 +5785,7 @@ fn whileExpr(
57295785 else
57305786 .optional_payload_unsafe;
57315787 // will add this instruction to then_scope.instructions below
5732 payload_inst = try then_scope.makeUnNode(tag, cond.inst, node);
5788 payload_inst = try then_scope.makeUnNode(tag, cond.inst, while_full.ast.cond_expr);
57335789 const ident_name = try astgen.identAsString(ident_token);
57345790 const ident_bytes = tree.tokenSlice(ident_token);
57355791 if (mem.eql(u8, "_", ident_bytes))
......@@ -5785,6 +5841,8 @@ fn whileExpr(
57855841 try then_scope.addDbgVar(.dbg_var_val, some, dbg_var_inst);
57865842 }
57875843 const then_result = try expr(&then_scope, then_sub_scope, loop_scope.break_result_loc, while_full.ast.then_expr);
5844 _ = try addEnsureResult(&then_scope, then_result, while_full.ast.then_expr);
5845
57885846 try checkUsed(parent_gz, &then_scope.base, then_sub_scope);
57895847 try then_scope.addDbgBlockEnd();
57905848
......@@ -5803,7 +5861,7 @@ fn whileExpr(
58035861 .err_union_code_ptr
58045862 else
58055863 .err_union_code;
5806 const else_payload_inst = try else_scope.addUnNode(tag, cond.inst, node);
5864 const else_payload_inst = try else_scope.addUnNode(tag, cond.inst, while_full.ast.cond_expr);
58075865 const ident_name = try astgen.identAsString(error_token);
58085866 const ident_bytes = tree.tokenSlice(error_token);
58095867 if (mem.eql(u8, ident_bytes, "_"))
......@@ -5827,7 +5885,11 @@ fn whileExpr(
58275885 // control flow apply to outer loops; not this one.
58285886 loop_scope.continue_block = 0;
58295887 loop_scope.break_block = 0;
5830 const e = try expr(&else_scope, sub_scope, loop_scope.break_result_loc, else_node);
5888 const else_result = try expr(&else_scope, sub_scope, loop_scope.break_result_loc, else_node);
5889 if (is_statement) {
5890 _ = try addEnsureResult(&else_scope, else_result, else_node);
5891 }
5892
58315893 if (!else_scope.endsWithNoReturn()) {
58325894 loop_scope.break_count += 1;
58335895 }
......@@ -5835,7 +5897,7 @@ fn whileExpr(
58355897 try else_scope.addDbgBlockEnd();
58365898 break :blk .{
58375899 .src = else_node,
5838 .result = e,
5900 .result = else_result,
58395901 };
58405902 } else .{
58415903 .src = while_full.ast.then_expr,
......@@ -5848,7 +5910,7 @@ fn whileExpr(
58485910 }
58495911 }
58505912 const break_tag: Zir.Inst.Tag = if (is_inline) .break_inline else .@"break";
5851 return finishThenElseBlock(
5913 const result = try finishThenElseBlock(
58525914 parent_gz,
58535915 rl,
58545916 node,
......@@ -5863,6 +5925,10 @@ fn whileExpr(
58635925 cond_block,
58645926 break_tag,
58655927 );
5928 if (is_statement) {
5929 _ = try parent_gz.addUnNode(.ensure_result_used, result, node);
5930 }
5931 return result;
58665932}
58675933
58685934fn forExpr(
......@@ -5871,6 +5937,7 @@ fn forExpr(
58715937 rl: ResultLoc,
58725938 node: Ast.Node.Index,
58735939 for_full: Ast.full.While,
5940 is_statement: bool,
58745941) InnerError!Zir.Inst.Ref {
58755942 const astgen = parent_gz.astgen;
58765943
......@@ -6014,6 +6081,8 @@ fn forExpr(
60146081 };
60156082
60166083 const then_result = try expr(&then_scope, then_sub_scope, loop_scope.break_result_loc, for_full.ast.then_expr);
6084 _ = try addEnsureResult(&then_scope, then_result, for_full.ast.then_expr);
6085
60176086 try checkUsed(parent_gz, &then_scope.base, then_sub_scope);
60186087 try then_scope.addDbgBlockEnd();
60196088
......@@ -6031,6 +6100,10 @@ fn forExpr(
60316100 loop_scope.continue_block = 0;
60326101 loop_scope.break_block = 0;
60336102 const else_result = try expr(&else_scope, sub_scope, loop_scope.break_result_loc, else_node);
6103 if (is_statement) {
6104 _ = try addEnsureResult(&else_scope, else_result, else_node);
6105 }
6106
60346107 if (!else_scope.endsWithNoReturn()) {
60356108 loop_scope.break_count += 1;
60366109 }
......@@ -6049,7 +6122,7 @@ fn forExpr(
60496122 }
60506123 }
60516124 const break_tag: Zir.Inst.Tag = if (is_inline) .break_inline else .@"break";
6052 return finishThenElseBlock(
6125 const result = try finishThenElseBlock(
60536126 parent_gz,
60546127 rl,
60556128 node,
......@@ -6064,6 +6137,10 @@ fn forExpr(
60646137 cond_block,
60656138 break_tag,
60666139 );
6140 if (is_statement) {
6141 _ = try parent_gz.addUnNode(.ensure_result_used, result, node);
6142 }
6143 return result;
60676144}
60686145
60696146fn switchExpr(
......@@ -6730,6 +6807,7 @@ fn localVarRef(
67306807 },
67316808 .gen_zir => s = s.cast(GenZir).?.parent,
67326809 .defer_normal, .defer_error => s = s.cast(Scope.Defer).?.parent,
6810 .defer_gen => s = s.cast(Scope.DeferGen).?.parent,
67336811 .namespace => {
67346812 const ns = s.cast(Scope.Namespace).?;
67356813 if (ns.decls.get(name_str_index)) |i| {
......@@ -7351,6 +7429,7 @@ fn builtinCall(
73517429 },
73527430 .gen_zir => s = s.cast(GenZir).?.parent,
73537431 .defer_normal, .defer_error => s = s.cast(Scope.Defer).?.parent,
7432 .defer_gen => s = s.cast(Scope.DeferGen).?.parent,
73547433 .namespace => {
73557434 const ns = s.cast(Scope.Namespace).?;
73567435 if (ns.decls.get(decl_name)) |i| {
......@@ -9808,6 +9887,7 @@ const Scope = struct {
98089887 local_ptr,
98099888 defer_normal,
98109889 defer_error,
9890 defer_gen,
98119891 namespace,
98129892 top,
98139893 };
......@@ -9905,6 +9985,13 @@ const Scope = struct {
99059985 const base_tag: Scope.Tag = .top;
99069986 base: Scope = Scope{ .tag = base_tag },
99079987 };
9988
9989 const DeferGen = struct {
9990 const base_tag: Scope.Tag = .defer_gen;
9991 base: Scope = Scope{ .tag = base_tag },
9992 parent: *Scope,
9993 defer_node: Ast.Node.Index,
9994 };
99089995};
99099996
99109997/// This is a temporary structure; references to it are valid only
......@@ -11415,6 +11502,7 @@ fn detectLocalShadowing(
1141511502 },
1141611503 .gen_zir => s = s.cast(GenZir).?.parent,
1141711504 .defer_normal, .defer_error => s = s.cast(Scope.Defer).?.parent,
11505 .defer_gen => s = s.cast(Scope.DeferGen).?.parent,
1141811506 .top => break,
1141911507 };
1142011508}
src/Sema.zig+251-137
......@@ -74,6 +74,8 @@ types_to_resolve: std.ArrayListUnmanaged(Air.Inst.Ref) = .{},
7474/// Sema must convert comptime control flow to runtime control flow, which means
7575/// breaking from a block.
7676post_hoc_blocks: std.AutoHashMapUnmanaged(Air.Inst.Index, *LabeledBlock) = .{},
77/// Populated with the last compile error created.
78err: ?*Module.ErrorMsg = null,
7779
7880const std = @import("std");
7981const mem = std.mem;
......@@ -174,7 +176,6 @@ pub const Block = struct {
174176 pub const Inlining = struct {
175177 comptime_result: Air.Inst.Ref,
176178 merges: Merges,
177 err: ?*Module.ErrorMsg = null,
178179 };
179180
180181 pub const Merges = struct {
......@@ -1159,7 +1160,7 @@ fn analyzeBodyInner(
11591160 try sema.errNote(block, runtime_src, msg, "runtime control flow here", .{});
11601161 break :msg msg;
11611162 };
1162 return sema.failWithOwnedErrorMsg(block, msg);
1163 return sema.failWithOwnedErrorMsg(msg);
11631164 }
11641165 }
11651166 i += 1;
......@@ -1738,7 +1739,7 @@ fn failWithNeededComptime(sema: *Sema, block: *Block, src: LazySrcLoc, reason: [
17381739 try sema.errNote(block, src, msg, "{s}", .{reason});
17391740 break :msg msg;
17401741 };
1741 return sema.failWithOwnedErrorMsg(block, msg);
1742 return sema.failWithOwnedErrorMsg(msg);
17421743}
17431744
17441745fn failWithUseOfUndef(sema: *Sema, block: *Block, src: LazySrcLoc) CompileError {
......@@ -1770,7 +1771,7 @@ fn failWithArrayInitNotSupported(sema: *Sema, block: *Block, src: LazySrcLoc, ty
17701771 }
17711772 break :msg msg;
17721773 };
1773 return sema.failWithOwnedErrorMsg(block, msg);
1774 return sema.failWithOwnedErrorMsg(msg);
17741775}
17751776
17761777fn failWithStructInitNotSupported(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) CompileError {
......@@ -1801,7 +1802,7 @@ fn failWithIntegerOverflow(sema: *Sema, block: *Block, src: LazySrcLoc, int_ty:
18011802 try sema.errNote(block, src, msg, "when computing vector element at index '{d}'", .{vector_index});
18021803 break :msg msg;
18031804 };
1804 return sema.failWithOwnedErrorMsg(block, msg);
1805 return sema.failWithOwnedErrorMsg(msg);
18051806 }
18061807 return sema.fail(block, src, "overflow of integer type '{}' with value '{}'", .{
18071808 int_ty.fmt(sema.mod), val.fmtValue(int_ty, sema.mod),
......@@ -1823,7 +1824,7 @@ fn failWithInvalidComptimeFieldStore(sema: *Sema, block: *Block, init_src: LazyS
18231824 try sema.errNote(block, default_value_src, msg, "default value set here", .{});
18241825 break :msg msg;
18251826 };
1826 return sema.failWithOwnedErrorMsg(block, msg);
1827 return sema.failWithOwnedErrorMsg(msg);
18271828}
18281829
18291830/// We don't return a pointer to the new error note because the pointer
......@@ -1878,10 +1879,10 @@ pub fn fail(
18781879 args: anytype,
18791880) CompileError {
18801881 const err_msg = try sema.errMsg(block, src, format, args);
1881 return sema.failWithOwnedErrorMsg(block, err_msg);
1882 return sema.failWithOwnedErrorMsg(err_msg);
18821883}
18831884
1884fn failWithOwnedErrorMsg(sema: *Sema, block: *Block, err_msg: *Module.ErrorMsg) CompileError {
1885fn failWithOwnedErrorMsg(sema: *Sema, err_msg: *Module.ErrorMsg) CompileError {
18851886 @setCold(true);
18861887
18871888 if (crash_report.is_enabled and sema.mod.comp.debug_compile_errors) {
......@@ -1894,7 +1895,7 @@ fn failWithOwnedErrorMsg(sema: *Sema, block: *Block, err_msg: *Module.ErrorMsg)
18941895 }
18951896
18961897 const mod = sema.mod;
1897 if (block.inlining) |some| some.err = err_msg;
1898 sema.err = err_msg;
18981899
18991900 {
19001901 errdefer err_msg.destroy(mod.gpa);
......@@ -2591,7 +2592,7 @@ fn zirEnumDecl(
25912592 try sema.errNote(block, other_tag_src, msg, "other field here", .{});
25922593 break :msg msg;
25932594 };
2594 return sema.failWithOwnedErrorMsg(block, msg);
2595 return sema.failWithOwnedErrorMsg(msg);
25952596 }
25962597
25972598 if (has_tag_value) {
......@@ -2886,7 +2887,7 @@ fn ensureResultUsed(
28862887 try sema.errNote(block, src, msg, "consider using `try`, `catch`, or `if`", .{});
28872888 break :msg msg;
28882889 };
2889 return sema.failWithOwnedErrorMsg(block, msg);
2890 return sema.failWithOwnedErrorMsg(msg);
28902891 },
28912892 else => {
28922893 const msg = msg: {
......@@ -2896,7 +2897,7 @@ fn ensureResultUsed(
28962897 try sema.errNote(block, src, msg, "this error can be suppressed by assigning the value to '_'", .{});
28972898 break :msg msg;
28982899 };
2899 return sema.failWithOwnedErrorMsg(block, msg);
2900 return sema.failWithOwnedErrorMsg(msg);
29002901 },
29012902 }
29022903}
......@@ -2917,7 +2918,7 @@ fn zirEnsureResultNonError(sema: *Sema, block: *Block, inst: Zir.Inst.Index) Com
29172918 try sema.errNote(block, src, msg, "consider using `try`, `catch`, or `if`", .{});
29182919 break :msg msg;
29192920 };
2920 return sema.failWithOwnedErrorMsg(block, msg);
2921 return sema.failWithOwnedErrorMsg(msg);
29212922 },
29222923 else => return,
29232924 }
......@@ -2957,7 +2958,7 @@ fn zirIndexablePtrLen(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileE
29572958 );
29582959 break :msg msg;
29592960 };
2960 return sema.failWithOwnedErrorMsg(block, msg);
2961 return sema.failWithOwnedErrorMsg(msg);
29612962 }
29622963
29632964 return sema.fieldVal(block, src, object, "len", src);
......@@ -3615,7 +3616,7 @@ fn validateUnionInit(
36153616 try sema.addDeclaredHereNote(msg, union_ty);
36163617 break :msg msg;
36173618 };
3618 return sema.failWithOwnedErrorMsg(block, msg);
3619 return sema.failWithOwnedErrorMsg(msg);
36193620 }
36203621
36213622 if ((is_comptime or block.is_comptime) and
......@@ -3747,7 +3748,7 @@ fn validateStructInit(
37473748 try sema.errNote(block, other_field_src, msg, "other field here", .{});
37483749 break :msg msg;
37493750 };
3750 return sema.failWithOwnedErrorMsg(block, msg);
3751 return sema.failWithOwnedErrorMsg(msg);
37513752 }
37523753 found_fields[field_index] = field_ptr;
37533754 }
......@@ -3808,7 +3809,7 @@ fn validateStructInit(
38083809 .{fqn},
38093810 );
38103811 }
3811 return sema.failWithOwnedErrorMsg(block, msg);
3812 return sema.failWithOwnedErrorMsg(msg);
38123813 }
38133814
38143815 return;
......@@ -3938,7 +3939,7 @@ fn validateStructInit(
39383939 .{fqn},
39393940 );
39403941 }
3941 return sema.failWithOwnedErrorMsg(block, msg);
3942 return sema.failWithOwnedErrorMsg(msg);
39423943 }
39433944
39443945 if (struct_is_comptime) {
......@@ -4000,7 +4001,7 @@ fn zirValidateArrayInit(
40004001 }
40014002
40024003 if (root_msg) |msg| {
4003 return sema.failWithOwnedErrorMsg(block, msg);
4004 return sema.failWithOwnedErrorMsg(msg);
40044005 }
40054006 }
40064007
......@@ -4180,7 +4181,7 @@ fn zirValidateDeref(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileErr
41804181 try sema.explainWhyTypeIsComptime(block, src, msg, src.toSrcLoc(src_decl), elem_ty);
41814182 break :msg msg;
41824183 };
4183 return sema.failWithOwnedErrorMsg(block, msg);
4184 return sema.failWithOwnedErrorMsg(msg);
41844185 }
41854186}
41864187
......@@ -4206,7 +4207,7 @@ fn failWithBadMemberAccess(
42064207 try sema.addDeclaredHereNote(msg, agg_ty);
42074208 break :msg msg;
42084209 };
4209 return sema.failWithOwnedErrorMsg(block, msg);
4210 return sema.failWithOwnedErrorMsg(msg);
42104211}
42114212
42124213fn failWithBadStructFieldAccess(
......@@ -4232,7 +4233,7 @@ fn failWithBadStructFieldAccess(
42324233 try sema.mod.errNoteNonLazy(struct_obj.srcLoc(sema.mod), msg, "struct declared here", .{});
42334234 break :msg msg;
42344235 };
4235 return sema.failWithOwnedErrorMsg(block, msg);
4236 return sema.failWithOwnedErrorMsg(msg);
42364237}
42374238
42384239fn failWithBadUnionFieldAccess(
......@@ -4258,7 +4259,7 @@ fn failWithBadUnionFieldAccess(
42584259 try sema.mod.errNoteNonLazy(union_obj.srcLoc(sema.mod), msg, "union declared here", .{});
42594260 break :msg msg;
42604261 };
4261 return sema.failWithOwnedErrorMsg(block, msg);
4262 return sema.failWithOwnedErrorMsg(msg);
42624263}
42634264
42644265fn addDeclaredHereNote(sema: *Sema, parent: *Module.ErrorMsg, decl_ty: Type) !void {
......@@ -4747,7 +4748,7 @@ fn zirCImport(sema: *Sema, parent_block: *Block, inst: Zir.Inst.Index) CompileEr
47474748 @import("clang.zig").Stage2ErrorMsg.delete(c_import_res.errors.ptr, c_import_res.errors.len);
47484749 break :msg msg;
47494750 };
4750 return sema.failWithOwnedErrorMsg(parent_block, msg);
4751 return sema.failWithOwnedErrorMsg(msg);
47514752 }
47524753 const c_import_pkg = Package.create(
47534754 sema.gpa,
......@@ -4921,7 +4922,7 @@ fn analyzeBlockBody(
49214922
49224923 break :msg msg;
49234924 };
4924 return sema.failWithOwnedErrorMsg(child_block, msg);
4925 return sema.failWithOwnedErrorMsg(msg);
49254926 }
49264927 const ty_inst = try sema.addType(resolved_ty);
49274928 try sema.air_extra.ensureUnusedCapacity(gpa, @typeInfo(Air.Block).Struct.fields.len +
......@@ -5060,7 +5061,7 @@ pub fn analyzeExport(
50605061 try sema.addDeclaredHereNote(msg, exported_decl.ty);
50615062 break :msg msg;
50625063 };
5063 return sema.failWithOwnedErrorMsg(block, msg);
5064 return sema.failWithOwnedErrorMsg(msg);
50645065 }
50655066
50665067 const gpa = mod.gpa;
......@@ -5150,7 +5151,7 @@ fn zirSetAlignStack(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.Inst
51505151 try sema.errNote(block, gop.value_ptr.src, msg, "other instance here", .{});
51515152 break :msg msg;
51525153 };
5153 return sema.failWithOwnedErrorMsg(block, msg);
5154 return sema.failWithOwnedErrorMsg(msg);
51545155 }
51555156 gop.value_ptr.* = .{ .alignment = alignment, .src = src };
51565157}
......@@ -5311,7 +5312,14 @@ fn zirDeclRef(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
53115312 const src = inst_data.src();
53125313 const decl_name = inst_data.get(sema.code);
53135314 const decl_index = try sema.lookupIdentifier(block, src, decl_name);
5314 return sema.analyzeDeclRef(decl_index);
5315 return sema.analyzeDeclRef(decl_index) catch |err| switch (err) {
5316 error.AnalysisFail => {
5317 const msg = sema.err orelse return err;
5318 try sema.errNote(block, src, msg, "referenced here", .{});
5319 return err;
5320 },
5321 else => return err,
5322 };
53155323}
53165324
53175325fn zirDeclVal(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -5413,7 +5421,7 @@ fn lookupInNamespace(
54135421 }
54145422 break :msg msg;
54155423 };
5416 return sema.failWithOwnedErrorMsg(block, msg);
5424 return sema.failWithOwnedErrorMsg(msg);
54175425 },
54185426 }
54195427 } else if (namespace.decls.getKeyAdapted(ident_name, Module.DeclAdapter{ .mod = mod })) |decl_index| {
......@@ -5872,9 +5880,8 @@ fn analyzeCall(
58725880 sema.analyzeBody(&child_block, fn_info.body) catch |err| switch (err) {
58735881 error.ComptimeReturn => break :result inlining.comptime_result,
58745882 error.AnalysisFail => {
5875 const err_msg = inlining.err orelse return err;
5883 const err_msg = sema.err orelse return err;
58765884 try sema.errNote(block, call_src, err_msg, "called from here", .{});
5877 if (block.inlining) |some| some.err = err_msg;
58785885 return err;
58795886 },
58805887 else => |e| return e,
......@@ -6802,7 +6809,7 @@ fn zirMergeErrorSets(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr
68026809 try sema.errNote(block, src, msg, "'||' merges error sets; 'or' performs boolean OR", .{});
68036810 break :msg msg;
68046811 };
6805 return sema.failWithOwnedErrorMsg(block, msg);
6812 return sema.failWithOwnedErrorMsg(msg);
68066813 }
68076814 const lhs_ty = try sema.analyzeAsType(block, lhs_src, lhs);
68086815 const rhs_ty = try sema.analyzeAsType(block, rhs_src, rhs);
......@@ -6927,7 +6934,7 @@ fn zirIntToEnum(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!A
69276934 try sema.addDeclaredHereNote(msg, dest_ty);
69286935 break :msg msg;
69296936 };
6930 return sema.failWithOwnedErrorMsg(block, msg);
6937 return sema.failWithOwnedErrorMsg(msg);
69316938 }
69326939 return sema.addConstant(dest_ty, int_val);
69336940 }
......@@ -7632,7 +7639,7 @@ fn funcCommon(
76327639 try sema.addDeclaredHereNote(msg, bare_return_type);
76337640 break :msg msg;
76347641 };
7635 return sema.failWithOwnedErrorMsg(block, msg);
7642 return sema.failWithOwnedErrorMsg(msg);
76367643 }
76377644 if (!Type.fnCallingConventionAllowsZigTypes(cc_workaround) and !sema.validateExternType(return_type, .ret_ty)) {
76387645 const msg = msg: {
......@@ -7647,7 +7654,7 @@ fn funcCommon(
76477654 try sema.addDeclaredHereNote(msg, return_type);
76487655 break :msg msg;
76497656 };
7650 return sema.failWithOwnedErrorMsg(block, msg);
7657 return sema.failWithOwnedErrorMsg(msg);
76517658 }
76527659
76537660 const arch = sema.mod.getTarget().cpu.arch;
......@@ -7812,7 +7819,7 @@ fn analyzeParameter(
78127819 try sema.errNote(block, param_src, msg, "function is generic because of this parameter", .{});
78137820 break :msg msg;
78147821 };
7815 return sema.failWithOwnedErrorMsg(block, msg);
7822 return sema.failWithOwnedErrorMsg(msg);
78167823 }
78177824 if (this_generic and !Type.fnCallingConventionAllowsZigTypes(cc)) {
78187825 return sema.fail(block, param_src, "generic parameters not allowed in function with calling convention '{s}'", .{@tagName(cc)});
......@@ -7828,7 +7835,7 @@ fn analyzeParameter(
78287835 try sema.addDeclaredHereNote(msg, param.ty);
78297836 break :msg msg;
78307837 };
7831 return sema.failWithOwnedErrorMsg(block, msg);
7838 return sema.failWithOwnedErrorMsg(msg);
78327839 }
78337840 if (!Type.fnCallingConventionAllowsZigTypes(cc) and !sema.validateExternType(param.ty, .param_ty)) {
78347841 const msg = msg: {
......@@ -7843,7 +7850,7 @@ fn analyzeParameter(
78437850 try sema.addDeclaredHereNote(msg, param.ty);
78447851 break :msg msg;
78457852 };
7846 return sema.failWithOwnedErrorMsg(block, msg);
7853 return sema.failWithOwnedErrorMsg(msg);
78477854 }
78487855 if (requires_comptime and !param.is_comptime) {
78497856 const msg = msg: {
......@@ -7855,7 +7862,7 @@ fn analyzeParameter(
78557862 try sema.addDeclaredHereNote(msg, param.ty);
78567863 break :msg msg;
78577864 };
7858 return sema.failWithOwnedErrorMsg(block, msg);
7865 return sema.failWithOwnedErrorMsg(msg);
78597866 }
78607867}
78617868
......@@ -8318,7 +8325,7 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
83188325
83198326 break :msg msg;
83208327 };
8321 return sema.failWithOwnedErrorMsg(block, msg);
8328 return sema.failWithOwnedErrorMsg(msg);
83228329 },
83238330
83248331 .Pointer => {
......@@ -8333,7 +8340,7 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
83338340
83348341 break :msg msg;
83358342 };
8336 return sema.failWithOwnedErrorMsg(block, msg);
8343 return sema.failWithOwnedErrorMsg(msg);
83378344 },
83388345 .Struct, .Union => if (dest_ty.containerLayout() == .Auto) {
83398346 const container = switch (dest_ty.zigTypeTag()) {
......@@ -8383,7 +8390,7 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
83838390
83848391 break :msg msg;
83858392 };
8386 return sema.failWithOwnedErrorMsg(block, msg);
8393 return sema.failWithOwnedErrorMsg(msg);
83878394 },
83888395 .Pointer => {
83898396 const msg = msg: {
......@@ -8397,7 +8404,7 @@ fn zirBitcast(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
83978404
83988405 break :msg msg;
83998406 };
8400 return sema.failWithOwnedErrorMsg(block, msg);
8407 return sema.failWithOwnedErrorMsg(msg);
84018408 },
84028409 .Struct, .Union => if (operand_ty.containerLayout() == .Auto) {
84038410 const container = switch (operand_ty.zigTypeTag()) {
......@@ -8663,7 +8670,7 @@ fn zirSwitchCapture(
86638670 try sema.errNote(block, item_src, msg, "type '{}' here", .{field.ty.fmt(sema.mod)});
86648671 break :msg msg;
86658672 };
8666 return sema.failWithOwnedErrorMsg(block, msg);
8673 return sema.failWithOwnedErrorMsg(msg);
86678674 }
86688675 }
86698676
......@@ -8786,7 +8793,7 @@ fn zirSwitchCond(
87868793 }
87878794 break :msg msg;
87888795 };
8789 return sema.failWithOwnedErrorMsg(block, msg);
8796 return sema.failWithOwnedErrorMsg(msg);
87908797 };
87918798 return sema.unionToTag(block, enum_ty, operand, src);
87928799 },
......@@ -8875,7 +8882,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
88758882 );
88768883 break :msg msg;
88778884 };
8878 return sema.failWithOwnedErrorMsg(block, msg);
8885 return sema.failWithOwnedErrorMsg(msg);
88798886 }
88808887
88818888 const target = sema.mod.getTarget();
......@@ -8979,7 +8986,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
89798986 );
89808987 break :msg msg;
89818988 };
8982 return sema.failWithOwnedErrorMsg(block, msg);
8989 return sema.failWithOwnedErrorMsg(msg);
89838990 } else if (special_prong == .none and operand_ty.isNonexhaustiveEnum() and !union_originally) {
89848991 return sema.fail(
89858992 block,
......@@ -9079,7 +9086,7 @@ fn zirSwitchBlock(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError
90799086 if (maybe_msg) |msg| {
90809087 maybe_msg = null;
90819088 try sema.addDeclaredHereNote(msg, operand_ty);
9082 return sema.failWithOwnedErrorMsg(block, msg);
9089 return sema.failWithOwnedErrorMsg(msg);
90839090 }
90849091
90859092 if (special_prong == .@"else" and seen_errors.count() == operand_ty.errorSetNames().len) {
......@@ -9888,7 +9895,7 @@ fn validateSwitchDupe(
98889895 );
98899896 break :msg msg;
98909897 };
9891 return sema.failWithOwnedErrorMsg(block, msg);
9898 return sema.failWithOwnedErrorMsg(msg);
98929899}
98939900
98949901fn validateSwitchItemBool(
......@@ -9958,7 +9965,7 @@ fn validateSwitchNoRange(
99589965 );
99599966 break :msg msg;
99609967 };
9961 return sema.failWithOwnedErrorMsg(block, msg);
9968 return sema.failWithOwnedErrorMsg(msg);
99629969}
99639970
99649971fn zirHasField(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.Inst.Ref {
......@@ -12882,7 +12889,7 @@ fn analyzeCmpUnionTag(
1288212889 try sema.mod.errNoteNonLazy(union_ty.declSrcLoc(sema.mod), msg, "union '{}' is not a tagged union", .{union_ty.fmt(sema.mod)});
1288312890 break :msg msg;
1288412891 };
12885 return sema.failWithOwnedErrorMsg(block, msg);
12892 return sema.failWithOwnedErrorMsg(msg);
1288612893 };
1288712894 // Coerce both the union and the tag to the union's tag type, and then execute the
1288812895 // enum comparison codepath.
......@@ -13143,6 +13150,36 @@ fn zirClosureGet(
1314313150 scope = scope.parent.?;
1314413151 } else unreachable;
1314513152
13153 if (tv.val.tag() == .generic_poison and !block.is_typeof and !block.is_comptime and sema.func != null) {
13154 const msg = msg: {
13155 const name = name: {
13156 const file = sema.owner_decl.getFileScope();
13157 const tree = file.getTree(sema.mod.gpa) catch |err| {
13158 // In this case we emit a warning + a less precise source location.
13159 log.warn("unable to load {s}: {s}", .{
13160 file.sub_file_path, @errorName(err),
13161 });
13162 break :name null;
13163 };
13164 const node = sema.owner_decl.relativeToNodeIndex(inst_data.src_node);
13165 const token = tree.nodes.items(.main_token)[node];
13166 break :name tree.tokenSlice(token);
13167 };
13168
13169 const msg = if (name) |some|
13170 try sema.errMsg(block, inst_data.src(), "'{s}' not accessible from inner function", .{some})
13171 else
13172 try sema.errMsg(block, inst_data.src(), "variable not accessible from inner function", .{});
13173 errdefer msg.destroy(sema.gpa);
13174
13175 try sema.errNote(block, LazySrcLoc.nodeOffset(0), msg, "crossed function definition here", .{});
13176
13177 // TODO add "declared here" note
13178 break :msg msg;
13179 };
13180 return sema.failWithOwnedErrorMsg(msg);
13181 }
13182
1314613183 return sema.addConstant(tv.ty, tv.val);
1314713184}
1314813185
......@@ -14877,7 +14914,7 @@ fn zirPtrType(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
1487714914 try sema.addDeclaredHereNote(msg, elem_ty);
1487814915 break :msg msg;
1487914916 };
14880 return sema.failWithOwnedErrorMsg(block, msg);
14917 return sema.failWithOwnedErrorMsg(msg);
1488114918 }
1488214919 if (elem_ty.zigTypeTag() == .Opaque) {
1488314920 return sema.fail(block, elem_ty_src, "C pointers cannot point to opaque types", .{});
......@@ -15048,7 +15085,7 @@ fn zirStructInit(
1504815085 try sema.errNote(block, other_field_src, msg, "other field here", .{});
1504915086 break :msg msg;
1505015087 };
15051 return sema.failWithOwnedErrorMsg(block, msg);
15088 return sema.failWithOwnedErrorMsg(msg);
1505215089 }
1505315090 found_fields[field_index] = item.data.field_type;
1505415091 field_inits[field_index] = try sema.resolveInst(item.data.init);
......@@ -15189,7 +15226,7 @@ fn finishStructInit(
1518915226 .{fqn},
1519015227 );
1519115228 }
15192 return sema.failWithOwnedErrorMsg(block, msg);
15229 return sema.failWithOwnedErrorMsg(msg);
1519315230 }
1519415231
1519515232 const is_comptime = for (field_inits) |field_init| {
......@@ -15264,7 +15301,7 @@ fn zirStructInitAnon(
1526415301 try sema.errNote(block, prev_source, msg, "other field here", .{});
1526515302 break :msg msg;
1526615303 };
15267 return sema.failWithOwnedErrorMsg(block, msg);
15304 return sema.failWithOwnedErrorMsg(msg);
1526815305 }
1526915306 gop.value_ptr.* = @intCast(u32, i);
1527015307
......@@ -15280,7 +15317,7 @@ fn zirStructInitAnon(
1528015317 try sema.addDeclaredHereNote(msg, types[i]);
1528115318 break :msg msg;
1528215319 };
15283 return sema.failWithOwnedErrorMsg(block, msg);
15320 return sema.failWithOwnedErrorMsg(msg);
1528415321 }
1528515322 const init_src = src; // TODO better source location
1528615323 if (try sema.resolveMaybeUndefVal(block, init_src, init)) |init_val| {
......@@ -15478,7 +15515,7 @@ fn zirArrayInitAnon(
1547815515 try sema.addDeclaredHereNote(msg, types[i]);
1547915516 break :msg msg;
1548015517 };
15481 return sema.failWithOwnedErrorMsg(block, msg);
15518 return sema.failWithOwnedErrorMsg(msg);
1548215519 }
1548315520 if (try sema.resolveMaybeUndefVal(block, operand_src, elem)) |val| {
1548415521 values[i] = val;
......@@ -15792,7 +15829,7 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
1579215829 try sema.addDeclaredHereNote(msg, operand_ty);
1579315830 break :msg msg;
1579415831 };
15795 return sema.failWithOwnedErrorMsg(block, msg);
15832 return sema.failWithOwnedErrorMsg(msg);
1579615833 },
1579715834 else => return sema.fail(block, operand_src, "expected enum or union; found '{}'", .{
1579815835 operand_ty.fmt(mod),
......@@ -15811,7 +15848,7 @@ fn zirTagName(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air
1581115848 try mod.errNoteNonLazy(enum_decl.srcLoc(), msg, "declared here", .{});
1581215849 break :msg msg;
1581315850 };
15814 return sema.failWithOwnedErrorMsg(block, msg);
15851 return sema.failWithOwnedErrorMsg(msg);
1581515852 };
1581615853 const field_name = enum_ty.enumFieldName(field_index);
1581715854 return sema.addStrLit(block, field_name);
......@@ -15961,7 +15998,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1596115998 try sema.addDeclaredHereNote(msg, elem_ty);
1596215999 break :msg msg;
1596316000 };
15964 return sema.failWithOwnedErrorMsg(block, msg);
16001 return sema.failWithOwnedErrorMsg(msg);
1596516002 }
1596616003 if (elem_ty.zigTypeTag() == .Opaque) {
1596716004 return sema.fail(block, src, "C pointers cannot point to opaque types", .{});
......@@ -16364,7 +16401,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1636416401 try sema.addDeclaredHereNote(msg, union_obj.tag_ty);
1636516402 break :msg msg;
1636616403 };
16367 return sema.failWithOwnedErrorMsg(block, msg);
16404 return sema.failWithOwnedErrorMsg(msg);
1636816405 }
1636916406 }
1637016407
......@@ -16398,7 +16435,7 @@ fn zirReify(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Air.I
1639816435 try sema.addDeclaredHereNote(msg, union_obj.tag_ty);
1639916436 break :msg msg;
1640016437 };
16401 return sema.failWithOwnedErrorMsg(block, msg);
16438 return sema.failWithOwnedErrorMsg(msg);
1640216439 }
1640316440 }
1640416441
......@@ -16868,7 +16905,7 @@ fn zirErrSetCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstDat
1686816905 try sema.addDeclaredHereNote(msg, dest_ty);
1686916906 break :msg msg;
1687016907 };
16871 return sema.failWithOwnedErrorMsg(block, msg);
16908 return sema.failWithOwnedErrorMsg(msg);
1687216909 }
1687316910
1687416911 if (maybe_operand_val) |val| {
......@@ -16886,7 +16923,7 @@ fn zirErrSetCast(sema: *Sema, block: *Block, extended: Zir.Inst.Extended.InstDat
1688616923 try sema.addDeclaredHereNote(msg, dest_ty);
1688716924 break :msg msg;
1688816925 };
16889 return sema.failWithOwnedErrorMsg(block, msg);
16926 return sema.failWithOwnedErrorMsg(msg);
1689016927 }
1689116928 }
1689216929
......@@ -17024,7 +17061,7 @@ fn zirTruncate(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai
1702417061 });
1702517062 break :msg msg;
1702617063 };
17027 return sema.failWithOwnedErrorMsg(block, msg);
17064 return sema.failWithOwnedErrorMsg(msg);
1702817065 }
1702917066 }
1703017067
......@@ -17315,7 +17352,7 @@ fn bitOffsetOf(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!u6
1731517352 try sema.addDeclaredHereNote(msg, ty);
1731617353 break :msg msg;
1731717354 };
17318 return sema.failWithOwnedErrorMsg(block, msg);
17355 return sema.failWithOwnedErrorMsg(msg);
1731917356 },
1732017357 }
1732117358
......@@ -17419,7 +17456,7 @@ fn checkPtrOperand(
1741917456
1742017457 break :msg msg;
1742117458 };
17422 return sema.failWithOwnedErrorMsg(block, msg);
17459 return sema.failWithOwnedErrorMsg(msg);
1742317460 },
1742417461 .Optional => if (ty.isPtrLikeOptional()) return,
1742517462 else => {},
......@@ -17449,7 +17486,7 @@ fn checkPtrType(
1744917486
1745017487 break :msg msg;
1745117488 };
17452 return sema.failWithOwnedErrorMsg(block, msg);
17489 return sema.failWithOwnedErrorMsg(msg);
1745317490 },
1745417491 .Optional => if (ty.isPtrLikeOptional()) return,
1745517492 else => {},
......@@ -17585,7 +17622,7 @@ fn checkComptimeVarStore(
1758517622 try sema.errNote(block, cond_src, msg, "runtime condition here", .{});
1758617623 break :msg msg;
1758717624 };
17588 return sema.failWithOwnedErrorMsg(block, msg);
17625 return sema.failWithOwnedErrorMsg(msg);
1758917626 }
1759017627 if (block.runtime_loop) |loop_src| {
1759117628 const msg = msg: {
......@@ -17594,7 +17631,7 @@ fn checkComptimeVarStore(
1759417631 try sema.errNote(block, loop_src, msg, "non-inline loop here", .{});
1759517632 break :msg msg;
1759617633 };
17597 return sema.failWithOwnedErrorMsg(block, msg);
17634 return sema.failWithOwnedErrorMsg(msg);
1759817635 }
1759917636 unreachable;
1760017637 }
......@@ -17731,7 +17768,7 @@ fn checkVectorizableBinaryOperands(
1773117768 try sema.errNote(block, rhs_src, msg, "length {d} here", .{rhs_len});
1773217769 break :msg msg;
1773317770 };
17734 return sema.failWithOwnedErrorMsg(block, msg);
17771 return sema.failWithOwnedErrorMsg(msg);
1773517772 }
1773617773 } else {
1773717774 const msg = msg: {
......@@ -17748,7 +17785,7 @@ fn checkVectorizableBinaryOperands(
1774817785 }
1774917786 break :msg msg;
1775017787 };
17751 return sema.failWithOwnedErrorMsg(block, msg);
17788 return sema.failWithOwnedErrorMsg(msg);
1775217789 }
1775317790}
1775417791
......@@ -18148,7 +18185,7 @@ fn analyzeShuffle(
1814818185
1814918186 break :msg msg;
1815018187 };
18151 return sema.failWithOwnedErrorMsg(block, msg);
18188 return sema.failWithOwnedErrorMsg(msg);
1815218189 }
1815318190 }
1815418191
......@@ -18744,7 +18781,7 @@ fn zirFieldParentPtr(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileEr
1874418781 try sema.addDeclaredHereNote(msg, struct_ty);
1874518782 break :msg msg;
1874618783 };
18747 return sema.failWithOwnedErrorMsg(block, msg);
18784 return sema.failWithOwnedErrorMsg(msg);
1874818785 }
1874918786 return sema.addConstant(result_ptr, payload.data.container_ptr);
1875018787 }
......@@ -19544,7 +19581,7 @@ fn requireRuntimeBlock(sema: *Sema, block: *Block, src: LazySrcLoc, runtime_src:
1954419581 }
1954519582 break :msg msg;
1954619583 };
19547 return sema.failWithOwnedErrorMsg(block, msg);
19584 return sema.failWithOwnedErrorMsg(msg);
1954819585 }
1954919586 try sema.requireFunctionBlock(block, src);
1955019587}
......@@ -19573,7 +19610,7 @@ fn validateVarType(
1957319610
1957419611 break :msg msg;
1957519612 };
19576 return sema.failWithOwnedErrorMsg(block, msg);
19613 return sema.failWithOwnedErrorMsg(msg);
1957719614}
1957819615
1957919616fn validateRunTimeType(
......@@ -20275,7 +20312,7 @@ fn emitBackwardBranch(sema: *Sema, block: *Block, src: LazySrcLoc) !void {
2027520312 "use @setEvalBranchQuota() to raise the branch limit from {d}",
2027620313 .{sema.branch_quota},
2027720314 );
20278 return sema.failWithOwnedErrorMsg(block, msg);
20315 return sema.failWithOwnedErrorMsg(msg);
2027920316 }
2028020317}
2028120318
......@@ -20383,7 +20420,7 @@ fn fieldVal(
2038320420 try sema.addDeclaredHereNote(msg, child_type);
2038420421 break :msg msg;
2038520422 };
20386 return sema.failWithOwnedErrorMsg(block, msg);
20423 return sema.failWithOwnedErrorMsg(msg);
2038720424 } else (try sema.mod.getErrorValue(field_name)).key;
2038820425
2038920426 return sema.addConstant(
......@@ -20438,7 +20475,7 @@ fn fieldVal(
2043820475 if (child_type.zigTypeTag() == .Array) try sema.errNote(block, src, msg, "array values have 'len' member", .{});
2043920476 break :msg msg;
2044020477 };
20441 return sema.failWithOwnedErrorMsg(block, msg);
20478 return sema.failWithOwnedErrorMsg(msg);
2044220479 },
2044320480 }
2044420481 },
......@@ -20776,7 +20813,7 @@ fn fieldCallBind(
2077620813 try sema.addDeclaredHereNote(msg, concrete_ty);
2077720814 break :msg msg;
2077820815 };
20779 return sema.failWithOwnedErrorMsg(block, msg);
20816 return sema.failWithOwnedErrorMsg(msg);
2078020817}
2078120818
2078220819fn finishFieldCallBind(
......@@ -20831,7 +20868,7 @@ fn namespaceLookup(
2083120868 try sema.mod.errNoteNonLazy(decl.srcLoc(), msg, "declared here", .{});
2083220869 break :msg msg;
2083320870 };
20834 return sema.failWithOwnedErrorMsg(block, msg);
20871 return sema.failWithOwnedErrorMsg(msg);
2083520872 }
2083620873 return decl_index;
2083720874 }
......@@ -20846,7 +20883,14 @@ fn namespaceLookupRef(
2084620883 decl_name: []const u8,
2084720884) CompileError!?Air.Inst.Ref {
2084820885 const decl = (try sema.namespaceLookup(block, src, namespace, decl_name)) orelse return null;
20849 return try sema.analyzeDeclRef(decl);
20886 return sema.analyzeDeclRef(decl) catch |err| switch (err) {
20887 error.AnalysisFail => {
20888 const msg = sema.err orelse return err;
20889 try sema.errNote(block, src, msg, "referenced here", .{});
20890 return err;
20891 },
20892 else => return err,
20893 };
2085020894}
2085120895
2085220896fn namespaceLookupVal(
......@@ -21164,7 +21208,7 @@ fn unionFieldPtr(
2116421208 try sema.addDeclaredHereNote(msg, union_ty);
2116521209 break :msg msg;
2116621210 };
21167 return sema.failWithOwnedErrorMsg(block, msg);
21211 return sema.failWithOwnedErrorMsg(msg);
2116821212 }
2116921213 },
2117021214 .Packed, .Extern => {},
......@@ -21234,7 +21278,7 @@ fn unionFieldVal(
2123421278 try sema.addDeclaredHereNote(msg, union_ty);
2123521279 break :msg msg;
2123621280 };
21237 return sema.failWithOwnedErrorMsg(block, msg);
21281 return sema.failWithOwnedErrorMsg(msg);
2123821282 }
2123921283 },
2124021284 .Packed, .Extern => {
......@@ -21408,7 +21452,7 @@ fn validateRuntimeElemAccess(
2140821452
2140921453 break :msg msg;
2141021454 };
21411 return sema.failWithOwnedErrorMsg(block, msg);
21455 return sema.failWithOwnedErrorMsg(msg);
2141221456 }
2141321457}
2141421458
......@@ -22184,7 +22228,7 @@ fn coerceExtra(
2218422228 try sema.addDeclaredHereNote(msg, dest_ty);
2218522229 break :msg msg;
2218622230 };
22187 return sema.failWithOwnedErrorMsg(block, msg);
22231 return sema.failWithOwnedErrorMsg(msg);
2218822232 };
2218922233 return sema.addConstant(
2219022234 dest_ty,
......@@ -22312,7 +22356,7 @@ fn coerceExtra(
2231222356 try sema.mod.errNoteNonLazy(ret_ty_src.toSrcLoc(src_decl), msg, "'noreturn' declared here", .{});
2231322357 break :msg msg;
2231422358 };
22315 return sema.failWithOwnedErrorMsg(block, msg);
22359 return sema.failWithOwnedErrorMsg(msg);
2231622360 }
2231722361
2231822362 const msg = msg: {
......@@ -22353,7 +22397,7 @@ fn coerceExtra(
2235322397
2235422398 break :msg msg;
2235522399 };
22356 return sema.failWithOwnedErrorMsg(block, msg);
22400 return sema.failWithOwnedErrorMsg(msg);
2235722401}
2235822402
2235922403const InMemoryCoercionResult = union(enum) {
......@@ -24418,7 +24462,7 @@ fn coerceEnumToUnion(
2441824462 try sema.addDeclaredHereNote(msg, union_ty);
2441924463 break :msg msg;
2442024464 };
24421 return sema.failWithOwnedErrorMsg(block, msg);
24465 return sema.failWithOwnedErrorMsg(msg);
2442224466 };
2442324467
2442424468 const enum_tag = try sema.coerce(block, tag_ty, inst, inst_src);
......@@ -24433,7 +24477,7 @@ fn coerceEnumToUnion(
2443324477 try sema.addDeclaredHereNote(msg, union_ty);
2443424478 break :msg msg;
2443524479 };
24436 return sema.failWithOwnedErrorMsg(block, msg);
24480 return sema.failWithOwnedErrorMsg(msg);
2443724481 };
2443824482 const field = union_obj.fields.values()[field_index];
2443924483 const field_ty = try sema.resolveTypeFields(block, inst_src, field.ty);
......@@ -24449,7 +24493,7 @@ fn coerceEnumToUnion(
2444924493 try sema.addDeclaredHereNote(msg, union_ty);
2445024494 break :msg msg;
2445124495 };
24452 return sema.failWithOwnedErrorMsg(block, msg);
24496 return sema.failWithOwnedErrorMsg(msg);
2445324497 };
2445424498
2445524499 return sema.addConstant(union_ty, try Value.Tag.@"union".create(sema.arena, .{
......@@ -24469,7 +24513,7 @@ fn coerceEnumToUnion(
2446924513 try sema.addDeclaredHereNote(msg, tag_ty);
2447024514 break :msg msg;
2447124515 };
24472 return sema.failWithOwnedErrorMsg(block, msg);
24516 return sema.failWithOwnedErrorMsg(msg);
2447324517 }
2447424518
2447524519 // If the union has all fields 0 bits, the union value is just the enum value.
......@@ -24498,7 +24542,7 @@ fn coerceEnumToUnion(
2449824542 try sema.addDeclaredHereNote(msg, union_ty);
2449924543 break :msg msg;
2450024544 };
24501 return sema.failWithOwnedErrorMsg(block, msg);
24545 return sema.failWithOwnedErrorMsg(msg);
2450224546}
2450324547
2450424548fn coerceAnonStructToUnion(
......@@ -24527,7 +24571,7 @@ fn coerceAnonStructToUnion(
2452724571 try sema.addDeclaredHereNote(msg, union_ty);
2452824572 break :msg msg;
2452924573 };
24530 return sema.failWithOwnedErrorMsg(block, msg);
24574 return sema.failWithOwnedErrorMsg(msg);
2453124575 }
2453224576
2453324577 const field_name = anon_struct.names[0];
......@@ -24587,7 +24631,7 @@ fn coerceArrayLike(
2458724631 try sema.errNote(block, inst_src, msg, "source has length {d}", .{inst_len});
2458824632 break :msg msg;
2458924633 };
24590 return sema.failWithOwnedErrorMsg(block, msg);
24634 return sema.failWithOwnedErrorMsg(msg);
2459124635 }
2459224636
2459324637 const dest_elem_ty = dest_ty.childType();
......@@ -24659,7 +24703,7 @@ fn coerceTupleToArray(
2465924703 try sema.errNote(block, inst_src, msg, "source has length {d}", .{inst_len});
2466024704 break :msg msg;
2466124705 };
24662 return sema.failWithOwnedErrorMsg(block, msg);
24706 return sema.failWithOwnedErrorMsg(msg);
2466324707 }
2466424708
2466524709 const dest_elems = try sema.usizeCast(block, dest_ty_src, dest_ty.arrayLenIncludingSentinel());
......@@ -24822,7 +24866,7 @@ fn coerceTupleToStruct(
2482224866
2482324867 if (root_msg) |msg| {
2482424868 try sema.addDeclaredHereNote(msg, struct_ty);
24825 return sema.failWithOwnedErrorMsg(block, msg);
24869 return sema.failWithOwnedErrorMsg(msg);
2482624870 }
2482724871
2482824872 if (runtime_src) |rs| {
......@@ -24926,7 +24970,7 @@ fn coerceTupleToTuple(
2492624970
2492724971 if (root_msg) |msg| {
2492824972 try sema.addDeclaredHereNote(msg, tuple_ty);
24929 return sema.failWithOwnedErrorMsg(block, msg);
24973 return sema.failWithOwnedErrorMsg(msg);
2493024974 }
2493124975
2493224976 if (runtime_src) |rs| {
......@@ -24949,7 +24993,14 @@ fn analyzeDeclVal(
2494924993 if (sema.decl_val_table.get(decl_index)) |result| {
2495024994 return result;
2495124995 }
24952 const decl_ref = try sema.analyzeDeclRef(decl_index);
24996 const decl_ref = sema.analyzeDeclRef(decl_index) catch |err| switch (err) {
24997 error.AnalysisFail => {
24998 const msg = sema.err orelse return err;
24999 try sema.errNote(block, src, msg, "referenced here", .{});
25000 return err;
25001 },
25002 else => return err,
25003 };
2495325004 const result = try sema.analyzeLoad(block, src, decl_ref, src);
2495425005 if (Air.refToIndex(result)) |index| {
2495525006 if (sema.air_instructions.items(.tag)[index] == .constant and !block.is_typeof) {
......@@ -24960,6 +25011,12 @@ fn analyzeDeclVal(
2496025011}
2496125012
2496225013fn ensureDeclAnalyzed(sema: *Sema, decl_index: Decl.Index) CompileError!void {
25014 const decl = sema.mod.declPtr(decl_index);
25015 if (decl.analysis == .in_progress) {
25016 const msg = try Module.ErrorMsg.create(sema.gpa, decl.srcLoc(), "dependency loop detected", .{});
25017 return sema.failWithOwnedErrorMsg(msg);
25018 }
25019
2496325020 sema.mod.ensureDeclAnalyzed(decl_index) catch |err| {
2496425021 if (sema.owner_func) |owner_func| {
2496525022 owner_func.state = .dependency_failure;
......@@ -25491,7 +25548,7 @@ fn analyzeSlice(
2549125548
2549225549 break :msg msg;
2549325550 };
25494 return sema.failWithOwnedErrorMsg(block, msg);
25551 return sema.failWithOwnedErrorMsg(msg);
2549525552 }
2549625553 }
2549725554 }
......@@ -26440,7 +26497,7 @@ fn resolvePeerTypes(
2644026497
2644126498 break :msg msg;
2644226499 };
26443 return sema.failWithOwnedErrorMsg(block, msg);
26500 return sema.failWithOwnedErrorMsg(msg);
2644426501 }
2644526502
2644626503 const chosen_ty = sema.typeOf(chosen);
......@@ -26599,21 +26656,41 @@ fn resolveStructLayout(
2659926656 switch (struct_obj.status) {
2660026657 .none, .have_field_types => {},
2660126658 .field_types_wip, .layout_wip => {
26602 return sema.fail(block, src, "struct '{}' depends on itself", .{ty.fmt(sema.mod)});
26659 const msg = try Module.ErrorMsg.create(
26660 sema.gpa,
26661 struct_obj.srcLoc(sema.mod),
26662 "struct '{}' depends on itself",
26663 .{ty.fmt(sema.mod)},
26664 );
26665 return sema.failWithOwnedErrorMsg(msg);
2660326666 },
2660426667 .have_layout, .fully_resolved_wip, .fully_resolved => return,
2660526668 }
2660626669 struct_obj.status = .layout_wip;
26607 for (struct_obj.fields.values()) |field| {
26608 try sema.resolveTypeLayout(block, src, field.ty);
26670 for (struct_obj.fields.values()) |field, i| {
26671 sema.resolveTypeLayout(block, src, field.ty) catch |err| switch (err) {
26672 error.AnalysisFail => {
26673 const msg = sema.err orelse return err;
26674 try sema.addFieldErrNote(block, ty, i, msg, "while checking this field", .{});
26675 return err;
26676 },
26677 else => return err,
26678 };
2660926679 }
2661026680 struct_obj.status = .have_layout;
2661126681
2661226682 // In case of querying the ABI alignment of this struct, we will ask
2661326683 // for hasRuntimeBits() of each field, so we need "requires comptime"
2661426684 // to be known already before this function returns.
26615 for (struct_obj.fields.values()) |field| {
26616 _ = try sema.typeRequiresComptime(block, src, field.ty);
26685 for (struct_obj.fields.values()) |field, i| {
26686 _ = sema.typeRequiresComptime(block, src, field.ty) catch |err| switch (err) {
26687 error.AnalysisFail => {
26688 const msg = sema.err orelse return err;
26689 try sema.addFieldErrNote(block, ty, i, msg, "while checking this field", .{});
26690 return err;
26691 },
26692 else => return err,
26693 };
2661726694 }
2661826695 }
2661926696 // otherwise it's a tuple; no need to resolve anything
......@@ -26630,13 +26707,26 @@ fn resolveUnionLayout(
2663026707 switch (union_obj.status) {
2663126708 .none, .have_field_types => {},
2663226709 .field_types_wip, .layout_wip => {
26633 return sema.fail(block, src, "union '{}' depends on itself", .{ty.fmt(sema.mod)});
26710 const msg = try Module.ErrorMsg.create(
26711 sema.gpa,
26712 union_obj.srcLoc(sema.mod),
26713 "union '{}' depends on itself",
26714 .{ty.fmt(sema.mod)},
26715 );
26716 return sema.failWithOwnedErrorMsg(msg);
2663426717 },
2663526718 .have_layout, .fully_resolved_wip, .fully_resolved => return,
2663626719 }
2663726720 union_obj.status = .layout_wip;
26638 for (union_obj.fields.values()) |field| {
26639 try sema.resolveTypeLayout(block, src, field.ty);
26721 for (union_obj.fields.values()) |field, i| {
26722 sema.resolveTypeLayout(block, src, field.ty) catch |err| switch (err) {
26723 error.AnalysisFail => {
26724 const msg = sema.err orelse return err;
26725 try sema.addFieldErrNote(block, ty, i, msg, "while checking this field", .{});
26726 return err;
26727 },
26728 else => return err,
26729 };
2664026730 }
2664126731 union_obj.status = .have_layout;
2664226732}
......@@ -26764,12 +26854,12 @@ pub fn resolveTypeFields(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type)
2676426854 switch (ty.tag()) {
2676526855 .@"struct" => {
2676626856 const struct_obj = ty.castTag(.@"struct").?.data;
26767 try sema.resolveTypeFieldsStruct(block, src, ty, struct_obj);
26857 try sema.resolveTypeFieldsStruct(ty, struct_obj);
2676826858 return ty;
2676926859 },
2677026860 .@"union", .union_safety_tagged, .union_tagged => {
2677126861 const union_obj = ty.cast(Type.Payload.Union).?.data;
26772 try sema.resolveTypeFieldsUnion(block, src, ty, union_obj);
26862 try sema.resolveTypeFieldsUnion(ty, union_obj);
2677326863 return ty;
2677426864 },
2677526865 .type_info => return sema.resolveBuiltinTypeFields(block, src, "Type"),
......@@ -26790,15 +26880,19 @@ pub fn resolveTypeFields(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type)
2679026880
2679126881fn resolveTypeFieldsStruct(
2679226882 sema: *Sema,
26793 block: *Block,
26794 src: LazySrcLoc,
2679526883 ty: Type,
2679626884 struct_obj: *Module.Struct,
2679726885) CompileError!void {
2679826886 switch (struct_obj.status) {
2679926887 .none => {},
2680026888 .field_types_wip => {
26801 return sema.fail(block, src, "struct '{}' depends on itself", .{ty.fmt(sema.mod)});
26889 const msg = try Module.ErrorMsg.create(
26890 sema.gpa,
26891 struct_obj.srcLoc(sema.mod),
26892 "struct '{}' depends on itself",
26893 .{ty.fmt(sema.mod)},
26894 );
26895 return sema.failWithOwnedErrorMsg(msg);
2680226896 },
2680326897 .have_field_types,
2680426898 .have_layout,
......@@ -26812,17 +26906,17 @@ fn resolveTypeFieldsStruct(
2681226906 try semaStructFields(sema.mod, struct_obj);
2681326907}
2681426908
26815fn resolveTypeFieldsUnion(
26816 sema: *Sema,
26817 block: *Block,
26818 src: LazySrcLoc,
26819 ty: Type,
26820 union_obj: *Module.Union,
26821) CompileError!void {
26909fn resolveTypeFieldsUnion(sema: *Sema, ty: Type, union_obj: *Module.Union) CompileError!void {
2682226910 switch (union_obj.status) {
2682326911 .none => {},
2682426912 .field_types_wip => {
26825 return sema.fail(block, src, "union '{}' depends on itself", .{ty.fmt(sema.mod)});
26913 const msg = try Module.ErrorMsg.create(
26914 sema.gpa,
26915 union_obj.srcLoc(sema.mod),
26916 "union '{}' depends on itself",
26917 .{ty.fmt(sema.mod)},
26918 );
26919 return sema.failWithOwnedErrorMsg(msg);
2682626920 },
2682726921 .have_field_types,
2682826922 .have_layout,
......@@ -27038,7 +27132,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
2703827132 try sema.errNote(&block_scope, src, msg, "struct declared here", .{});
2703927133 break :msg msg;
2704027134 };
27041 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27135 return sema.failWithOwnedErrorMsg(msg);
2704227136 }
2704327137 gop.value_ptr.* = .{
2704427138 .ty = Type.initTag(.noreturn),
......@@ -27097,7 +27191,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
2709727191 try sema.addDeclaredHereNote(msg, field_ty);
2709827192 break :msg msg;
2709927193 };
27100 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27194 return sema.failWithOwnedErrorMsg(msg);
2710127195 }
2710227196 if (struct_obj.layout == .Extern and !sema.validateExternType(field.ty, .other)) {
2710327197 const msg = msg: {
......@@ -27111,7 +27205,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
2711127205 try sema.addDeclaredHereNote(msg, field.ty);
2711227206 break :msg msg;
2711327207 };
27114 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27208 return sema.failWithOwnedErrorMsg(msg);
2711527209 } else if (struct_obj.layout == .Packed and !(validatePackedType(field.ty))) {
2711627210 const msg = msg: {
2711727211 const tree = try sema.getAstTree(&block_scope);
......@@ -27124,7 +27218,7 @@ fn semaStructFields(mod: *Module, struct_obj: *Module.Struct) CompileError!void
2712427218 try sema.addDeclaredHereNote(msg, field.ty);
2712527219 break :msg msg;
2712627220 };
27127 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27221 return sema.failWithOwnedErrorMsg(msg);
2712827222 }
2712927223
2713027224 if (zir_field.align_body_len > 0) {
......@@ -27406,7 +27500,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2740627500 try sema.errNote(&block_scope, src, msg, "union declared here", .{});
2740727501 break :msg msg;
2740827502 };
27409 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27503 return sema.failWithOwnedErrorMsg(msg);
2741027504 }
2741127505
2741227506 if (tag_ty_field_names) |*names| {
......@@ -27420,7 +27514,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2742027514 try sema.addDeclaredHereNote(msg, union_obj.tag_ty);
2742127515 break :msg msg;
2742227516 };
27423 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27517 return sema.failWithOwnedErrorMsg(msg);
2742427518 }
2742527519 }
2742627520
......@@ -27434,7 +27528,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2743427528 try sema.addDeclaredHereNote(msg, field_ty);
2743527529 break :msg msg;
2743627530 };
27437 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27531 return sema.failWithOwnedErrorMsg(msg);
2743827532 }
2743927533 if (union_obj.layout == .Extern and !sema.validateExternType(field_ty, .union_field)) {
2744027534 const msg = msg: {
......@@ -27448,7 +27542,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2744827542 try sema.addDeclaredHereNote(msg, field_ty);
2744927543 break :msg msg;
2745027544 };
27451 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27545 return sema.failWithOwnedErrorMsg(msg);
2745227546 } else if (union_obj.layout == .Packed and !(validatePackedType(field_ty))) {
2745327547 const msg = msg: {
2745427548 const tree = try sema.getAstTree(&block_scope);
......@@ -27461,7 +27555,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2746127555 try sema.addDeclaredHereNote(msg, field_ty);
2746227556 break :msg msg;
2746327557 };
27464 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27558 return sema.failWithOwnedErrorMsg(msg);
2746527559 }
2746627560
2746727561 gop.value_ptr.* = .{
......@@ -27493,7 +27587,7 @@ fn semaUnionFields(mod: *Module, union_obj: *Module.Union) CompileError!void {
2749327587 try sema.addDeclaredHereNote(msg, union_obj.tag_ty);
2749427588 break :msg msg;
2749527589 };
27496 return sema.failWithOwnedErrorMsg(&block_scope, msg);
27590 return sema.failWithOwnedErrorMsg(msg);
2749727591 }
2749827592 }
2749927593}
......@@ -27756,9 +27850,19 @@ pub fn typeHasOnePossibleValue(
2775627850 .@"struct" => {
2775727851 const resolved_ty = try sema.resolveTypeFields(block, src, ty);
2775827852 const s = resolved_ty.castTag(.@"struct").?.data;
27759 for (s.fields.values()) |value| {
27760 if (value.is_comptime) continue;
27761 if ((try sema.typeHasOnePossibleValue(block, src, value.ty)) == null) {
27853 for (s.fields.values()) |field, i| {
27854 if (field.is_comptime) continue;
27855 if (field.ty.eql(resolved_ty, sema.mod)) {
27856 const msg = try Module.ErrorMsg.create(
27857 sema.gpa,
27858 s.srcLoc(sema.mod),
27859 "struct '{}' depends on itself",
27860 .{ty.fmt(sema.mod)},
27861 );
27862 try sema.addFieldErrNote(block, resolved_ty, i, msg, "while checking this field", .{});
27863 return sema.failWithOwnedErrorMsg(msg);
27864 }
27865 if ((try sema.typeHasOnePossibleValue(block, src, field.ty)) == null) {
2776227866 return null;
2776327867 }
2776427868 }
......@@ -27824,6 +27928,16 @@ pub fn typeHasOnePossibleValue(
2782427928 const tag_val = (try sema.typeHasOnePossibleValue(block, src, union_obj.tag_ty)) orelse
2782527929 return null;
2782627930 const only_field = union_obj.fields.values()[0];
27931 if (only_field.ty.eql(resolved_ty, sema.mod)) {
27932 const msg = try Module.ErrorMsg.create(
27933 sema.gpa,
27934 union_obj.srcLoc(sema.mod),
27935 "union '{}' depends on itself",
27936 .{ty.fmt(sema.mod)},
27937 );
27938 try sema.addFieldErrNote(block, resolved_ty, 0, msg, "while checking this field", .{});
27939 return sema.failWithOwnedErrorMsg(msg);
27940 }
2782727941 const val_val = (try sema.typeHasOnePossibleValue(block, src, only_field.ty)) orelse
2782827942 return null;
2782927943 // TODO make this not allocate. The function in `Type.onePossibleValue`
......@@ -28463,7 +28577,7 @@ pub fn typeRequiresComptime(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Typ
2846328577 if (struct_obj.status == .field_types_wip)
2846428578 return false;
2846528579
28466 try sema.resolveTypeFieldsStruct(block, src, ty, struct_obj);
28580 try sema.resolveTypeFieldsStruct(ty, struct_obj);
2846728581
2846828582 struct_obj.requires_comptime = .wip;
2846928583 for (struct_obj.fields.values()) |field| {
......@@ -28488,7 +28602,7 @@ pub fn typeRequiresComptime(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Typ
2848828602 if (union_obj.status == .field_types_wip)
2848928603 return false;
2849028604
28491 try sema.resolveTypeFieldsUnion(block, src, ty, union_obj);
28605 try sema.resolveTypeFieldsUnion(ty, union_obj);
2849228606
2849328607 union_obj.requires_comptime = .wip;
2849428608 for (union_obj.fields.values()) |field| {
test/cases/compile_errors/accessing_runtime_parameter_from_outer_function.zig created+20
......@@ -0,0 +1,20 @@
1fn outer(y: u32) *const fn (u32) u32 {
2 const st = struct {
3 fn get(z: u32) u32 {
4 return z + y;
5 }
6 };
7 return st.get;
8}
9export fn entry() void {
10 var func = outer(10);
11 var x = func(3);
12 _ = x;
13}
14
15// error
16// backend=stage2
17// target=native
18//
19// :4:24: error: 'y' not accessible from inner function
20// :3:9: note: crossed function definition here
test/cases/compile_errors/cannot_break_out_of_defer_expression.zig created+14
......@@ -0,0 +1,14 @@
1export fn foo() void {
2 while (true) {
3 defer {
4 break;
5 }
6 }
7}
8
9// error
10// backend=stage2
11// target=native
12//
13// :4:13: error: cannot break out of defer expression
14// :3:9: note: defer expression here
test/cases/compile_errors/cannot_continue_out_of_defer_expression.zig created+14
......@@ -0,0 +1,14 @@
1export fn foo() void {
2 while (true) {
3 defer {
4 continue;
5 }
6 }
7}
8
9// error
10// backend=stage2
11// target=native
12//
13// :4:13: error: cannot continue out of defer expression
14// :3:9: note: defer expression here
test/cases/compile_errors/direct_struct_loop.zig created+9
......@@ -0,0 +1,9 @@
1const A = struct { a : A, };
2export fn entry() usize { return @sizeOf(A); }
3
4// error
5// backend=stage2
6// target=native
7//
8// :1:11: error: struct 'tmp.A' depends on itself
9// :1:20: note: while checking this field
test/cases/compile_errors/for_loop_body_expression_ignored.zig created+35
......@@ -0,0 +1,35 @@
1fn returns() usize {
2 return 2;
3}
4export fn f1() void {
5 for ("hello") |_| returns();
6}
7export fn f2() void {
8 var x: anyerror!i32 = error.Bad;
9 for ("hello") |_| returns() else unreachable;
10 _ = x;
11}
12export fn f3() void {
13 for ("hello") |_| {} else true;
14}
15export fn f4() void {
16 const foo = for ("hello") |_| returns() else true;
17 _ = foo;
18}
19
20// error
21// backend=stage2
22// target=native
23//
24// :5:30: error: value of type 'usize' ignored
25// :5:30: note: all non-void values must be used
26// :5:30: note: this error can be suppressed by assigning the value to '_'
27// :9:30: error: value of type 'usize' ignored
28// :9:30: note: all non-void values must be used
29// :9:30: note: this error can be suppressed by assigning the value to '_'
30// :13:31: error: value of type 'bool' ignored
31// :13:31: note: all non-void values must be used
32// :13:31: note: this error can be suppressed by assigning the value to '_'
33// :16:42: error: value of type 'usize' ignored
34// :16:42: note: all non-void values must be used
35// :16:42: note: this error can be suppressed by assigning the value to '_'
test/cases/compile_errors/indirect_struct_loop.zig created+13
......@@ -0,0 +1,13 @@
1const A = struct { b : B, };
2const B = struct { c : C, };
3const C = struct { a : A, };
4export fn entry() usize { return @sizeOf(A); }
5
6// error
7// backend=stage2
8// target=native
9//
10// :1:11: error: struct 'tmp.A' depends on itself
11// :3:20: note: while checking this field
12// :2:20: note: while checking this field
13// :1:20: note: while checking this field
test/cases/compile_errors/instantiating_an_undefined_value_for_an_invalid_struct_that_contains_itself.zig created+16
......@@ -0,0 +1,16 @@
1const Foo = struct {
2 x: Foo,
3};
4
5var foo: Foo = undefined;
6
7export fn entry() usize {
8 return @sizeOf(@TypeOf(foo.x));
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :1:13: error: struct 'tmp.Foo' depends on itself
16// :2:5: note: while checking this field
test/cases/compile_errors/instantiating_an_undefined_value_for_an_invalid_union_that_contains_itself.zig created+16
......@@ -0,0 +1,16 @@
1const Foo = union {
2 x: Foo,
3};
4
5var foo: Foo = undefined;
6
7export fn entry() usize {
8 return @sizeOf(@TypeOf(foo.x));
9}
10
11// error
12// backend=stage2
13// target=native
14//
15// :1:13: error: union 'tmp.Foo' depends on itself
16// :2:5: note: while checking this field
test/cases/compile_errors/packed_union_given_enum_tag_type.zig created+20
......@@ -0,0 +1,20 @@
1const Letter = enum {
2 A,
3 B,
4 C,
5};
6const Payload = packed union(Letter) {
7 A: i32,
8 B: f64,
9 C: bool,
10};
11export fn entry() void {
12 var a = Payload { .A = 1234 };
13 _ = a;
14}
15
16// error
17// backend=stage2
18// target=native
19//
20// :6:30: error: packed union does not support enum tag type
test/cases/compile_errors/packed_union_with_automatic_layout_field.zig created+20
......@@ -0,0 +1,20 @@
1const Foo = struct {
2 a: u32,
3 b: f32,
4};
5const Payload = packed union {
6 A: Foo,
7 B: bool,
8};
9export fn entry() void {
10 var a = Payload { .B = true };
11 _ = a;
12}
13
14// error
15// backend=stage2
16// target=native
17//
18// :6:5: error: packed unions cannot contain fields of type 'tmp.Foo'
19// :6:5: note: only packed structs layout are allowed in packed types
20// :1:13: note: struct declared here
test/cases/compile_errors/specify_non-integer_enum_tag_type.zig created+16
......@@ -0,0 +1,16 @@
1const Small = enum (f32) {
2 One,
3 Two,
4 Three,
5};
6
7export fn entry() void {
8 var x = Small.One;
9 _ = x;
10}
11
12// error
13// backend=stage2
14// target=native
15//
16// :1:21: error: expected integer tag type, found 'f32'
test/cases/compile_errors/stage1/obj/accessing_runtime_parameter_from_outer_function.zig deleted-21
......@@ -1,21 +0,0 @@
1fn outer(y: u32) fn (u32) u32 {
2 const st = struct {
3 fn get(z: u32) u32 {
4 return z + y;
5 }
6 };
7 return st.get;
8}
9export fn entry() void {
10 var func = outer(10);
11 var x = func(3);
12 _ = x;
13}
14
15// error
16// backend=stage1
17// target=native
18//
19// tmp.zig:4:24: error: 'y' not accessible from inner function
20// tmp.zig:3:28: note: crossed function definition here
21// tmp.zig:1:10: note: declared here
test/cases/compile_errors/stage1/obj/cannot_break_out_of_defer_expression.zig deleted-13
......@@ -1,13 +0,0 @@
1export fn foo() void {
2 while (true) {
3 defer {
4 break;
5 }
6 }
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:4:13: error: cannot break out of defer expression
test/cases/compile_errors/stage1/obj/cannot_continue_out_of_defer_expression.zig deleted-13
......@@ -1,13 +0,0 @@
1export fn foo() void {
2 while (true) {
3 defer {
4 continue;
5 }
6 }
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:4:13: error: cannot continue out of defer expression
test/cases/compile_errors/stage1/obj/direct_struct_loop.zig deleted-8
......@@ -1,8 +0,0 @@
1const A = struct { a : A, };
2export fn entry() usize { return @sizeOf(A); }
3
4// error
5// backend=stage1
6// target=native
7//
8// tmp.zig:1:11: error: struct 'A' depends on itself
test/cases/compile_errors/stage1/obj/for_loop_body_expression_ignored.zig deleted-18
......@@ -1,18 +0,0 @@
1fn returns() usize {
2 return 2;
3}
4export fn f1() void {
5 for ("hello") |_| returns();
6}
7export fn f2() void {
8 var x: anyerror!i32 = error.Bad;
9 for ("hello") |_| returns() else unreachable;
10 _ = x;
11}
12
13// error
14// backend=stage1
15// target=native
16//
17// tmp.zig:5:30: error: expression value is ignored
18// tmp.zig:9:30: error: expression value is ignored
test/cases/compile_errors/stage1/obj/indirect_struct_loop.zig deleted-10
......@@ -1,10 +0,0 @@
1const A = struct { b : B, };
2const B = struct { c : C, };
3const C = struct { a : A, };
4export fn entry() usize { return @sizeOf(A); }
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:1:11: error: struct 'A' depends on itself
test/cases/compile_errors/stage1/obj/instantiating_an_undefined_value_for_an_invalid_struct_that_contains_itself.zig deleted-15
......@@ -1,15 +0,0 @@
1const Foo = struct {
2 x: Foo,
3};
4
5var foo: Foo = undefined;
6
7export fn entry() usize {
8 return @sizeOf(@TypeOf(foo.x));
9}
10
11// error
12// backend=stage1
13// target=native
14//
15// tmp.zig:1:13: error: struct 'Foo' depends on itself
test/cases/compile_errors/stage1/obj/packed_union_given_enum_tag_type.zig deleted-20
......@@ -1,20 +0,0 @@
1const Letter = enum {
2 A,
3 B,
4 C,
5};
6const Payload = packed union(Letter) {
7 A: i32,
8 B: f64,
9 C: bool,
10};
11export fn entry() void {
12 var a = Payload { .A = 1234 };
13 _ = a;
14}
15
16// error
17// backend=stage1
18// target=native
19//
20// tmp.zig:6:30: error: packed union does not support enum tag type
test/cases/compile_errors/stage1/obj/packed_union_with_automatic_layout_field.zig deleted-18
......@@ -1,18 +0,0 @@
1const Foo = struct {
2 a: u32,
3 b: f32,
4};
5const Payload = packed union {
6 A: Foo,
7 B: bool,
8};
9export fn entry() void {
10 var a = Payload { .B = true };
11 _ = a;
12}
13
14// error
15// backend=stage1
16// target=native
17//
18// tmp.zig:6:5: error: non-packed, non-extern struct 'Foo' not allowed in packed union; no guaranteed in-memory representation
test/cases/compile_errors/stage1/obj/specify_non-integer_enum_tag_type.zig deleted-16
......@@ -1,16 +0,0 @@
1const Small = enum (f32) {
2 One,
3 Two,
4 Three,
5};
6
7export fn entry() void {
8 var x = Small.One;
9 _ = x;
10}
11
12// error
13// backend=stage1
14// target=native
15//
16// tmp.zig:1:21: error: expected integer, found 'f32'
test/cases/compile_errors/stage1/obj/struct_depends_on_itself_via_optional_field.zig deleted-19
......@@ -1,19 +0,0 @@
1const LhsExpr = struct {
2 rhsExpr: ?AstObject,
3};
4const AstObject = union {
5 lhsExpr: LhsExpr,
6};
7export fn entry() void {
8 const lhsExpr = LhsExpr{ .rhsExpr = null };
9 const obj = AstObject{ .lhsExpr = lhsExpr };
10 _ = obj;
11}
12
13// error
14// backend=stage1
15// target=native
16//
17// tmp.zig:1:17: error: struct 'LhsExpr' depends on itself
18// tmp.zig:5:5: note: while checking this field
19// tmp.zig:2:5: note: while checking this field
test/cases/compile_errors/stage1/obj/top_level_decl_dependency_loop.zig deleted-12
......@@ -1,12 +0,0 @@
1const a : @TypeOf(b) = 0;
2const b : @TypeOf(a) = 0;
3export fn entry() void {
4 const c = a + b;
5 _ = c;
6}
7
8// error
9// backend=stage1
10// target=native
11//
12// tmp.zig:2:19: error: dependency loop detected
test/cases/compile_errors/stage1/obj/unused_variable_error_on_errdefer.zig deleted-13
......@@ -1,13 +0,0 @@
1fn foo() !void {
2 errdefer |a| unreachable;
3 return error.A;
4}
5export fn entry() void {
6 foo() catch unreachable;
7}
8
9// error
10// backend=stage1
11// target=native
12//
13// tmp.zig:2:15: error: unused variable: 'a'
test/cases/compile_errors/stage1/obj/vector_index_out_of_bounds.zig deleted-10
......@@ -1,10 +0,0 @@
1export fn entry() void {
2 const x = @import("std").meta.Vector(3, f32){ 25, 75, 5, 0 };
3 _ = x;
4}
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:62: error: index 3 outside vector of size 3
test/cases/compile_errors/stage1/obj/while_expected_error_union_got_bool.zig deleted-10
......@@ -1,10 +0,0 @@
1export fn foo() void {
2 while (bar()) |x| {_ = x;} else |err| {_ = err;}
3}
4fn bar() bool { return true; }
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:15: error: expected error union type, found 'bool'
test/cases/compile_errors/stage1/obj/while_expected_error_union_got_optional.zig deleted-10
......@@ -1,10 +0,0 @@
1export fn foo() void {
2 while (bar()) |x| {_ = x;} else |err| {_ = err;}
3}
4fn bar() ?i32 { return 1; }
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:15: error: expected error union type, found '?i32'
test/cases/compile_errors/stage1/obj/while_expected_optional_got_bool.zig deleted-10
......@@ -1,10 +0,0 @@
1export fn foo() void {
2 while (bar()) |x| {_ = x;}
3}
4fn bar() bool { return true; }
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:15: error: expected optional type, found 'bool'
test/cases/compile_errors/stage1/obj/while_expected_optional_got_error_union.zig deleted-10
......@@ -1,10 +0,0 @@
1export fn foo() void {
2 while (bar()) |x| {_ = x;}
3}
4fn bar() anyerror!i32 { return 1; }
5
6// error
7// backend=stage1
8// target=native
9//
10// tmp.zig:2:15: error: expected optional type, found 'anyerror!i32'
test/cases/compile_errors/stage1/obj/while_loop_body_expression_ignored.zig deleted-22
......@@ -1,22 +0,0 @@
1fn returns() usize {
2 return 2;
3}
4export fn f1() void {
5 while (true) returns();
6}
7export fn f2() void {
8 var x: ?i32 = null;
9 while (x) |_| returns();
10}
11export fn f3() void {
12 var x: anyerror!i32 = error.Bad;
13 while (x) |_| returns() else |_| unreachable;
14}
15
16// error
17// backend=stage1
18// target=native
19//
20// tmp.zig:5:25: error: expression value is ignored
21// tmp.zig:9:26: error: expression value is ignored
22// tmp.zig:13:26: error: expression value is ignored
test/cases/compile_errors/struct_depends_on_itself_via_optional_field.zig created+19
......@@ -0,0 +1,19 @@
1const LhsExpr = struct {
2 rhsExpr: ?AstObject,
3};
4const AstObject = union {
5 lhsExpr: LhsExpr,
6};
7export fn entry() void {
8 const lhsExpr = LhsExpr{ .rhsExpr = null };
9 const obj = AstObject{ .lhsExpr = lhsExpr };
10 _ = obj;
11}
12
13// error
14// backend=stage2
15// target=native
16//
17// :1:17: error: struct 'tmp.LhsExpr' depends on itself
18// :5:5: note: while checking this field
19// :2:5: note: while checking this field
test/cases/compile_errors/top_level_decl_dependency_loop.zig created+13
......@@ -0,0 +1,13 @@
1const a : @TypeOf(b) = 0;
2const b : @TypeOf(a) = 0;
3export fn entry() void {
4 const c = a + b;
5 _ = c;
6}
7
8// error
9// backend=stage2
10// target=native
11//
12// :1:1: error: dependency loop detected
13// :2:19: note: referenced here
test/cases/compile_errors/unused_variable_error_on_errdefer.zig created+13
......@@ -0,0 +1,13 @@
1fn foo() !void {
2 errdefer |a| unreachable;
3 return error.A;
4}
5export fn entry() void {
6 foo() catch unreachable;
7}
8
9// error
10// backend=stage2
11// target=native
12//
13// :2:15: error: unused capture
test/cases/compile_errors/vector_index_out_of_bounds.zig created+10
......@@ -0,0 +1,10 @@
1export fn entry() void {
2 const x = @import("std").meta.Vector(3, f32){ 25, 75, 5, 0 };
3 _ = x;
4}
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:49: error: expected 3 vector elements; found 4
test/cases/compile_errors/while_expected_error_union_got_bool.zig created+10
......@@ -0,0 +1,10 @@
1export fn foo() void {
2 while (bar()) |x| {_ = x;} else |err| {_ = err;}
3}
4fn bar() bool { return true; }
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:15: error: expected error union type, found 'bool'
test/cases/compile_errors/while_expected_error_union_got_optional.zig created+10
......@@ -0,0 +1,10 @@
1export fn foo() void {
2 while (bar()) |x| {_ = x;} else |err| {_ = err;}
3}
4fn bar() ?i32 { return 1; }
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:15: error: expected error union type, found '?i32'
test/cases/compile_errors/while_expected_optional_got_bool.zig created+10
......@@ -0,0 +1,10 @@
1export fn foo() void {
2 while (bar()) |x| {_ = x;}
3}
4fn bar() bool { return true; }
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:15: error: expected optional type, found 'bool'
test/cases/compile_errors/while_expected_optional_got_error_union.zig created+10
......@@ -0,0 +1,10 @@
1export fn foo() void {
2 while (bar()) |x| {_ = x;}
3}
4fn bar() anyerror!i32 { return 1; }
5
6// error
7// backend=stage2
8// target=native
9//
10// :2:15: error: expected optional type, found 'anyerror!i32'
test/cases/compile_errors/while_loop_body_expression_ignored.zig created+43
......@@ -0,0 +1,43 @@
1fn returns() usize {
2 return 2;
3}
4export fn f1() void {
5 while (true) returns();
6}
7export fn f2() void {
8 var x: ?i32 = null;
9 while (x) |_| returns();
10}
11export fn f3() void {
12 var x: anyerror!i32 = error.Bad;
13 while (x) |_| returns() else |_| unreachable;
14}
15export fn f4() void {
16 var a = true;
17 while (a) {} else true;
18}
19export fn f5() void {
20 var a = true;
21 const foo = while (a) returns() else true;
22 _ = foo;
23}
24
25// error
26// backend=stage2
27// target=native
28//
29// :5:25: error: value of type 'usize' ignored
30// :5:25: note: all non-void values must be used
31// :5:25: note: this error can be suppressed by assigning the value to '_'
32// :9:26: error: value of type 'usize' ignored
33// :9:26: note: all non-void values must be used
34// :9:26: note: this error can be suppressed by assigning the value to '_'
35// :13:26: error: value of type 'usize' ignored
36// :13:26: note: all non-void values must be used
37// :13:26: note: this error can be suppressed by assigning the value to '_'
38// :17:23: error: value of type 'bool' ignored
39// :17:23: note: all non-void values must be used
40// :17:23: note: this error can be suppressed by assigning the value to '_'
41// :21:34: error: value of type 'usize' ignored
42// :21:34: note: all non-void values must be used
43// :21:34: note: this error can be suppressed by assigning the value to '_'