@@ -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
0 commit comments