| ... | ... | @@ -383,6 +383,8 @@ const ResultInfo = struct { |
| 383 | 383 | assignment, |
| 384 | 384 | /// No specific operator in particular. |
| 385 | 385 | none, |
| 386 | /// The expression is operand to address-of which is the operand to a return expression. |
| 387 | return_addrof, |
| 386 | 388 | }; |
| 387 | 389 | }; |
| 388 | 390 | |
| ... | ... | @@ -955,7 +957,14 @@ fn expr(gz: *GenZir, scope: *Scope, ri: ResultInfo, node: Ast.Node.Index) InnerE |
| 955 | 957 | _ = try gz.addUnTok(.validate_ref_ty, res_ty_inst, tree.firstToken(node)); |
| 956 | 958 | break :rl .{ .ref_coerced_ty = res_ty_inst }; |
| 957 | 959 | } else .ref; |
| 958 | | const result = try expr(gz, scope, .{ .rl = operand_rl }, tree.nodeData(node).node); |
| 960 | const operand_node = tree.nodeData(node).node; |
| 961 | const result = try expr(gz, scope, .{ |
| 962 | .rl = operand_rl, |
| 963 | .ctx = switch (ri.ctx) { |
| 964 | .@"return" => .return_addrof, |
| 965 | else => .none, |
| 966 | }, |
| 967 | }, operand_node); |
| 959 | 968 | return rvalue(gz, ri, result, node); |
| 960 | 969 | }, |
| 961 | 970 | .optional_type => { |
| ... | ... | @@ -8420,13 +8429,19 @@ fn localVarRef( |
| 8420 | 8429 | local_ptr.used = .fromToken(ident_token); |
| 8421 | 8430 | } |
| 8422 | 8431 | |
| 8423 | | // Can't close over a runtime variable |
| 8424 | | if (num_namespaces_out != 0 and !local_ptr.maybe_comptime and !gz.is_typeof) { |
| 8425 | | const ident_name = try astgen.identifierTokenString(ident_token); |
| 8426 | | return astgen.failNodeNotes(ident, "mutable '{s}' not accessible from here", .{ident_name}, &.{ |
| 8427 | | try astgen.errNoteTok(local_ptr.token_src, "declared mutable here", .{}), |
| 8428 | | try astgen.errNoteNode(capturing_namespace.node, "crosses namespace boundary here", .{}), |
| 8429 | | }); |
| 8432 | if (!local_ptr.maybe_comptime and !gz.is_typeof) { |
| 8433 | if (num_namespaces_out != 0) { |
| 8434 | const ident_name = try astgen.identifierTokenString(ident_token); |
| 8435 | return astgen.failNodeNotes(ident, "mutable '{s}' not accessible from here", .{ident_name}, &.{ |
| 8436 | try astgen.errNoteTok(local_ptr.token_src, "declared mutable here", .{}), |
| 8437 | try astgen.errNoteNode(capturing_namespace.node, "crosses namespace boundary here", .{}), |
| 8438 | }); |
| 8439 | } else if (ri.ctx == .return_addrof) { |
| 8440 | const ident_name = try astgen.identifierTokenString(ident_token); |
| 8441 | return astgen.failNodeNotes(ident, "returning address of expired local variable '{s}'", .{ident_name}, &.{ |
| 8442 | try astgen.errNoteTok(local_ptr.token_src, "declared runtime-known here", .{}), |
| 8443 | }); |
| 8444 | } |
| 8430 | 8445 | } |
| 8431 | 8446 | |
| 8432 | 8447 | switch (ri.rl) { |