aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLemonBoy <LemonBoy@users.noreply.github.com>2020-10-29 19:38:13 +0100
committerGitHub <noreply@github.com>2020-10-29 14:38:13 -0400
commit4fb896f16ebdc9dc6a04a522550524613d467dae (patch)
treef9c1b37c17ff15e81ac25295678c1bd8cb612c55 /src
parent6f3c84834d29e632267438bd6a5d5589b0b074e5 (diff)
downloadzig-4fb896f16ebdc9dc6a04a522550524613d467dae.tar.gz
zig-4fb896f16ebdc9dc6a04a522550524613d467dae.zip
stage1: Fix bug in internal string slicing (#6843)
Closes #6456
Diffstat (limited to 'src')
-rw-r--r--src/stage1/ir.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/stage1/ir.cpp b/src/stage1/ir.cpp
index c1d89444a3..62d466fa88 100644
--- a/src/stage1/ir.cpp
+++ b/src/stage1/ir.cpp
@@ -25975,24 +25975,30 @@ static Error get_const_field_buf(IrAnalyze *ira, AstNode *source_node, ZigValue
ZigValue *ptr = slice->data.x_struct.fields[slice_ptr_index];
ZigValue *len = slice->data.x_struct.fields[slice_len_index];
assert(ptr->data.x_ptr.special == ConstPtrSpecialBaseArray);
- assert(ptr->data.x_ptr.data.base_array.elem_index == 0);
ZigValue *arr = ptr->data.x_ptr.data.base_array.array_val;
assert(arr->special == ConstValSpecialStatic);
+
+ const size_t start_value = ptr->data.x_ptr.data.base_array.elem_index;
+ const size_t len_value = bigint_as_usize(&len->data.x_bigint);
+
switch (arr->data.x_array.special) {
case ConstArraySpecialUndef:
return ErrorSemanticAnalyzeFail;
case ConstArraySpecialNone: {
+ assert(start_value <= arr->type->data.array.len);
+ assert(start_value + len_value <= arr->type->data.array.len);
buf_resize(out, 0);
- size_t count = bigint_as_usize(&len->data.x_bigint);
- for (size_t j = 0; j < count; j++) {
- ZigValue *ch_val = &arr->data.x_array.data.s_none.elements[j];
+ for (size_t j = 0; j < len_value; j++) {
+ ZigValue *ch_val = &arr->data.x_array.data.s_none.elements[start_value + j];
unsigned ch = bigint_as_u32(&ch_val->data.x_bigint);
buf_append_char(out, ch);
}
break;
}
case ConstArraySpecialBuf:
- buf_init_from_buf(out, arr->data.x_array.data.s_buf);
+ assert(start_value <= buf_len(arr->data.x_array.data.s_buf));
+ assert(start_value + len_value <= buf_len(arr->data.x_array.data.s_buf));
+ buf_init_from_mem(out, buf_ptr(arr->data.x_array.data.s_buf) + start_value, len_value);
break;
}
return ErrorNone;