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) {
54585458 case TypeTableEntryIdPointer:
54595459 case TypeTableEntryIdFn:
54605460 return const_values_equal_ptr(a, b);
5461 case TypeTableEntryIdArray:
5462 zig_panic("TODO");
5461 case TypeTableEntryIdArray: {
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 }
54635474 case TypeTableEntryIdStruct:
54645475 for (size_t i = 0; i < a->type->data.structure.src_field_count; i += 1) {
54655476 ConstExprValue *field_a = &a->data.x_struct.fields[i];
test/cases/array.zig+8
......@@ -152,3 +152,11 @@ fn testImplicitCastSingleItemPtr() void {
152152 slice[0] += 1;
153153 assert(byte == 101);
154154}
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}