authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-17 14:23:02-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-03-19 09:53:54-04:00
logc896c5001f55c67ba2379505464f85dcabb3f3f2
tree2fabc69346e9335b8ca7dfb91d5b0c82e316b017
parent0707be8de88823ff943c3fbd7d0035f88d32dd87
signature Commit is signed but in an unrecognized format.

fix slice of string literal having the wrong type


1 files changed, 9 insertions(+), 9 deletions(-)

src/ir.cpp+9-9
......@@ -26261,13 +26261,16 @@ static IrInstGen *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstSrcSlice *i
2626126261 return ira->codegen->invalid_inst_gen;
2626226262 }
2626326263
26264 ZigType *child_array_type = (array_type->id == ZigTypeIdPointer &&
26265 array_type->data.pointer.ptr_len == PtrLenSingle) ? array_type->data.pointer.child_type : array_type;
26266
2626426267 // If start index and end index are both comptime known, then the result type is a pointer to array
2626526268 // not a slice.
2626626269 ZigType *return_type;
2626726270
2626826271 if (value_is_comptime(casted_start->value) &&
2626926272 ((end != nullptr && value_is_comptime(end->value)) ||
26270 (end == nullptr && array_type->id == ZigTypeIdArray)))
26273 (end == nullptr && child_array_type->id == ZigTypeIdArray)))
2627126274 {
2627226275 ZigValue *start_val = ir_resolve_const(ira, casted_start, UndefBad);
2627326276 if (!start_val)
......@@ -26282,10 +26285,11 @@ static IrInstGen *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstSrcSlice *i
2628226285 return ira->codegen->invalid_inst_gen;
2628326286 end_scalar = bigint_as_u64(&end_val->data.x_bigint);
2628426287 } else {
26285 end_scalar = array_type->data.array.len;
26288 end_scalar = child_array_type->data.array.len;
2628626289 }
26287 ZigValue *array_sentinel = (array_type->id == ZigTypeIdArray && end_scalar == array_type->data.array.len)
26288 ? sentinel_val : nullptr;
26290 ZigValue *array_sentinel = (child_array_type->id == ZigTypeIdArray &&
26291 end_scalar == child_array_type->data.array.len)
26292 ? child_array_type->data.array.sentinel : nullptr;
2628926293
2629026294 if (start_scalar > end_scalar) {
2629126295 ir_add_error(ira, &instruction->base.base, buf_sprintf("out of bounds slice"));
......@@ -26318,12 +26322,8 @@ static IrInstGen *ir_analyze_instruction_slice(IrAnalyze *ira, IrInstSrcSlice *i
2631826322 size_t abs_offset;
2631926323 size_t rel_end;
2632026324 bool ptr_is_undef = false;
26321 if (array_type->id == ZigTypeIdArray ||
26322 (array_type->id == ZigTypeIdPointer && array_type->data.pointer.ptr_len == PtrLenSingle))
26323 {
26325 if (child_array_type->id == ZigTypeIdArray) {
2632426326 if (array_type->id == ZigTypeIdPointer) {
26325 ZigType *child_array_type = array_type->data.pointer.child_type;
26326 assert(child_array_type->id == ZigTypeIdArray);
2632726327 parent_ptr = const_ptr_pointee(ira, ira->codegen, ptr_ptr->value, instruction->base.base.source_node);
2632826328 if (parent_ptr == nullptr)
2632926329 return ira->codegen->invalid_inst_gen;