| author | |
| committer | |
| log | 79b169c5a564978dbbbb6253f847c2d9b1734e22 |
| tree | 5e80c067eedc2941d8a30d62706a11e150f728c1 |
| parent | 86a98b172be5060110efdd9c61415c841042564e |
| parent | a2517117e7cffcc4be21e944f2b4f8661c8f15a3 |
| signature |
stage2: @hasField for anon structs2 files changed, 21 insertions(+), 0 deletions(-)
src/Sema.zig+9| ... | ... | @@ -7790,6 +7790,15 @@ fn zirHasField(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!Ai |
| 7790 | 7790 | if (mem.eql(u8, field_name, "len")) break :hf true; |
| 7791 | 7791 | break :hf false; |
| 7792 | 7792 | } |
| 7793 | if (ty.castTag(.anon_struct)) |pl| { | |
| 7794 | break :hf for (pl.data.names) |name| { | |
| 7795 | if (mem.eql(u8, name, field_name)) break true; | |
| 7796 | } else false; | |
| 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 | } | |
| 7793 | 7802 | break :hf switch (ty.zigTypeTag()) { |
| 7794 | 7803 | .Struct => ty.structFields().contains(field_name), |
| 7795 | 7804 | .Union => ty.unionFields().contains(field_name), |
test/behavior/hasfield.zig+12| ... | ... | @@ -34,4 +34,16 @@ test "@hasField" { |
| 34 | 34 | try expect(@hasField(enm, "b") == true); |
| 35 | 35 | try expect(@hasField(enm, "non-existant") == false); |
| 36 | 36 | try expect(@hasField(enm, "nope") == false); |
| 37 | ||
| 38 | const anon = @TypeOf(.{ .a = 1 }); | |
| 39 | try expect(@hasField(anon, "a") == true); | |
| 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); | |
| 37 | 49 | } |