diff options
| author | Andrew Kelley <superjoe30@gmail.com> | 2017-02-12 17:22:35 -0500 |
|---|---|---|
| committer | Andrew Kelley <superjoe30@gmail.com> | 2017-02-12 17:35:51 -0500 |
| commit | 6dba1f1c8eee5e2f037c7ef216bc64423aef8e00 (patch) | |
| tree | f39a29e98b7e3404b114aaa08cd26d767a1666c1 /src/analyze.cpp | |
| parent | ca180d3f02914d282505752a1d2fe08e175f9d99 (diff) | |
| download | zig-6dba1f1c8eee5e2f037c7ef216bc64423aef8e00.tar.gz zig-6dba1f1c8eee5e2f037c7ef216bc64423aef8e00.zip | |
slice and array re-work plus some misc. changes
* `@truncate` builtin allows casting to the same size integer.
It also performs two's complement casting between signed and
unsigned integers.
* The idiomatic way to convert between bytes and numbers is now
`mem.readInt` and `mem.writeInt` instead of an unsafe cast.
It works at compile time, is safer, and looks cleaner.
* Implicitly casting an array to a slice is allowed only if the
slice is const.
* Constant pointer values know if their memory is from a compile-
time constant value or a compile-time variable.
* Cast from [N]u8 to []T no longer allowed, but [N]u8 to []const T
still allowed.
* Fix inability to pass a mutable pointer to comptime variable at
compile-time to a function and have the function modify the
memory pointed to by the pointer.
* Add the `comptime T: type` parameter back to mem.eql. Prevents
accidentally creating instantiations for arrays.
Diffstat (limited to 'src/analyze.cpp')
| -rw-r--r-- | src/analyze.cpp | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/src/analyze.cpp b/src/analyze.cpp index 9a65479e49..1fa3d063bb 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -2833,7 +2833,18 @@ static uint32_t hash_const_val(ConstExprValue *const_val) { const_val->data.x_arg_tuple.end_index * 2290442768; case TypeTableEntryIdPointer: { - uint32_t hash_val = const_val->data.x_ptr.comptime_var_mem ? 2216297012 : 170810250; + uint32_t hash_val = 0; + switch (const_val->data.x_ptr.mut) { + case ConstPtrMutRuntimeVar: + hash_val += 3500721036; + break; + case ConstPtrMutComptimeConst: + hash_val += 4214318515; + break; + case ConstPtrMutComptimeVar: + hash_val += 1103195694; + break; + } switch (const_val->data.x_ptr.special) { case ConstPtrSpecialInvalid: zig_unreachable(); @@ -3339,7 +3350,7 @@ bool const_values_equal(ConstExprValue *a, ConstExprValue *b) { case TypeTableEntryIdPointer: if (a->data.x_ptr.special != b->data.x_ptr.special) return false; - if (a->data.x_ptr.comptime_var_mem != b->data.x_ptr.comptime_var_mem) + if (a->data.x_ptr.mut != b->data.x_ptr.mut) return false; switch (a->data.x_ptr.special) { case ConstPtrSpecialInvalid: |
