authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-21 15:40:02-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2018-09-21 15:45:13-04:00
log9e5cd43e6d2caaaa2226be56c0886d73a200e78b
treedc4ea1a95ed0328c68f4a57db9f54d70ccc561f9
parent0ca12ded2ffbbc6f703d66541481bab5d8cbb2e3
signaturelock-open Commit is signed but in an unrecognized format.

fix comptime string concatenation ignoring slice bounds

closes #1362

2 files changed, 18 insertions(+), 1 deletions(-)

src/ir.cpp+4-1
......@@ -12399,7 +12399,8 @@ static ZigType *ir_analyze_array_cat(IrAnalyze *ira, IrInstructionBinOp *instruc
1239912399 assert(ptr_val->data.x_ptr.special == ConstPtrSpecialBaseArray);
1240012400 op1_array_val = ptr_val->data.x_ptr.data.base_array.array_val;
1240112401 op1_array_index = ptr_val->data.x_ptr.data.base_array.elem_index;
12402 op1_array_end = op1_array_val->type->data.array.len;
12402 ConstExprValue *len_val = &op1_val->data.x_struct.fields[slice_len_index];
12403 op1_array_end = bigint_as_unsigned(&len_val->data.x_bigint);
1240312404 } else {
1240412405 ir_add_error(ira, op1,
1240512406 buf_sprintf("expected array or C string literal, found '%s'", buf_ptr(&op1->value.type->name)));
......@@ -12446,6 +12447,8 @@ static ZigType *ir_analyze_array_cat(IrAnalyze *ira, IrInstructionBinOp *instruc
1244612447 op2_array_val = ptr_val->data.x_ptr.data.base_array.array_val;
1244712448 op2_array_index = ptr_val->data.x_ptr.data.base_array.elem_index;
1244812449 op2_array_end = op2_array_val->type->data.array.len;
12450 ConstExprValue *len_val = &op2_val->data.x_struct.fields[slice_len_index];
12451 op2_array_end = bigint_as_unsigned(&len_val->data.x_bigint);
1244912452 } else {
1245012453 ir_add_error(ira, op2,
1245112454 buf_sprintf("expected array or C string literal, found '%s'", buf_ptr(&op2->value.type->name)));
test/cases/eval.zig+14
......@@ -723,3 +723,17 @@ test "comptime pointer cast array and then slice" {
723723 assert(sliceA[1] == 2);
724724 assert(sliceB[1] == 2);
725725}
726
727test "slice bounds in comptime concatenation" {
728 const bs = comptime blk: {
729 const b = c"11";
730 break :blk b[0..1];
731 };
732 const str = "" ++ bs;
733 assert(str.len == 1);
734 assert(std.mem.eql(u8, str, "1"));
735
736 const str2 = bs ++ "";
737 assert(str2.len == 1);
738 assert(std.mem.eql(u8, str2, "1"));
739}