| author | |
| committer | |
| log | a2517117e7cffcc4be21e944f2b4f8661c8f15a3 |
| tree | 5e80c067eedc2941d8a30d62706a11e150f728c1 |
| parent | 6a9c9afbae24897a5c6fa843794be33e4ed33f12 |
2 files changed, 12 insertions(+), 0 deletions(-)
src/Sema.zig+4| ... | ... | @@ -7795,6 +7795,10 @@ fn zirHasField(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 7795 | 7795 | if (mem.eql(u8, name, field_name)) break true; |
| 7796 | 7796 | } else false; |
| 7797 | 7797 | } |
| 7798 | if (ty.isTuple()) { | |
| 7799 | const field_index = std.fmt.parseUnsigned(u32, field_name, 10) catch break :hf false; | |
| 7800 | break :hf field_index < ty.structFieldCount(); | |
| 7801 | } | |
| 7798 | 7802 | break :hf switch (ty.zigTypeTag()) { |
| 7799 | 7803 | .Struct => ty.structFields().contains(field_name), |
| 7800 | 7804 | .Union => ty.unionFields().contains(field_name), |
test/behavior/hasfield.zig+8| ... | ... | @@ -38,4 +38,12 @@ test "@hasField" { |
| 38 | 38 | const anon = @TypeOf(.{ .a = 1 }); |
| 39 | 39 | try expect(@hasField(anon, "a") == true); |
| 40 | 40 | try expect(@hasField(anon, "b") == false); |
| 41 | ||
| 42 | const tuple = @TypeOf(.{ 1, 2 }); | |
| 43 | try expect(@hasField(tuple, "a") == false); | |
| 44 | try expect(@hasField(tuple, "b") == false); | |
| 45 | try expect(@hasField(tuple, "0") == true); | |
| 46 | try expect(@hasField(tuple, "1") == true); | |
| 47 | try expect(@hasField(tuple, "2") == false); | |
| 48 | try expect(@hasField(tuple, "9999999999999999999999999") == false); | |
| 41 | 49 | } |