authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-06-30 18:58:31+02:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2018-06-30 18:58:31+02:00
log42033ea3ca126ff1f3e5555ba56cc5a7adeb3d6b
treeabb5b4bf1267f3902dd9d128b225bc3a7e9607f3
parent3f4b77f56132131e72b3fded52d2bcb71f8f5582
parent01bd5c46e177ae59f72197063c374e845eea3ff3
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

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

Implement const_values_equal for arrays

2 files changed, 24 insertions(+), 2 deletions(-)

src/analyze.cpp+16-2
...@@ -5471,8 +5471,22 @@ bool const_values_equal(ConstExprValue *a, ConstExprValue *b) {...@@ -5471,8 +5471,22 @@ bool const_values_equal(ConstExprValue *a, ConstExprValue *b) {
5471 case TypeTableEntryIdPointer:5471 case TypeTableEntryIdPointer:
5472 case TypeTableEntryIdFn:5472 case TypeTableEntryIdFn:
5473 return const_values_equal_ptr(a, b);5473 return const_values_equal_ptr(a, b);
5474 case TypeTableEntryIdArray:5474 case TypeTableEntryIdArray: {
5475 zig_panic("TODO");5475 assert(a->type->data.array.len == b->type->data.array.len);
5476 assert(a->data.x_array.special != ConstArraySpecialUndef);
5477 assert(b->data.x_array.special != ConstArraySpecialUndef);
5478
5479 size_t len = a->type->data.array.len;
5480 ConstExprValue *a_elems = a->data.x_array.s_none.elements;
5481 ConstExprValue *b_elems = b->data.x_array.s_none.elements;
5482
5483 for (size_t i = 0; i < len; ++i) {
5484 if (!const_values_equal(&a_elems[i], &b_elems[i]))
5485 return false;
5486 }
5487
5488 return true;
5489 }
5476 case TypeTableEntryIdStruct:5490 case TypeTableEntryIdStruct:
5477 for (size_t i = 0; i < a->type->data.structure.src_field_count; i += 1) {5491 for (size_t i = 0; i < a->type->data.structure.src_field_count; i += 1) {
5478 ConstExprValue *field_a = &a->data.x_struct.fields[i];5492 ConstExprValue *field_a = &a->data.x_struct.fields[i];
test/cases/array.zig+8
...@@ -152,3 +152,11 @@ fn testImplicitCastSingleItemPtr() void {...@@ -152,3 +152,11 @@ fn testImplicitCastSingleItemPtr() void {
152 slice[0] += 1;152 slice[0] += 1;
153 assert(byte == 101);153 assert(byte == 101);
154}154}
155
156fn testArrayByValAtComptime(b: [2]u8) u8 { return b[0]; }
157
158test "comptime evalutating function that takes array by value" {
159 const arr = []u8{0,1};
160 _ = comptime testArrayByValAtComptime(arr);
161 _ = comptime testArrayByValAtComptime(arr);
162}