authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-22 11:13:01+03:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-08-22 14:31:58+03:00
log5404dcdfd844e4b9f47dc49a1f43f0e1075a563f
tree06ee8b53580c6b5a31face3950520553a5d5a750
parent560baf67ce77de41da3d03183300cdf1b6d90567

Sema: fix fieldCallBind on tuples and anon structs

Closes #12573

2 files changed, 31 insertions(+), 7 deletions(-)

src/Sema.zig+23-7
...@@ -21394,14 +21394,30 @@ fn fieldCallBind(...@@ -21394,14 +21394,30 @@ fn fieldCallBind(
21394 switch (concrete_ty.zigTypeTag()) {21394 switch (concrete_ty.zigTypeTag()) {
21395 .Struct => {21395 .Struct => {
21396 const struct_ty = try sema.resolveTypeFields(block, src, concrete_ty);21396 const struct_ty = try sema.resolveTypeFields(block, src, concrete_ty);
21397 const struct_obj = struct_ty.castTag(.@"struct").?.data;21397 if (struct_ty.castTag(.@"struct")) |struct_obj| {
2139821398 const field_index_usize = struct_obj.data.fields.getIndex(field_name) orelse
21399 const field_index_usize = struct_obj.fields.getIndex(field_name) orelse21399 break :find_field;
21400 break :find_field;21400 const field_index = @intCast(u32, field_index_usize);
21401 const field_index = @intCast(u32, field_index_usize);21401 const field = struct_obj.data.fields.values()[field_index];
21402 const field = struct_obj.fields.values()[field_index];
2140321402
21404 return finishFieldCallBind(sema, block, src, ptr_ty, field.ty, field_index, object_ptr);21403 return finishFieldCallBind(sema, block, src, ptr_ty, field.ty, field_index, object_ptr);
21404 } else if (struct_ty.isTuple()) {
21405 if (mem.eql(u8, field_name, "len")) {
21406 return sema.addIntUnsigned(Type.usize, struct_ty.structFieldCount());
21407 }
21408 if (std.fmt.parseUnsigned(u32, field_name, 10)) |field_index| {
21409 if (field_index >= struct_ty.structFieldCount()) break :find_field;
21410 return finishFieldCallBind(sema, block, src, ptr_ty, struct_ty.structFieldType(field_index), field_index, object_ptr);
21411 } else |_| {}
21412 } else {
21413 const max = struct_ty.structFieldCount();
21414 var i: u32 = 0;
21415 while (i < max) : (i += 1) {
21416 if (mem.eql(u8, struct_ty.structFieldName(i), field_name)) {
21417 return finishFieldCallBind(sema, block, src, ptr_ty, struct_ty.structFieldType(i), i, object_ptr);
21418 }
21419 }
21420 }
21405 },21421 },
21406 .Union => {21422 .Union => {
21407 const union_ty = try sema.resolveTypeFields(block, src, concrete_ty);21423 const union_ty = try sema.resolveTypeFields(block, src, concrete_ty);
test/cases/compile_errors/bogus_method_call_on_slice.zig+8
...@@ -3,9 +3,17 @@ fn f(m: []const u8) void {...@@ -3,9 +3,17 @@ fn f(m: []const u8) void {
3 m.copy(u8, self[0..], m);3 m.copy(u8, self[0..], m);
4}4}
5export fn entry() usize { return @sizeOf(@TypeOf(&f)); }5export fn entry() usize { return @sizeOf(@TypeOf(&f)); }
6pub export fn entry1() void {
7 .{}.bar();
8}
9pub export fn entry2() void {
10 .{ .foo = 1 }.bar();
11}
612
7// error13// error
8// backend=stage214// backend=stage2
9// target=native15// target=native
10//16//
17// :7:8: error: no field or member function named 'bar' in '@TypeOf(.{})'
18// :10:18: error: no field or member function named 'bar' in 'struct{comptime foo: comptime_int = 1}'
11// :3:6: error: no field or member function named 'copy' in '[]const u8'19// :3:6: error: no field or member function named 'copy' in '[]const u8'