| ... | ... | @@ -272,8 +272,8 @@ static bool value_cmp_numeric_val_all(ZigValue *left, Cmp predicate, ZigValue *r |
| 272 | 272 | static void memoize_field_init_val(CodeGen *codegen, ZigType *container_type, TypeStructField *field); |
| 273 | 273 | static void value_to_bigfloat(BigFloat *out, ZigValue *val); |
| 274 | 274 | |
| 275 | | static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigValue *val); |
| 276 | | static Error ir_resolve_lazy_recurse_array(IrAnalyze *ira, AstNode *source_node, ZigValue *val, size_t len); |
| 275 | static Error ir_resolve_lazy_recurse(AstNode *source_node, ZigValue *val); |
| 276 | static Error ir_resolve_lazy_recurse_array(AstNode *source_node, ZigValue *val, size_t len); |
| 277 | 277 | |
| 278 | 278 | |
| 279 | 279 | static void ir_assert_impl(bool ok, IrInstGen *source_instruction, char const *file, unsigned int line) { |
| ... | ... | @@ -558,7 +558,10 @@ static ZigValue *const_ptr_pointee_unchecked_no_isf(CodeGen *g, ZigValue *const_ |
| 558 | 558 | case ConstPtrSpecialBaseStruct: { |
| 559 | 559 | ZigValue *struct_val = const_val->data.x_ptr.data.base_struct.struct_val; |
| 560 | 560 | expand_undef_struct(g, struct_val); |
| 561 | | result = struct_val->data.x_struct.fields[const_val->data.x_ptr.data.base_struct.field_index]; |
| 561 | size_t field_index = const_val->data.x_ptr.data.base_struct.field_index; |
| 562 | assert(struct_val->type->id == ZigTypeIdStruct); |
| 563 | assert(!struct_val->type->data.structure.fields[field_index]->is_comptime); |
| 564 | result = struct_val->data.x_struct.fields[field_index]; |
| 562 | 565 | break; |
| 563 | 566 | } |
| 564 | 567 | case ConstPtrSpecialBaseErrorUnionCode: |
| ... | ... | @@ -7022,6 +7025,17 @@ static IrInstGen *ir_analyze_struct_literal_to_struct(IrAnalyze *ira, Scope *sco |
| 7022 | 7025 | buf_sprintf("field '%s' declared here", buf_ptr(src_field->name))); |
| 7023 | 7026 | return ira->codegen->invalid_inst_gen; |
| 7024 | 7027 | } |
| 7028 | if (dst_field->is_comptime) { |
| 7029 | ErrorMsg *msg = ir_add_error_node(ira, source_node, buf_sprintf("field '%s' in struct '%s' is comptime, it cannot be assigned", |
| 7030 | buf_ptr(src_field->name), buf_ptr(&wanted_type->name))); |
| 7031 | if (wanted_type->data.structure.decl_node) { |
| 7032 | add_error_note(ira->codegen, msg, wanted_type->data.structure.decl_node, |
| 7033 | buf_sprintf("struct '%s' declared here", buf_ptr(&wanted_type->name))); |
| 7034 | } |
| 7035 | add_error_note(ira->codegen, msg, src_field->decl_node, |
| 7036 | buf_sprintf("field '%s' declared here", buf_ptr(src_field->name))); |
| 7037 | return ira->codegen->invalid_inst_gen; |
| 7038 | } |
| 7025 | 7039 | |
| 7026 | 7040 | src_assert(src_field->decl_node != nullptr, source_node); |
| 7027 | 7041 | AstNode *existing_assign_node = field_assign_nodes[dst_field->src_index]; |
| ... | ... | @@ -7066,6 +7080,7 @@ static IrInstGen *ir_analyze_struct_literal_to_struct(IrAnalyze *ira, Scope *sco |
| 7066 | 7080 | |
| 7067 | 7081 | // look for a default field value |
| 7068 | 7082 | TypeStructField *field = wanted_type->data.structure.fields[i]; |
| 7083 | assert(!field->is_comptime); // field_assign_nodes[i] should be null for comptime fields |
| 7069 | 7084 | memoize_field_init_val(ira->codegen, wanted_type, field); |
| 7070 | 7085 | if (field->init_val == nullptr) { |
| 7071 | 7086 | ir_add_error_node(ira, source_node, |
| ... | ... | @@ -7101,6 +7116,9 @@ static IrInstGen *ir_analyze_struct_literal_to_struct(IrAnalyze *ira, Scope *sco |
| 7101 | 7116 | |
| 7102 | 7117 | for (size_t i = 0; i < actual_field_count; i += 1) { |
| 7103 | 7118 | TypeStructField *field = wanted_type->data.structure.fields[i]; |
| 7119 | if (field->is_comptime) |
| 7120 | continue; |
| 7121 | |
| 7104 | 7122 | IrInstGen *field_ptr = ir_analyze_struct_field_ptr(ira, scope, source_node, field, result_loc_inst, wanted_type, true); |
| 7105 | 7123 | if (type_is_invalid(field_ptr->value->type)) |
| 7106 | 7124 | return ira->codegen->invalid_inst_gen; |
| ... | ... | @@ -12762,7 +12780,7 @@ static IrInstGen *ir_analyze_fn_call(IrAnalyze *ira, Scope *scope, AstNode *sour |
| 12762 | 12780 | while (scope) { |
| 12763 | 12781 | if (scope->id == ScopeIdVarDecl) { |
| 12764 | 12782 | ScopeVarDecl *var_scope = (ScopeVarDecl *)scope; |
| 12765 | | if ((err = ir_resolve_lazy_recurse(ira, |
| 12783 | if ((err = ir_resolve_lazy_recurse( |
| 12766 | 12784 | var_scope->var->decl_node, |
| 12767 | 12785 | var_scope->var->const_value))) |
| 12768 | 12786 | { |
| ... | ... | @@ -12968,7 +12986,7 @@ static IrInstGen *ir_analyze_fn_call(IrAnalyze *ira, Scope *scope, AstNode *sour |
| 12968 | 12986 | for (size_t i = 0; i < generic_id->param_count; i += 1) { |
| 12969 | 12987 | ZigValue *generic_param = &generic_id->params[i]; |
| 12970 | 12988 | if (generic_param->special != ConstValSpecialRuntime) { |
| 12971 | | if ((err = ir_resolve_lazy_recurse(ira, source_node, generic_param))) { |
| 12989 | if ((err = ir_resolve_lazy_recurse(source_node, generic_param))) { |
| 12972 | 12990 | return ira->codegen->invalid_inst_gen; |
| 12973 | 12991 | } |
| 12974 | 12992 | } |
| ... | ... | @@ -14912,6 +14930,8 @@ static IrInstGen *ir_analyze_struct_field_ptr(IrAnalyze *ira, Scope *scope, AstN |
| 14912 | 14930 | struct_val->data.x_struct.fields = alloc_const_vals_ptrs(ira->codegen, struct_type->data.structure.src_field_count); |
| 14913 | 14931 | struct_val->special = ConstValSpecialStatic; |
| 14914 | 14932 | for (size_t i = 0; i < struct_type->data.structure.src_field_count; i += 1) { |
| 14933 | if (struct_type->data.structure.fields[i]->is_comptime) |
| 14934 | continue; |
| 14915 | 14935 | ZigValue *field_val = struct_val->data.x_struct.fields[i]; |
| 14916 | 14936 | field_val->special = ConstValSpecialUndef; |
| 14917 | 14937 | field_val->type = resolve_struct_field_type(ira->codegen, |
| ... | ... | @@ -18286,7 +18306,9 @@ static ZigValue *get_const_field(IrAnalyze *ira, AstNode *source_node, ZigValue |
| 18286 | 18306 | { |
| 18287 | 18307 | Error err; |
| 18288 | 18308 | ensure_field_index(struct_value->type, name, field_index); |
| 18289 | | ZigValue *val = struct_value->data.x_struct.fields[field_index]; |
| 18309 | TypeStructField *field = struct_value->type->data.structure.fields[field_index]; |
| 18310 | ZigValue *val = field->is_comptime ? field->init_val : |
| 18311 | struct_value->data.x_struct.fields[field_index]; |
| 18290 | 18312 | if ((err = ir_resolve_const_val(ira->codegen, ira->new_irb.exec, source_node, val, UndefBad))) |
| 18291 | 18313 | return nullptr; |
| 18292 | 18314 | return val; |
| ... | ... | @@ -22461,7 +22483,7 @@ static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ZigValue *val) |
| 22461 | 22483 | size_t src_field_count = val->type->data.structure.src_field_count; |
| 22462 | 22484 | for (size_t field_i = 0; field_i < src_field_count; field_i += 1) { |
| 22463 | 22485 | TypeStructField *struct_field = val->type->data.structure.fields[field_i]; |
| 22464 | | if (struct_field->gen_index == SIZE_MAX) |
| 22486 | if (struct_field->gen_index == SIZE_MAX || struct_field->is_comptime) |
| 22465 | 22487 | continue; |
| 22466 | 22488 | ZigValue *field_val = val->data.x_struct.fields[field_i]; |
| 22467 | 22489 | size_t offset = struct_field->offset; |
| ... | ... | @@ -22490,6 +22512,10 @@ static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ZigValue *val) |
| 22490 | 22512 | size_t used_bits = 0; |
| 22491 | 22513 | while (src_i < src_field_count) { |
| 22492 | 22514 | TypeStructField *field = val->type->data.structure.fields[src_i]; |
| 22515 | if (field->is_comptime) { |
| 22516 | src_i += 1; |
| 22517 | continue; |
| 22518 | } |
| 22493 | 22519 | assert(field->gen_index != SIZE_MAX); |
| 22494 | 22520 | if (field->gen_index != gen_i) |
| 22495 | 22521 | break; |
| ... | ... | @@ -22638,9 +22664,11 @@ static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *sou |
| 22638 | 22664 | size_t src_field_count = val->type->data.structure.src_field_count; |
| 22639 | 22665 | val->data.x_struct.fields = alloc_const_vals_ptrs(codegen, src_field_count); |
| 22640 | 22666 | for (size_t field_i = 0; field_i < src_field_count; field_i += 1) { |
| 22667 | TypeStructField *struct_field = val->type->data.structure.fields[field_i]; |
| 22668 | if (struct_field->is_comptime) |
| 22669 | continue; |
| 22641 | 22670 | ZigValue *field_val = val->data.x_struct.fields[field_i]; |
| 22642 | 22671 | field_val->special = ConstValSpecialStatic; |
| 22643 | | TypeStructField *struct_field = val->type->data.structure.fields[field_i]; |
| 22644 | 22672 | field_val->type = struct_field->type_entry; |
| 22645 | 22673 | if (struct_field->gen_index == SIZE_MAX) |
| 22646 | 22674 | continue; |
| ... | ... | @@ -22673,6 +22701,10 @@ static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *sou |
| 22673 | 22701 | uint64_t bit_offset = 0; |
| 22674 | 22702 | while (src_i < src_field_count) { |
| 22675 | 22703 | TypeStructField *field = val->type->data.structure.fields[src_i]; |
| 22704 | if (field->is_comptime) { |
| 22705 | src_i += 1; |
| 22706 | continue; |
| 22707 | } |
| 22676 | 22708 | src_assert(field->gen_index != SIZE_MAX, source_node); |
| 22677 | 22709 | if (field->gen_index != gen_i) |
| 22678 | 22710 | break; |
| ... | ... | @@ -25554,7 +25586,7 @@ static Error ir_resolve_lazy_raw(AstNode *source_node, ZigValue *val) { |
| 25554 | 25586 | zig_unreachable(); |
| 25555 | 25587 | } |
| 25556 | 25588 | |
| 25557 | | static Error ir_resolve_lazy_recurse_array(IrAnalyze *ira, AstNode *source_node, ZigValue *val, size_t len) { |
| 25589 | static Error ir_resolve_lazy_recurse_array(AstNode *source_node, ZigValue *val, size_t len) { |
| 25558 | 25590 | Error err; |
| 25559 | 25591 | switch (val->data.x_array.special) { |
| 25560 | 25592 | case ConstArraySpecialUndef: |
| ... | ... | @@ -25566,24 +25598,19 @@ static Error ir_resolve_lazy_recurse_array(IrAnalyze *ira, AstNode *source_node, |
| 25566 | 25598 | ZigValue *elems = val->data.x_array.data.s_none.elements; |
| 25567 | 25599 | |
| 25568 | 25600 | for (size_t i = 0; i < len; i += 1) { |
| 25569 | | if ((err = ir_resolve_lazy_recurse(ira, source_node, &elems[i]))) |
| 25601 | if ((err = ir_resolve_lazy_recurse(source_node, &elems[i]))) |
| 25570 | 25602 | return err; |
| 25571 | 25603 | } |
| 25572 | 25604 | |
| 25573 | 25605 | return ErrorNone; |
| 25574 | 25606 | } |
| 25575 | 25607 | |
| 25576 | | static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigValue *val) { |
| 25608 | static Error ir_resolve_lazy_recurse(AstNode *source_node, ZigValue *val) { |
| 25577 | 25609 | Error err; |
| 25578 | 25610 | if ((err = ir_resolve_lazy_raw(source_node, val))) |
| 25579 | 25611 | return err; |
| 25580 | | if (val->special == ConstValSpecialRuntime) { |
| 25581 | | // This shouldn't be possible, it indicates an ICE. |
| 25582 | | // NO_COMMIT |
| 25583 | | ir_add_error_node(ira, source_node, |
| 25584 | | buf_sprintf("This is a bug in the Zig compiler. Runtime value found in comptime known value.")); |
| 25585 | | return ErrorSemanticAnalyzeFail; |
| 25586 | | } |
| 25612 | assert(val->special != ConstValSpecialRuntime); |
| 25613 | assert(val->special != ConstValSpecialLazy); |
| 25587 | 25614 | if (val->special != ConstValSpecialStatic) |
| 25588 | 25615 | return ErrorNone; |
| 25589 | 25616 | switch (val->type->id) { |
| ... | ... | @@ -25611,12 +25638,12 @@ static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigVa |
| 25611 | 25638 | zig_panic("TODO: ir_resolve_lazy_recurse ZigTypeIdFnFrame"); |
| 25612 | 25639 | case ZigTypeIdUnion: { |
| 25613 | 25640 | ConstUnionValue *union_val = &val->data.x_union; |
| 25614 | | return ir_resolve_lazy_recurse(ira, source_node, union_val->payload); |
| 25641 | return ir_resolve_lazy_recurse(source_node, union_val->payload); |
| 25615 | 25642 | } |
| 25616 | 25643 | case ZigTypeIdVector: |
| 25617 | | return ir_resolve_lazy_recurse_array(ira, source_node, val, val->type->data.vector.len); |
| 25644 | return ir_resolve_lazy_recurse_array(source_node, val, val->type->data.vector.len); |
| 25618 | 25645 | case ZigTypeIdArray: |
| 25619 | | return ir_resolve_lazy_recurse_array(ira, source_node, val, val->type->data.array.len); |
| 25646 | return ir_resolve_lazy_recurse_array(source_node, val, val->type->data.array.len); |
| 25620 | 25647 | case ZigTypeIdStruct: |
| 25621 | 25648 | for (size_t i = 0; i < val->type->data.structure.src_field_count; i += 1) { |
| 25622 | 25649 | ZigValue *field = val->data.x_struct.fields[i]; |
| ... | ... | @@ -25625,7 +25652,7 @@ static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigVa |
| 25625 | 25652 | // they are not part of the value. |
| 25626 | 25653 | continue; |
| 25627 | 25654 | } |
| 25628 | | if ((err = ir_resolve_lazy_recurse(ira, source_node, field))) |
| 25655 | if ((err = ir_resolve_lazy_recurse(source_node, field))) |
| 25629 | 25656 | return err; |
| 25630 | 25657 | } |
| 25631 | 25658 | return ErrorNone; |
| ... | ... | @@ -25635,13 +25662,13 @@ static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigVa |
| 25635 | 25662 | if (val->data.x_optional == nullptr) |
| 25636 | 25663 | return ErrorNone; |
| 25637 | 25664 | |
| 25638 | | return ir_resolve_lazy_recurse(ira, source_node, val->data.x_optional); |
| 25665 | return ir_resolve_lazy_recurse(source_node, val->data.x_optional); |
| 25639 | 25666 | case ZigTypeIdErrorUnion: { |
| 25640 | 25667 | bool is_err = val->data.x_err_union.error_set->data.x_err_set != nullptr; |
| 25641 | 25668 | if (is_err) { |
| 25642 | | return ir_resolve_lazy_recurse(ira, source_node, val->data.x_err_union.error_set); |
| 25669 | return ir_resolve_lazy_recurse(source_node, val->data.x_err_union.error_set); |
| 25643 | 25670 | } else { |
| 25644 | | return ir_resolve_lazy_recurse(ira, source_node, val->data.x_err_union.payload); |
| 25671 | return ir_resolve_lazy_recurse(source_node, val->data.x_err_union.payload); |
| 25645 | 25672 | } |
| 25646 | 25673 | } |
| 25647 | 25674 | } |