authorgravatar for spexguy070@gmail.comMartin Wickham <spexguy070@gmail.com> 2021-07-05 19:41:48-05:00
committergravatar for spexguy070@gmail.comMartin Wickham <spexguy070@gmail.com> 2021-07-05 19:41:48-05:00
log149ecdfe1b5149c46a58dffe670b36319983ad7f
tree206a786670fb24584bf11eb3bacbc2f39ab5faa5
parentb3225a755a78502245bc9c7d7419ebeb67201320

Remove debug checks, audit field accesses


3 files changed, 76 insertions(+), 40 deletions(-)

src/stage1/analyze.cpp+15-12
...@@ -5668,14 +5668,6 @@ static uint32_t hash_combine_const_val(uint32_t hash_val, ZigValue *const_val) {...@@ -5668,14 +5668,6 @@ static uint32_t hash_combine_const_val(uint32_t hash_val, ZigValue *const_val) {
5668 if (const_val->special == ConstValSpecialUndef) {5668 if (const_val->special == ConstValSpecialUndef) {
5669 return hash_val;5669 return hash_val;
5670 }5670 }
5671 // if (const_val->special == ConstValSpecialLazy ||
5672 // const_val->special == ConstValSpecialRuntime) {
5673 // // NO_COMMIT verify this is correct
5674 // return hash_combine(hash_val, &const_val);
5675 // }
5676 if (const_val->special != ConstValSpecialStatic) {
5677 fprintf(stderr, "\nInvalid special: %d\n", const_val->special);
5678 }
5679 assert(const_val->special == ConstValSpecialStatic);5671 assert(const_val->special == ConstValSpecialStatic);
5680 hash_val = hash_combine(hash_val, &const_val->type->id);5672 hash_val = hash_combine(hash_val, &const_val->type->id);
5681 switch (const_val->type->id) {5673 switch (const_val->type->id) {
...@@ -5718,13 +5710,13 @@ static uint32_t hash_combine_const_val(uint32_t hash_val, ZigValue *const_val) {...@@ -5718,13 +5710,13 @@ static uint32_t hash_combine_const_val(uint32_t hash_val, ZigValue *const_val) {
5718 case ZigTypeIdStruct: {5710 case ZigTypeIdStruct: {
5719 size_t field_count = const_val->type->data.structure.src_field_count;5711 size_t field_count = const_val->type->data.structure.src_field_count;
5720 for (size_t i = 0; i < field_count; i += 1) {5712 for (size_t i = 0; i < field_count; i += 1) {
5721 ZigValue *field = const_val->data.x_struct.fields[i];
5722 if (const_val->type->data.structure.fields[i]->is_comptime) {5713 if (const_val->type->data.structure.fields[i]->is_comptime) {
5723 // The values of comptime struct fields are part of the5714 // The values of comptime struct fields are part of the
5724 // type, not the value, so they do not participate in equality5715 // type, not the value, so they do not participate in equality
5725 // or hash of comptime values.5716 // or hash of comptime values.
5726 continue;5717 continue;
5727 }5718 }
5719 ZigValue *field = const_val->data.x_struct.fields[i];
5728 hash_val = hash_combine_const_val(hash_val, field);5720 hash_val = hash_combine_const_val(hash_val, field);
5729 }5721 }
5730 return hash_val;5722 return hash_val;
...@@ -6179,7 +6171,8 @@ ZigValue *get_the_one_possible_value(CodeGen *g, ZigType *type_entry) {...@@ -6179,7 +6171,8 @@ ZigValue *get_the_one_possible_value(CodeGen *g, ZigType *type_entry) {
6179 for (size_t i = 0; i < field_count; i += 1) {6171 for (size_t i = 0; i < field_count; i += 1) {
6180 TypeStructField *field = struct_type->data.structure.fields[i];6172 TypeStructField *field = struct_type->data.structure.fields[i];
6181 if (field->is_comptime) {6173 if (field->is_comptime) {
6182 copy_const_val(g, result->data.x_struct.fields[i], field->init_val);6174 // Comptime fields are part of the type, and do not need to
6175 // be initialized.
6183 continue;6176 continue;
6184 }6177 }
6185 ZigType *field_type = resolve_struct_field_type(g, field);6178 ZigType *field_type = resolve_struct_field_type(g, field);
...@@ -7958,6 +7951,13 @@ static void init_const_undefined(CodeGen *g, ZigValue *const_val) {...@@ -7958,6 +7951,13 @@ static void init_const_undefined(CodeGen *g, ZigValue *const_val) {
7958 size_t field_count = wanted_type->data.structure.src_field_count;7951 size_t field_count = wanted_type->data.structure.src_field_count;
7959 const_val->data.x_struct.fields = alloc_const_vals_ptrs(g, field_count);7952 const_val->data.x_struct.fields = alloc_const_vals_ptrs(g, field_count);
7960 for (size_t i = 0; i < field_count; i += 1) {7953 for (size_t i = 0; i < field_count; i += 1) {
7954 TypeStructField *field = wanted_type->data.structure.fields[i];
7955 if (field->is_comptime) {
7956 // Comptime fields are part of the type, and do not need to
7957 // be initialized.
7958 continue;
7959 }
7960
7961 ZigValue *field_val = const_val->data.x_struct.fields[i];7961 ZigValue *field_val = const_val->data.x_struct.fields[i];
7962 field_val->type = resolve_struct_field_type(g, wanted_type->data.structure.fields[i]);7962 field_val->type = resolve_struct_field_type(g, wanted_type->data.structure.fields[i]);
7963 assert(field_val->type);7963 assert(field_val->type);
...@@ -10174,8 +10174,11 @@ static void dump_value_indent(ZigValue *val, int indent) {...@@ -10174,8 +10174,11 @@ static void dump_value_indent(ZigValue *val, int indent) {
10174 for (int j = 0; j < indent; j += 1) {10174 for (int j = 0; j < indent; j += 1) {
10175 fprintf(stderr, " ");10175 fprintf(stderr, " ");
10176 }10176 }
10177 fprintf(stderr, "%s: ", buf_ptr(val->type->data.structure.fields[i]->name));10177 TypeStructField *field = val->type->data.structure.fields[i];
10178 if (val->data.x_struct.fields == nullptr) {10178 fprintf(stderr, "%s: ", buf_ptr(field->name));
10179 if (field->is_comptime) {
10180 fprintf(stderr, "<comptime field>");
10181 } else if (val->data.x_struct.fields == nullptr) {
10179 fprintf(stderr, "<null>\n");10182 fprintf(stderr, "<null>\n");
10180 } else {10183 } else {
10181 dump_value_indent(val->data.x_struct.fields[i], 1);10184 dump_value_indent(val->data.x_struct.fields[i], 1);
src/stage1/codegen.cpp+9-3
...@@ -3778,6 +3778,12 @@ static bool value_is_all_undef(CodeGen *g, ZigValue *const_val) {...@@ -3778,6 +3778,12 @@ static bool value_is_all_undef(CodeGen *g, ZigValue *const_val) {
3778 case ConstValSpecialStatic:3778 case ConstValSpecialStatic:
3779 if (const_val->type->id == ZigTypeIdStruct) {3779 if (const_val->type->id == ZigTypeIdStruct) {
3780 for (size_t i = 0; i < const_val->type->data.structure.src_field_count; i += 1) {3780 for (size_t i = 0; i < const_val->type->data.structure.src_field_count; i += 1) {
3781 TypeStructField *field = const_val->type->data.structure.fields[i];
3782 if (field->is_comptime) {
3783 // Comptime fields are part of the type, may be uninitialized,
3784 // and should not be inspected.
3785 continue;
3786 }
3781 if (!value_is_all_undef(g, const_val->data.x_struct.fields[i]))3787 if (!value_is_all_undef(g, const_val->data.x_struct.fields[i]))
3782 return false;3788 return false;
3783 }3789 }
...@@ -7285,7 +7291,7 @@ static LLVMValueRef pack_const_int(CodeGen *g, LLVMTypeRef big_int_type_ref, Zig...@@ -7285,7 +7291,7 @@ static LLVMValueRef pack_const_int(CodeGen *g, LLVMTypeRef big_int_type_ref, Zig
7285 size_t used_bits = 0;7291 size_t used_bits = 0;
7286 for (size_t i = 0; i < type_entry->data.structure.src_field_count; i += 1) {7292 for (size_t i = 0; i < type_entry->data.structure.src_field_count; i += 1) {
7287 TypeStructField *field = type_entry->data.structure.fields[i];7293 TypeStructField *field = type_entry->data.structure.fields[i];
7288 if (field->gen_index == SIZE_MAX) {7294 if (field->gen_index == SIZE_MAX || field->is_comptime) {
7289 continue;7295 continue;
7290 }7296 }
7291 LLVMValueRef child_val = pack_const_int(g, big_int_type_ref, const_val->data.x_struct.fields[i]);7297 LLVMValueRef child_val = pack_const_int(g, big_int_type_ref, const_val->data.x_struct.fields[i]);
...@@ -7573,7 +7579,7 @@ static LLVMValueRef gen_const_val(CodeGen *g, ZigValue *const_val, const char *n...@@ -7573,7 +7579,7 @@ static LLVMValueRef gen_const_val(CodeGen *g, ZigValue *const_val, const char *n
7573 size_t src_field_index = 0;7579 size_t src_field_index = 0;
7574 while (src_field_index < src_field_count) {7580 while (src_field_index < src_field_count) {
7575 TypeStructField *type_struct_field = type_entry->data.structure.fields[src_field_index];7581 TypeStructField *type_struct_field = type_entry->data.structure.fields[src_field_index];
7576 if (type_struct_field->gen_index == SIZE_MAX) {7582 if (type_struct_field->gen_index == SIZE_MAX || type_struct_field->is_comptime) {
7577 src_field_index += 1;7583 src_field_index += 1;
7578 continue;7584 continue;
7579 }7585 }
...@@ -7642,7 +7648,7 @@ static LLVMValueRef gen_const_val(CodeGen *g, ZigValue *const_val, const char *n...@@ -7642,7 +7648,7 @@ static LLVMValueRef gen_const_val(CodeGen *g, ZigValue *const_val, const char *n
7642 } else {7648 } else {
7643 for (uint32_t i = 0; i < src_field_count; i += 1) {7649 for (uint32_t i = 0; i < src_field_count; i += 1) {
7644 TypeStructField *type_struct_field = type_entry->data.structure.fields[i];7650 TypeStructField *type_struct_field = type_entry->data.structure.fields[i];
7645 if (type_struct_field->gen_index == SIZE_MAX) {7651 if (type_struct_field->gen_index == SIZE_MAX || type_struct_field->is_comptime) {
7646 continue;7652 continue;
7647 }7653 }
7648 ZigValue *field_val = const_val->data.x_struct.fields[i];7654 ZigValue *field_val = const_val->data.x_struct.fields[i];
src/stage1/ir.cpp+52-25
...@@ -272,8 +272,8 @@ static bool value_cmp_numeric_val_all(ZigValue *left, Cmp predicate, ZigValue *r...@@ -272,8 +272,8 @@ static bool value_cmp_numeric_val_all(ZigValue *left, Cmp predicate, ZigValue *r
272static void memoize_field_init_val(CodeGen *codegen, ZigType *container_type, TypeStructField *field);272static void memoize_field_init_val(CodeGen *codegen, ZigType *container_type, TypeStructField *field);
273static void value_to_bigfloat(BigFloat *out, ZigValue *val);273static void value_to_bigfloat(BigFloat *out, ZigValue *val);
274274
275static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigValue *val);275static Error ir_resolve_lazy_recurse(AstNode *source_node, ZigValue *val);
276static Error ir_resolve_lazy_recurse_array(IrAnalyze *ira, AstNode *source_node, ZigValue *val, size_t len);276static Error ir_resolve_lazy_recurse_array(AstNode *source_node, ZigValue *val, size_t len);
277277
278278
279static void ir_assert_impl(bool ok, IrInstGen *source_instruction, char const *file, unsigned int line) {279static 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,7 +558,10 @@ static ZigValue *const_ptr_pointee_unchecked_no_isf(CodeGen *g, ZigValue *const_
558 case ConstPtrSpecialBaseStruct: {558 case ConstPtrSpecialBaseStruct: {
559 ZigValue *struct_val = const_val->data.x_ptr.data.base_struct.struct_val;559 ZigValue *struct_val = const_val->data.x_ptr.data.base_struct.struct_val;
560 expand_undef_struct(g, struct_val);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 break;565 break;
563 }566 }
564 case ConstPtrSpecialBaseErrorUnionCode:567 case ConstPtrSpecialBaseErrorUnionCode:
...@@ -7022,6 +7025,17 @@ static IrInstGen *ir_analyze_struct_literal_to_struct(IrAnalyze *ira, Scope *sco...@@ -7022,6 +7025,17 @@ static IrInstGen *ir_analyze_struct_literal_to_struct(IrAnalyze *ira, Scope *sco
7022 buf_sprintf("field '%s' declared here", buf_ptr(src_field->name)));7025 buf_sprintf("field '%s' declared here", buf_ptr(src_field->name)));
7023 return ira->codegen->invalid_inst_gen;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 }
70257039
7026 src_assert(src_field->decl_node != nullptr, source_node);7040 src_assert(src_field->decl_node != nullptr, source_node);
7027 AstNode *existing_assign_node = field_assign_nodes[dst_field->src_index];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,6 +7080,7 @@ static IrInstGen *ir_analyze_struct_literal_to_struct(IrAnalyze *ira, Scope *sco
70667080
7067 // look for a default field value7081 // look for a default field value
7068 TypeStructField *field = wanted_type->data.structure.fields[i];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 memoize_field_init_val(ira->codegen, wanted_type, field);7084 memoize_field_init_val(ira->codegen, wanted_type, field);
7070 if (field->init_val == nullptr) {7085 if (field->init_val == nullptr) {
7071 ir_add_error_node(ira, source_node,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,6 +7116,9 @@ static IrInstGen *ir_analyze_struct_literal_to_struct(IrAnalyze *ira, Scope *sco
71017116
7102 for (size_t i = 0; i < actual_field_count; i += 1) {7117 for (size_t i = 0; i < actual_field_count; i += 1) {
7103 TypeStructField *field = wanted_type->data.structure.fields[i];7118 TypeStructField *field = wanted_type->data.structure.fields[i];
7119 if (field->is_comptime)
7120 continue;
7121
7104 IrInstGen *field_ptr = ir_analyze_struct_field_ptr(ira, scope, source_node, field, result_loc_inst, wanted_type, true);7122 IrInstGen *field_ptr = ir_analyze_struct_field_ptr(ira, scope, source_node, field, result_loc_inst, wanted_type, true);
7105 if (type_is_invalid(field_ptr->value->type))7123 if (type_is_invalid(field_ptr->value->type))
7106 return ira->codegen->invalid_inst_gen;7124 return ira->codegen->invalid_inst_gen;
...@@ -12762,7 +12780,7 @@ static IrInstGen *ir_analyze_fn_call(IrAnalyze *ira, Scope *scope, AstNode *sour...@@ -12762,7 +12780,7 @@ static IrInstGen *ir_analyze_fn_call(IrAnalyze *ira, Scope *scope, AstNode *sour
12762 while (scope) {12780 while (scope) {
12763 if (scope->id == ScopeIdVarDecl) {12781 if (scope->id == ScopeIdVarDecl) {
12764 ScopeVarDecl *var_scope = (ScopeVarDecl *)scope;12782 ScopeVarDecl *var_scope = (ScopeVarDecl *)scope;
12765 if ((err = ir_resolve_lazy_recurse(ira,12783 if ((err = ir_resolve_lazy_recurse(
12766 var_scope->var->decl_node,12784 var_scope->var->decl_node,
12767 var_scope->var->const_value)))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,7 +12986,7 @@ static IrInstGen *ir_analyze_fn_call(IrAnalyze *ira, Scope *scope, AstNode *sour
12968 for (size_t i = 0; i < generic_id->param_count; i += 1) {12986 for (size_t i = 0; i < generic_id->param_count; i += 1) {
12969 ZigValue *generic_param = &generic_id->params[i];12987 ZigValue *generic_param = &generic_id->params[i];
12970 if (generic_param->special != ConstValSpecialRuntime) {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 return ira->codegen->invalid_inst_gen;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,6 +14930,8 @@ static IrInstGen *ir_analyze_struct_field_ptr(IrAnalyze *ira, Scope *scope, AstN
14912 struct_val->data.x_struct.fields = alloc_const_vals_ptrs(ira->codegen, struct_type->data.structure.src_field_count);14930 struct_val->data.x_struct.fields = alloc_const_vals_ptrs(ira->codegen, struct_type->data.structure.src_field_count);
14913 struct_val->special = ConstValSpecialStatic;14931 struct_val->special = ConstValSpecialStatic;
14914 for (size_t i = 0; i < struct_type->data.structure.src_field_count; i += 1) {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 ZigValue *field_val = struct_val->data.x_struct.fields[i];14935 ZigValue *field_val = struct_val->data.x_struct.fields[i];
14916 field_val->special = ConstValSpecialUndef;14936 field_val->special = ConstValSpecialUndef;
14917 field_val->type = resolve_struct_field_type(ira->codegen,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,7 +18306,9 @@ static ZigValue *get_const_field(IrAnalyze *ira, AstNode *source_node, ZigValue
18286{18306{
18287 Error err;18307 Error err;
18288 ensure_field_index(struct_value->type, name, field_index);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 if ((err = ir_resolve_const_val(ira->codegen, ira->new_irb.exec, source_node, val, UndefBad)))18312 if ((err = ir_resolve_const_val(ira->codegen, ira->new_irb.exec, source_node, val, UndefBad)))
18291 return nullptr;18313 return nullptr;
18292 return val;18314 return val;
...@@ -22461,7 +22483,7 @@ static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ZigValue *val)...@@ -22461,7 +22483,7 @@ static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ZigValue *val)
22461 size_t src_field_count = val->type->data.structure.src_field_count;22483 size_t src_field_count = val->type->data.structure.src_field_count;
22462 for (size_t field_i = 0; field_i < src_field_count; field_i += 1) {22484 for (size_t field_i = 0; field_i < src_field_count; field_i += 1) {
22463 TypeStructField *struct_field = val->type->data.structure.fields[field_i];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 continue;22487 continue;
22466 ZigValue *field_val = val->data.x_struct.fields[field_i];22488 ZigValue *field_val = val->data.x_struct.fields[field_i];
22467 size_t offset = struct_field->offset;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,6 +22512,10 @@ static void buf_write_value_bytes(CodeGen *codegen, uint8_t *buf, ZigValue *val)
22490 size_t used_bits = 0;22512 size_t used_bits = 0;
22491 while (src_i < src_field_count) {22513 while (src_i < src_field_count) {
22492 TypeStructField *field = val->type->data.structure.fields[src_i];22514 TypeStructField *field = val->type->data.structure.fields[src_i];
22515 if (field->is_comptime) {
22516 src_i += 1;
22517 continue;
22518 }
22493 assert(field->gen_index != SIZE_MAX);22519 assert(field->gen_index != SIZE_MAX);
22494 if (field->gen_index != gen_i)22520 if (field->gen_index != gen_i)
22495 break;22521 break;
...@@ -22638,9 +22664,11 @@ static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *sou...@@ -22638,9 +22664,11 @@ static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *sou
22638 size_t src_field_count = val->type->data.structure.src_field_count;22664 size_t src_field_count = val->type->data.structure.src_field_count;
22639 val->data.x_struct.fields = alloc_const_vals_ptrs(codegen, src_field_count);22665 val->data.x_struct.fields = alloc_const_vals_ptrs(codegen, src_field_count);
22640 for (size_t field_i = 0; field_i < src_field_count; field_i += 1) {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 ZigValue *field_val = val->data.x_struct.fields[field_i];22670 ZigValue *field_val = val->data.x_struct.fields[field_i];
22642 field_val->special = ConstValSpecialStatic;22671 field_val->special = ConstValSpecialStatic;
22643 TypeStructField *struct_field = val->type->data.structure.fields[field_i];
22644 field_val->type = struct_field->type_entry;22672 field_val->type = struct_field->type_entry;
22645 if (struct_field->gen_index == SIZE_MAX)22673 if (struct_field->gen_index == SIZE_MAX)
22646 continue;22674 continue;
...@@ -22673,6 +22701,10 @@ static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *sou...@@ -22673,6 +22701,10 @@ static Error buf_read_value_bytes(IrAnalyze *ira, CodeGen *codegen, AstNode *sou
22673 uint64_t bit_offset = 0;22701 uint64_t bit_offset = 0;
22674 while (src_i < src_field_count) {22702 while (src_i < src_field_count) {
22675 TypeStructField *field = val->type->data.structure.fields[src_i];22703 TypeStructField *field = val->type->data.structure.fields[src_i];
22704 if (field->is_comptime) {
22705 src_i += 1;
22706 continue;
22707 }
22676 src_assert(field->gen_index != SIZE_MAX, source_node);22708 src_assert(field->gen_index != SIZE_MAX, source_node);
22677 if (field->gen_index != gen_i)22709 if (field->gen_index != gen_i)
22678 break;22710 break;
...@@ -25554,7 +25586,7 @@ static Error ir_resolve_lazy_raw(AstNode *source_node, ZigValue *val) {...@@ -25554,7 +25586,7 @@ static Error ir_resolve_lazy_raw(AstNode *source_node, ZigValue *val) {
25554 zig_unreachable();25586 zig_unreachable();
25555}25587}
2555625588
25557static Error ir_resolve_lazy_recurse_array(IrAnalyze *ira, AstNode *source_node, ZigValue *val, size_t len) {25589static Error ir_resolve_lazy_recurse_array(AstNode *source_node, ZigValue *val, size_t len) {
25558 Error err;25590 Error err;
25559 switch (val->data.x_array.special) {25591 switch (val->data.x_array.special) {
25560 case ConstArraySpecialUndef:25592 case ConstArraySpecialUndef:
...@@ -25566,24 +25598,19 @@ static Error ir_resolve_lazy_recurse_array(IrAnalyze *ira, AstNode *source_node,...@@ -25566,24 +25598,19 @@ static Error ir_resolve_lazy_recurse_array(IrAnalyze *ira, AstNode *source_node,
25566 ZigValue *elems = val->data.x_array.data.s_none.elements;25598 ZigValue *elems = val->data.x_array.data.s_none.elements;
2556725599
25568 for (size_t i = 0; i < len; i += 1) {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 return err;25602 return err;
25571 }25603 }
2557225604
25573 return ErrorNone;25605 return ErrorNone;
25574}25606}
2557525607
25576static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigValue *val) {25608static Error ir_resolve_lazy_recurse(AstNode *source_node, ZigValue *val) {
25577 Error err;25609 Error err;
25578 if ((err = ir_resolve_lazy_raw(source_node, val))) 25610 if ((err = ir_resolve_lazy_raw(source_node, val)))
25579 return err;25611 return err;
25580 if (val->special == ConstValSpecialRuntime) {25612 assert(val->special != ConstValSpecialRuntime);
25581 // This shouldn't be possible, it indicates an ICE.25613 assert(val->special != ConstValSpecialLazy);
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 }
25587 if (val->special != ConstValSpecialStatic)25614 if (val->special != ConstValSpecialStatic)
25588 return ErrorNone;25615 return ErrorNone;
25589 switch (val->type->id) {25616 switch (val->type->id) {
...@@ -25611,12 +25638,12 @@ static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigVa...@@ -25611,12 +25638,12 @@ static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigVa
25611 zig_panic("TODO: ir_resolve_lazy_recurse ZigTypeIdFnFrame");25638 zig_panic("TODO: ir_resolve_lazy_recurse ZigTypeIdFnFrame");
25612 case ZigTypeIdUnion: {25639 case ZigTypeIdUnion: {
25613 ConstUnionValue *union_val = &val->data.x_union;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 case ZigTypeIdVector: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 case ZigTypeIdArray: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 case ZigTypeIdStruct:25647 case ZigTypeIdStruct:
25621 for (size_t i = 0; i < val->type->data.structure.src_field_count; i += 1) {25648 for (size_t i = 0; i < val->type->data.structure.src_field_count; i += 1) {
25622 ZigValue *field = val->data.x_struct.fields[i];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,7 +25652,7 @@ static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigVa
25625 // they are not part of the value.25652 // they are not part of the value.
25626 continue;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 return err;25656 return err;
25630 }25657 }
25631 return ErrorNone;25658 return ErrorNone;
...@@ -25635,13 +25662,13 @@ static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigVa...@@ -25635,13 +25662,13 @@ static Error ir_resolve_lazy_recurse(IrAnalyze *ira, AstNode *source_node, ZigVa
25635 if (val->data.x_optional == nullptr)25662 if (val->data.x_optional == nullptr)
25636 return ErrorNone;25663 return ErrorNone;
2563725664
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 case ZigTypeIdErrorUnion: {25666 case ZigTypeIdErrorUnion: {
25640 bool is_err = val->data.x_err_union.error_set->data.x_err_set != nullptr;25667 bool is_err = val->data.x_err_union.error_set->data.x_err_set != nullptr;
25641 if (is_err) {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 } else {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 }