authorgravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-06-28 10:34:37+02:00
committergravatar for jhc@dismail.deJimmi Holst Christensen <jhc@dismail.de> 2018-06-28 10:34:37+02:00
log3ec38b249446d1a51391e263fbb8303af52e6751
tree842a7aa2b75f36c02f555344d7ea399a864b170e
parent3290e728339e49765b1adda78f173befb9fc12bf

Implement const_values_equal for array type

* This allows arrays to be passed by value at comptime

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

src/analyze.cpp+13-2
...@@ -5458,8 +5458,19 @@ bool const_values_equal(ConstExprValue *a, ConstExprValue *b) {...@@ -5458,8 +5458,19 @@ bool const_values_equal(ConstExprValue *a, ConstExprValue *b) {
5458 case TypeTableEntryIdPointer:5458 case TypeTableEntryIdPointer:
5459 case TypeTableEntryIdFn:5459 case TypeTableEntryIdFn:
5460 return const_values_equal_ptr(a, b);5460 return const_values_equal_ptr(a, b);
5461 case TypeTableEntryIdArray:5461 case TypeTableEntryIdArray: {
5462 zig_panic("TODO");5462 assert(a->type->data.array.len == b->type->data.array.len);
5463 size_t len = a->type->data.array.len;
5464 ConstExprValue *a_elems = a->data.x_array.s_none.elements;
5465 ConstExprValue *b_elems = b->data.x_array.s_none.elements;
5466
5467 for (size_t i = 0; i < len; ++i) {
5468 if (!const_values_equal(&a_elems[i], &b_elems[i]))
5469 return false;
5470 }
5471
5472 return true;
5473 }
5463 case TypeTableEntryIdStruct:5474 case TypeTableEntryIdStruct:
5464 for (size_t i = 0; i < a->type->data.structure.src_field_count; i += 1) {5475 for (size_t i = 0; i < a->type->data.structure.src_field_count; i += 1) {
5465 ConstExprValue *field_a = &a->data.x_struct.fields[i];5476 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}