authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-02-28 15:41:30-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-02-28 15:41:30-05:00
log578dc16910c7fb6c9e3a059915b13fa6609e066f
treeee98f410611cbcabb4434960155879a6e87f6122
parent500dde32d5cf59f5700fb3f69ae6c7a0defd8a93
signature Commit is signed but in an unrecognized format.

fix compiler crash when comptime parsing targets


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

src/analyze.cpp+30-9
......@@ -5401,6 +5401,8 @@ bool generic_fn_type_id_eql(GenericFnTypeId *a, GenericFnTypeId *b) {
54015401
54025402static bool can_mutate_comptime_var_state(ZigValue *value) {
54035403 assert(value != nullptr);
5404 if (value->special == ConstValSpecialUndef)
5405 return false;
54045406 switch (value->type->id) {
54055407 case ZigTypeIdInvalid:
54065408 zig_unreachable();
......@@ -6701,8 +6703,16 @@ bool const_values_equal_ptr(ZigValue *a, ZigValue *b) {
67016703}
67026704
67036705static bool const_values_equal_array(CodeGen *g, ZigValue *a, ZigValue *b, size_t len) {
6704 assert(a->data.x_array.special != ConstArraySpecialUndef);
6705 assert(b->data.x_array.special != ConstArraySpecialUndef);
6706 if (a->data.x_array.special == ConstArraySpecialUndef &&
6707 b->data.x_array.special == ConstArraySpecialUndef)
6708 {
6709 return true;
6710 }
6711 if (a->data.x_array.special == ConstArraySpecialUndef ||
6712 b->data.x_array.special == ConstArraySpecialUndef)
6713 {
6714 return false;
6715 }
67066716 if (a->data.x_array.special == ConstArraySpecialBuf &&
67076717 b->data.x_array.special == ConstArraySpecialBuf)
67086718 {
......@@ -9390,13 +9400,24 @@ void copy_const_val(CodeGen *g, ZigValue *dest, ZigValue *src) {
93909400 dest->data.x_struct.fields[i]->parent.data.p_struct.field_index = i;
93919401 }
93929402 } else if (dest->type->id == ZigTypeIdArray) {
9393 if (dest->data.x_array.special == ConstArraySpecialNone) {
9394 dest->data.x_array.data.s_none.elements = g->pass1_arena->allocate<ZigValue>(dest->type->data.array.len);
9395 for (uint64_t i = 0; i < dest->type->data.array.len; i += 1) {
9396 copy_const_val(g, &dest->data.x_array.data.s_none.elements[i], &src->data.x_array.data.s_none.elements[i]);
9397 dest->data.x_array.data.s_none.elements[i].parent.id = ConstParentIdArray;
9398 dest->data.x_array.data.s_none.elements[i].parent.data.p_array.array_val = dest;
9399 dest->data.x_array.data.s_none.elements[i].parent.data.p_array.elem_index = i;
9403 switch (dest->data.x_array.special) {
9404 case ConstArraySpecialNone: {
9405 dest->data.x_array.data.s_none.elements = g->pass1_arena->allocate<ZigValue>(dest->type->data.array.len);
9406 for (uint64_t i = 0; i < dest->type->data.array.len; i += 1) {
9407 copy_const_val(g, &dest->data.x_array.data.s_none.elements[i], &src->data.x_array.data.s_none.elements[i]);
9408 dest->data.x_array.data.s_none.elements[i].parent.id = ConstParentIdArray;
9409 dest->data.x_array.data.s_none.elements[i].parent.data.p_array.array_val = dest;
9410 dest->data.x_array.data.s_none.elements[i].parent.data.p_array.elem_index = i;
9411 }
9412 break;
9413 }
9414 case ConstArraySpecialUndef: {
9415 // Nothing to copy; the above memcpy did everything we needed.
9416 break;
9417 }
9418 case ConstArraySpecialBuf: {
9419 dest->data.x_array.data.s_buf = buf_create_from_buf(src->data.x_array.data.s_buf);
9420 break;
94009421 }
94019422 }
94029423 } else if (type_has_optional_repr(dest->type) && dest->data.x_optional != nullptr) {