aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJimmi Holst Christensen <jimmiholstchristensen@gmail.com>2018-06-30 18:58:31 +0200
committerGitHub <noreply@github.com>2018-06-30 18:58:31 +0200
commit42033ea3ca126ff1f3e5555ba56cc5a7adeb3d6b (patch)
treeabb5b4bf1267f3902dd9d128b225bc3a7e9607f3
parent3f4b77f56132131e72b3fded52d2bcb71f8f5582 (diff)
parent01bd5c46e177ae59f72197063c374e845eea3ff3 (diff)
downloadzig-42033ea3ca126ff1f3e5555ba56cc5a7adeb3d6b.tar.gz
zig-42033ea3ca126ff1f3e5555ba56cc5a7adeb3d6b.zip
Merge pull request #1167 from ziglang/comptime-array-by-value
Implement const_values_equal for arrays
-rw-r--r--src/analyze.cpp18
-rw-r--r--test/cases/array.zig8
2 files changed, 24 insertions, 2 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp
index 3c81d9ff9a..6f94deb9fd 100644
--- 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
index b481261b4f..b72491bcc0 100644
--- 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);
+}