Skip to content

Commit 42033ea

Browse files
authoredJun 30, 2018
Merge pull request #1167 from ziglang/comptime-array-by-value
Implement const_values_equal for arrays
·
0.15.20.3.0
2 parents 3f4b77f + 01bd5c4 commit 42033ea

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed
 

‎src/analyze.cpp‎

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5471,8 +5471,22 @@ bool const_values_equal(ConstExprValue *a, ConstExprValue *b) {
54715471
case TypeTableEntryIdPointer:
54725472
case TypeTableEntryIdFn:
54735473
return const_values_equal_ptr(a, b);
5474-
case TypeTableEntryIdArray:
5475-
zig_panic("TODO");
5474+
case TypeTableEntryIdArray: {
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+
}
54765490
case TypeTableEntryIdStruct:
54775491
for (size_t i = 0; i < a->type->data.structure.src_field_count; i += 1) {
54785492
ConstExprValue *field_a = &a->data.x_struct.fields[i];

‎test/cases/array.zig‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,3 +152,11 @@ fn testImplicitCastSingleItemPtr() void {
152152
slice[0] += 1;
153153
assert(byte == 101);
154154
}
155+
156+
fn testArrayByValAtComptime(b: [2]u8) u8 { return b[0]; }
157+
158+
test "comptime evalutating function that takes array by value" {
159+
const arr = []u8{0,1};
160+
_ = comptime testArrayByValAtComptime(arr);
161+
_ = comptime testArrayByValAtComptime(arr);
162+
}

0 commit comments

Comments
 (0)
Please sign in to comment.