diff options
| author | Michael Dusan <michael.dusan@gmail.com> | 2019-10-10 04:55:09 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-10-10 10:20:04 -0400 |
| commit | 3464351d1e0a1e840d0b1a6267d0a5bf4113cfcc (patch) | |
| tree | fbdc987d4377b0126bc8342dfd8cb2d4d465f5b8 /src/ir.cpp | |
| parent | fd94d78ffc60f61db0990c18d24a24ef3c56fd4e (diff) | |
| download | zig-3464351d1e0a1e840d0b1a6267d0a5bf4113cfcc.tar.gz zig-3464351d1e0a1e840d0b1a6267d0a5bf4113cfcc.zip | |
stage1: fix ir_resolve_str() to return slice
`ir_resolve_str()` bug returns array expression even when when sliced
to a lesser length. Fix is to return array if slice.len == array.len,
otherwise return slice.
Bug report use-case is based on one builtin function. However, at least
the following builtins were exposed to the bug:
`@byteOffsetOf`
`@cDefine`
`@cImport`
`@cInclude`
`@cUndef`
`@compileError`
`@embedFile`
`@export`
`@fieldParentPtr`
`@hasDecl`
`@hasField`
`@import`
`@unionInit`
closes #3384
Diffstat (limited to 'src/ir.cpp')
| -rw-r--r-- | src/ir.cpp | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/src/ir.cpp b/src/ir.cpp index 0e6153ebcd..8fecbf7a18 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -13122,7 +13122,6 @@ static bool ir_resolve_float_mode(IrAnalyze *ira, IrInstruction *value, FloatMod return true; } - static Buf *ir_resolve_str(IrAnalyze *ira, IrInstruction *value) { if (type_is_invalid(value->value.type)) return nullptr; @@ -13143,11 +13142,11 @@ static Buf *ir_resolve_str(IrAnalyze *ira, IrInstruction *value) { assert(ptr_field->data.x_ptr.special == ConstPtrSpecialBaseArray); ConstExprValue *array_val = ptr_field->data.x_ptr.data.base_array.array_val; - if (array_val->data.x_array.special == ConstArraySpecialBuf) { - return array_val->data.x_array.data.s_buf; - } expand_undef_array(ira->codegen, array_val); size_t len = bigint_as_usize(&len_field->data.x_bigint); + if (array_val->data.x_array.special == ConstArraySpecialBuf && len == buf_len(array_val->data.x_array.data.s_buf)) { + return array_val->data.x_array.data.s_buf; + } Buf *result = buf_alloc(); buf_resize(result, len); for (size_t i = 0; i < len; i += 1) { |
