| ... | ... | @@ -21786,10 +21786,12 @@ static void ensure_field_index(ZigType *type, const char *field_name, size_t ind |
| 21786 | 21786 | Buf *field_name_buf; |
| 21787 | 21787 | |
| 21788 | 21788 | assert(type != nullptr && !type_is_invalid(type)); |
| 21789 | | // Check for our field by creating a buffer in place then using the comma operator to free it so that we don't |
| 21790 | | // leak memory in debug mode. |
| 21791 | | assert(find_struct_type_field(type, field_name_buf = buf_create_from_str(field_name))->src_index == index && |
| 21792 | | (buf_deinit(field_name_buf), true)); |
| 21789 | field_name_buf = buf_create_from_str(field_name); |
| 21790 | TypeStructField *field = find_struct_type_field(type, field_name_buf); |
| 21791 | buf_deinit(field_name_buf); |
| 21792 | |
| 21793 | if (field == nullptr || field->src_index != index) |
| 21794 | zig_panic("reference to unknown field %s", field_name); |
| 21793 | 21795 | } |
| 21794 | 21796 | |
| 21795 | 21797 | static ZigType *ir_type_info_get_type(IrAnalyze *ira, const char *type_name, ZigType *root) { |
| ... | ... | @@ -22113,7 +22115,7 @@ static ZigValue *create_ptr_like_type_info(IrAnalyze *ira, ZigType *ptr_type_ent |
| 22113 | 22115 | zig_unreachable(); |
| 22114 | 22116 | } |
| 22115 | 22117 | |
| 22116 | | if ((err = type_resolve(ira->codegen, attrs_type->data.pointer.child_type, ResolveStatusAlignmentKnown))) |
| 22118 | if ((err = type_resolve(ira->codegen, attrs_type->data.pointer.child_type, ResolveStatusSizeKnown))) |
| 22117 | 22119 | return nullptr; |
| 22118 | 22120 | |
| 22119 | 22121 | ZigType *type_info_pointer_type = ir_type_info_get_type(ira, "Pointer", nullptr); |
| ... | ... | @@ -22162,11 +22164,10 @@ static ZigValue *create_ptr_like_type_info(IrAnalyze *ira, ZigType *ptr_type_ent |
| 22162 | 22164 | // sentinel: var |
| 22163 | 22165 | ensure_field_index(result->type, "sentinel", 6); |
| 22164 | 22166 | fields[6]->special = ConstValSpecialStatic; |
| 22167 | fields[6]->type = get_optional_type(ira->codegen, attrs_type->data.pointer.child_type); |
| 22165 | 22168 | if (attrs_type->data.pointer.sentinel != nullptr) { |
| 22166 | | fields[6]->type = get_optional_type(ira->codegen, attrs_type->data.pointer.child_type); |
| 22167 | 22169 | fields[6]->data.x_optional = attrs_type->data.pointer.sentinel; |
| 22168 | 22170 | } else { |
| 22169 | | fields[6]->type = ira->codegen->builtin_types.entry_null; |
| 22170 | 22171 | fields[6]->data.x_optional = nullptr; |
| 22171 | 22172 | } |
| 22172 | 22173 | |
| ... | ... | @@ -22814,13 +22815,20 @@ static Error get_const_field_sentinel(IrAnalyze *ira, IrInstruction *source_inst |
| 22814 | 22815 | ZigValue *field_val = get_const_field(ira, source_instr->source_node, struct_value, name, field_index); |
| 22815 | 22816 | if (field_val == nullptr) |
| 22816 | 22817 | return ErrorSemanticAnalyzeFail; |
| 22818 | |
| 22817 | 22819 | IrInstruction *field_inst = ir_const(ira, source_instr, field_val->type); |
| 22818 | 22820 | IrInstruction *casted_field_inst = ir_implicit_cast(ira, field_inst, |
| 22819 | 22821 | get_optional_type(ira->codegen, elem_type)); |
| 22820 | 22822 | if (type_is_invalid(casted_field_inst->value->type)) |
| 22821 | 22823 | return ErrorSemanticAnalyzeFail; |
| 22822 | 22824 | |
| 22823 | | *result = casted_field_inst->value->data.x_optional; |
| 22825 | if (optional_value_is_null(casted_field_inst->value)) { |
| 22826 | *result = nullptr; |
| 22827 | } else { |
| 22828 | assert(type_has_optional_repr(casted_field_inst->value->type)); |
| 22829 | *result = casted_field_inst->value->data.x_optional; |
| 22830 | } |
| 22831 | |
| 22824 | 22832 | return ErrorNone; |
| 22825 | 22833 | } |
| 22826 | 22834 | |