authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-27 14:44:37-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-27 16:19:23-07:00
log6a4df2778e5f35fb112d87b12f94d4e3d06ee1d3
tree536361099545cc9f553ec4a29e4c7ade51375363
parent401abd793d9e1abd0e37a6db55d222060ae35107

AstGen: fix ref instruction injection for functions

For the expressions regarding return type, alignment, parameter type, etc.

2 files changed, 35 insertions(+), 20 deletions(-)

src/AstGen.zig+21-20
......@@ -10282,11 +10282,11 @@ const GenZir = struct {
1028210282 try astgen.extra.ensureUnusedCapacity(
1028310283 gpa,
1028410284 @typeInfo(Zir.Inst.FuncFancy).Struct.fields.len +
10285 fancyFnExprExtraLen(align_body, args.align_ref) +
10286 fancyFnExprExtraLen(addrspace_body, args.addrspace_ref) +
10287 fancyFnExprExtraLen(section_body, args.section_ref) +
10288 fancyFnExprExtraLen(cc_body, args.cc_ref) +
10289 fancyFnExprExtraLen(ret_body, ret_ref) +
10285 fancyFnExprExtraLen(astgen, align_body, args.align_ref) +
10286 fancyFnExprExtraLen(astgen, addrspace_body, args.addrspace_ref) +
10287 fancyFnExprExtraLen(astgen, section_body, args.section_ref) +
10288 fancyFnExprExtraLen(astgen, cc_body, args.cc_ref) +
10289 fancyFnExprExtraLen(astgen, ret_body, ret_ref) +
1029010290 body_len + src_locs.len +
1029110291 @boolToInt(args.lib_name != 0) +
1029210292 @boolToInt(args.noalias_bits != 0),
......@@ -10322,36 +10322,36 @@ const GenZir = struct {
1032210322
1032310323 const zir_datas = astgen.instructions.items(.data);
1032410324 if (align_body.len != 0) {
10325 astgen.extra.appendAssumeCapacity(@intCast(u32, align_body.len));
10326 astgen.extra.appendSliceAssumeCapacity(align_body);
10325 astgen.extra.appendAssumeCapacity(countBodyLenAfterFixups(astgen, align_body));
10326 astgen.appendBodyWithFixups(align_body);
1032710327 zir_datas[align_body[align_body.len - 1]].@"break".block_inst = new_index;
1032810328 } else if (args.align_ref != .none) {
1032910329 astgen.extra.appendAssumeCapacity(@enumToInt(args.align_ref));
1033010330 }
1033110331 if (addrspace_body.len != 0) {
10332 astgen.extra.appendAssumeCapacity(@intCast(u32, addrspace_body.len));
10333 astgen.extra.appendSliceAssumeCapacity(addrspace_body);
10332 astgen.extra.appendAssumeCapacity(countBodyLenAfterFixups(astgen, addrspace_body));
10333 astgen.appendBodyWithFixups(addrspace_body);
1033410334 zir_datas[addrspace_body[addrspace_body.len - 1]].@"break".block_inst = new_index;
1033510335 } else if (args.addrspace_ref != .none) {
1033610336 astgen.extra.appendAssumeCapacity(@enumToInt(args.addrspace_ref));
1033710337 }
1033810338 if (section_body.len != 0) {
10339 astgen.extra.appendAssumeCapacity(@intCast(u32, section_body.len));
10340 astgen.extra.appendSliceAssumeCapacity(section_body);
10339 astgen.extra.appendAssumeCapacity(countBodyLenAfterFixups(astgen, section_body));
10340 astgen.appendBodyWithFixups(section_body);
1034110341 zir_datas[section_body[section_body.len - 1]].@"break".block_inst = new_index;
1034210342 } else if (args.section_ref != .none) {
1034310343 astgen.extra.appendAssumeCapacity(@enumToInt(args.section_ref));
1034410344 }
1034510345 if (cc_body.len != 0) {
10346 astgen.extra.appendAssumeCapacity(@intCast(u32, cc_body.len));
10347 astgen.extra.appendSliceAssumeCapacity(cc_body);
10346 astgen.extra.appendAssumeCapacity(countBodyLenAfterFixups(astgen, cc_body));
10347 astgen.appendBodyWithFixups(cc_body);
1034810348 zir_datas[cc_body[cc_body.len - 1]].@"break".block_inst = new_index;
1034910349 } else if (args.cc_ref != .none) {
1035010350 astgen.extra.appendAssumeCapacity(@enumToInt(args.cc_ref));
1035110351 }
1035210352 if (ret_body.len != 0) {
10353 astgen.extra.appendAssumeCapacity(@intCast(u32, ret_body.len));
10354 astgen.extra.appendSliceAssumeCapacity(ret_body);
10353 astgen.extra.appendAssumeCapacity(countBodyLenAfterFixups(astgen, ret_body));
10354 astgen.appendBodyWithFixups(ret_body);
1035510355 zir_datas[ret_body[ret_body.len - 1]].@"break".block_inst = new_index;
1035610356 } else if (ret_ref != .none) {
1035710357 astgen.extra.appendAssumeCapacity(@enumToInt(ret_ref));
......@@ -10389,11 +10389,12 @@ const GenZir = struct {
1038910389 try astgen.extra.ensureUnusedCapacity(
1039010390 gpa,
1039110391 @typeInfo(Zir.Inst.Func).Struct.fields.len + 1 +
10392 @maximum(ret_body.len, @boolToInt(ret_ref != .none)) +
10392 fancyFnExprExtraLen(astgen, ret_body, ret_ref) +
1039310393 body_len + src_locs.len,
1039410394 );
10395
1039510396 const ret_body_len = if (ret_body.len != 0)
10396 @intCast(u32, ret_body.len)
10397 countBodyLenAfterFixups(astgen, ret_body)
1039710398 else
1039810399 @boolToInt(ret_ref != .none);
1039910400
......@@ -10404,7 +10405,7 @@ const GenZir = struct {
1040410405 });
1040510406 const zir_datas = astgen.instructions.items(.data);
1040610407 if (ret_body.len != 0) {
10407 astgen.extra.appendSliceAssumeCapacity(ret_body);
10408 astgen.appendBodyWithFixups(ret_body);
1040810409 zir_datas[ret_body[ret_body.len - 1]].@"break".block_inst = new_index;
1040910410 } else if (ret_ref != .none) {
1041010411 astgen.extra.appendAssumeCapacity(@enumToInt(ret_ref));
......@@ -10435,10 +10436,10 @@ const GenZir = struct {
1043510436 }
1043610437 }
1043710438
10438 fn fancyFnExprExtraLen(body: []Zir.Inst.Index, ref: Zir.Inst.Ref) usize {
10439 fn fancyFnExprExtraLen(astgen: *AstGen, body: []Zir.Inst.Index, ref: Zir.Inst.Ref) u32 {
1043910440 // In the case of non-empty body, there is one for the body length,
1044010441 // and then one for each instruction.
10441 return body.len + @boolToInt(ref != .none);
10442 return countBodyLenAfterFixups(astgen, body) + @boolToInt(ref != .none);
1044210443 }
1044310444
1044410445 fn addVar(gz: *GenZir, args: struct {
test/behavior/fn.zig+14
......@@ -408,3 +408,17 @@ test "function with inferred error set but returning no error" {
408408 const return_ty = @typeInfo(@TypeOf(S.foo)).Fn.return_type.?;
409409 try expectEqual(0, @typeInfo(@typeInfo(return_ty).ErrorUnion.error_set).ErrorSet.?.len);
410410}
411
412test "import passed byref to function in return type" {
413 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
414 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
415
416 const S = struct {
417 fn get() @import("std").ArrayListUnmanaged(i32) {
418 var x: @import("std").ArrayListUnmanaged(i32) = .{};
419 return x;
420 }
421 };
422 var list = S.get();
423 try expect(list.items.len == 0);
424}