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...@@ -12399,7 +12399,8 @@ static ZigType *ir_analyze_array_cat(IrAnalyze *ira, IrInstructionBinOp *instruc
12399 assert(ptr_val->data.x_ptr.special == ConstPtrSpecialBaseArray);12399 assert(ptr_val->data.x_ptr.special == ConstPtrSpecialBaseArray);
12400 op1_array_val = ptr_val->data.x_ptr.data.base_array.array_val;12400 op1_array_val = ptr_val->data.x_ptr.data.base_array.array_val;
12401 op1_array_index = ptr_val->data.x_ptr.data.base_array.elem_index;12401 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);
12403 } else {12404 } else {
12404 ir_add_error(ira, op1,12405 ir_add_error(ira, op1,
12405 buf_sprintf("expected array or C string literal, found '%s'", buf_ptr(&op1->value.type->name)));12406 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...@@ -12446,6 +12447,8 @@ static ZigType *ir_analyze_array_cat(IrAnalyze *ira, IrInstructionBinOp *instruc
12446 op2_array_val = ptr_val->data.x_ptr.data.base_array.array_val;12447 op2_array_val = ptr_val->data.x_ptr.data.base_array.array_val;
12447 op2_array_index = ptr_val->data.x_ptr.data.base_array.elem_index;12448 op2_array_index = ptr_val->data.x_ptr.data.base_array.elem_index;
12448 op2_array_end = op2_array_val->type->data.array.len;12449 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);
12449 } else {12452 } else {
12450 ir_add_error(ira, op2,12453 ir_add_error(ira, op2,
12451 buf_sprintf("expected array or C string literal, found '%s'", buf_ptr(&op2->value.type->name)));12454 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" {...@@ -723,3 +723,17 @@ test "comptime pointer cast array and then slice" {
723 assert(sliceA[1] == 2);723 assert(sliceA[1] == 2);
724 assert(sliceB[1] == 2);724 assert(sliceB[1] == 2);
725}725}
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}