zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 42033ea3ca126ff1f3e5555ba56cc5a7adeb3d6b (tree)
parent 3f4b77f56132131e72b3fded52d2bcb71f8f5582
Author: Jimmi Holst Christensen <jimmiholstchristensen@gmail.com>
Date:   Sat, 30 Jun 2018 18:58:31 +0200

Merge pull request #1167 from ziglang/comptime-array-by-value

Implement const_values_equal for arrays
Diffstat:
Msrc/analyze.cpp | 18++++++++++++++++--
Mtest/cases/array.zig | 8++++++++
2 files changed, 24 insertions(+), 2 deletions(-)

diff --git a/src/analyze.cpp b/src/analyze.cpp @@ -5471,8 +5471,22 @@ bool const_values_equal(ConstExprValue *a, ConstExprValue *b) { case TypeTableEntryIdPointer: case TypeTableEntryIdFn: return const_values_equal_ptr(a, b); - case TypeTableEntryIdArray: - zig_panic("TODO"); + case TypeTableEntryIdArray: { + assert(a->type->data.array.len == b->type->data.array.len); + assert(a->data.x_array.special != ConstArraySpecialUndef); + assert(b->data.x_array.special != ConstArraySpecialUndef); + + size_t len = a->type->data.array.len; + ConstExprValue *a_elems = a->data.x_array.s_none.elements; + ConstExprValue *b_elems = b->data.x_array.s_none.elements; + + for (size_t i = 0; i < len; ++i) { + if (!const_values_equal(&a_elems[i], &b_elems[i])) + return false; + } + + return true; + } case TypeTableEntryIdStruct: for (size_t i = 0; i < a->type->data.structure.src_field_count; i += 1) { ConstExprValue *field_a = &a->data.x_struct.fields[i]; diff --git a/test/cases/array.zig b/test/cases/array.zig @@ -152,3 +152,11 @@ fn testImplicitCastSingleItemPtr() void { slice[0] += 1; assert(byte == 101); } + +fn testArrayByValAtComptime(b: [2]u8) u8 { return b[0]; } + +test "comptime evalutating function that takes array by value" { + const arr = []u8{0,1}; + _ = comptime testArrayByValAtComptime(arr); + _ = comptime testArrayByValAtComptime(arr); +}