authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-19 15:58:31-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-08-19 15:58:31-04:00
logd067a037cce906d600851e9b88df251451f9a93e
treea56800c1e0da481102a8f846186744af8b1731e1
parent44fb5275c1babed97a38b4b3c97e59740a2a5cc5
signaturelock-open Commit is signed but in an unrecognized format.

fix void array as a local variable initializer

Related: #1767

2 files changed, 15 insertions(+), 2 deletions(-)

src/ir.cpp+10-2
......@@ -13940,8 +13940,7 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp *
1394013940 uint64_t old_array_len = array_type->data.array.len;
1394113941 uint64_t new_array_len;
1394213942
13943 if (mul_u64_overflow(old_array_len, mult_amt, &new_array_len))
13944 {
13943 if (mul_u64_overflow(old_array_len, mult_amt, &new_array_len)) {
1394513944 ir_add_error(ira, &instruction->base, buf_sprintf("operation results in overflow"));
1394613945 return ira->codegen->invalid_instruction;
1394713946 }
......@@ -13956,6 +13955,15 @@ static IrInstruction *ir_analyze_array_mult(IrAnalyze *ira, IrInstructionBinOp *
1395613955 return result;
1395713956 }
1395813957
13958 switch (type_has_one_possible_value(ira->codegen, result->value.type)) {
13959 case OnePossibleValueInvalid:
13960 return ira->codegen->invalid_instruction;
13961 case OnePossibleValueYes:
13962 return result;
13963 case OnePossibleValueNo:
13964 break;
13965 }
13966
1395913967 // TODO optimize the buf case
1396013968 expand_undef_array(ira->codegen, array_val);
1396113969 out_val->data.x_array.data.s_none.elements = create_const_vals(new_array_len);
test/stage1/behavior/void.zig+5
......@@ -33,3 +33,8 @@ test "void optional" {
3333 var x: ?void = {};
3434 expect(x != null);
3535}
36
37test "void array as a local variable initializer" {
38 var x = [_]void{{}} ** 1004;
39 var y = x[0];
40}