From 3666fbd9f9465ba2ae70b178106e5d9e3cea68ca Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 14 Nov 2018 12:23:40 -0500 Subject: [PATCH] ** and ++ operators force comptime on operands closes #1707 --- src/ir.cpp | 9 +++++++-- test/cases/eval.zig | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/ir.cpp b/src/ir.cpp index 0d1cbd04dd..128b53fc2d 100644 --- a/src/ir.cpp +++ b/src/ir.cpp @@ -3182,8 +3182,13 @@ static IrInstruction *ir_gen_block(IrBuilder *irb, Scope *parent_scope, AstNode } static IrInstruction *ir_gen_bin_op_id(IrBuilder *irb, Scope *scope, AstNode *node, IrBinOp op_id) { - IrInstruction *op1 = ir_gen_node(irb, node->data.bin_op_expr.op1, scope); - IrInstruction *op2 = ir_gen_node(irb, node->data.bin_op_expr.op2, scope); + Scope *inner_scope = scope; + if (op_id == IrBinOpArrayCat || op_id == IrBinOpArrayMult) { + inner_scope = create_comptime_scope(irb->codegen, node, scope); + } + + IrInstruction *op1 = ir_gen_node(irb, node->data.bin_op_expr.op1, inner_scope); + IrInstruction *op2 = ir_gen_node(irb, node->data.bin_op_expr.op2, inner_scope); if (op1 == irb->codegen->invalid_instruction || op2 == irb->codegen->invalid_instruction) return irb->codegen->invalid_instruction; diff --git a/test/cases/eval.zig b/test/cases/eval.zig index 408e9b04af..a9eded151e 100644 --- a/test/cases/eval.zig +++ b/test/cases/eval.zig @@ -762,3 +762,21 @@ test "*align(1) u16 is the same as *align(1:0:2) u16" { //assert(*align(:0:2) u16 == *u16); } } + +test "array concatenation forces comptime" { + var a = oneItem(3) ++ oneItem(4); + assert(std.mem.eql(i32, a, []i32{3, 4})); +} + +test "array multiplication forces comptime" { + var a = oneItem(3) ** scalar(2); + assert(std.mem.eql(i32, a, []i32{3, 3})); +} + +fn oneItem(x: i32) [1]i32 { + return []i32{x}; +} + +fn scalar(x: u32) u32 { + return x; +}