| ... | ... | @@ -5296,6 +5296,41 @@ bool contains_comptime_undefined_value(ConstExprValue *value) { |
| 5296 | 5296 | switch (value->type->id) { |
| 5297 | 5297 | case TypeTableEntryIdInvalid: |
| 5298 | 5298 | zig_unreachable(); |
| 5299 | |
| 5300 | case TypeTableEntryIdPointer: { |
| 5301 | ConstPtrValue *ptr = &value->data.x_ptr; |
| 5302 | if (ptr->mut == ConstPtrMutRuntimeVar) |
| 5303 | return false; |
| 5304 | |
| 5305 | switch (ptr->special) { |
| 5306 | case ConstPtrSpecialInvalid: |
| 5307 | zig_unreachable(); |
| 5308 | case ConstPtrSpecialRef: |
| 5309 | return contains_comptime_undefined_value(ptr->data.ref.pointee); |
| 5310 | case ConstPtrSpecialBaseArray: { |
| 5311 | size_t index = ptr->data.base_array.elem_index; |
| 5312 | ConstExprValue *arr = ptr->data.base_array.array_val; |
| 5313 | if (arr->special == ConstValSpecialUndef) |
| 5314 | return true; |
| 5315 | if (arr->data.x_array.special == ConstArraySpecialUndef) |
| 5316 | return true; |
| 5317 | |
| 5318 | return contains_comptime_undefined_value(&arr->data.x_array.s_none.elements[index]); |
| 5319 | } |
| 5320 | case ConstPtrSpecialBaseStruct: { |
| 5321 | size_t index = ptr->data.base_struct.field_index; |
| 5322 | ConstExprValue *str = ptr->data.base_struct.struct_val; |
| 5323 | if (str->special == ConstValSpecialUndef) |
| 5324 | return true; |
| 5325 | |
| 5326 | return contains_comptime_undefined_value(&str->data.x_struct.fields[index]); |
| 5327 | } |
| 5328 | case ConstPtrSpecialFunction: // TODO: Can a fn ptr have an undefined value? |
| 5329 | case ConstPtrSpecialDiscard: |
| 5330 | case ConstPtrSpecialHardCodedAddr: |
| 5331 | return false; |
| 5332 | } |
| 5333 | } |
| 5299 | 5334 | case TypeTableEntryIdArray: { |
| 5300 | 5335 | ConstArrayValue *arr = &value->data.x_array; |
| 5301 | 5336 | if (arr->special == ConstArraySpecialUndef) |
| ... | ... | @@ -5309,6 +5344,42 @@ bool contains_comptime_undefined_value(ConstExprValue *value) { |
| 5309 | 5344 | } |
| 5310 | 5345 | case TypeTableEntryIdStruct: { |
| 5311 | 5346 | ConstStructValue *str = &value->data.x_struct; |
| 5347 | if (value->type->data.structure.is_slice) { |
| 5348 | ConstExprValue *len = &str->fields[slice_len_index]; |
| 5349 | ConstExprValue *ptr = &str->fields[slice_ptr_index]; |
| 5350 | if (len->special == ConstValSpecialUndef) |
| 5351 | return true; |
| 5352 | if (ptr->special == ConstValSpecialUndef) |
| 5353 | return true; |
| 5354 | |
| 5355 | switch (ptr->data.x_ptr.special) { |
| 5356 | case ConstPtrSpecialRef: |
| 5357 | return contains_comptime_undefined_value(ptr->data.x_ptr.data.ref.pointee); |
| 5358 | case ConstPtrSpecialBaseArray: { |
| 5359 | size_t offset = ptr->data.x_ptr.data.base_array.elem_index; |
| 5360 | ConstExprValue *arr = ptr->data.x_ptr.data.base_array.array_val; |
| 5361 | if (arr->special == ConstValSpecialUndef) |
| 5362 | return true; |
| 5363 | if (arr->data.x_array.special == ConstArraySpecialUndef) |
| 5364 | return true; |
| 5365 | |
| 5366 | uint64_t slice_len = bigint_as_unsigned(&len->data.x_bigint); |
| 5367 | for (size_t i = 0; i < slice_len; ++i) { |
| 5368 | if (contains_comptime_undefined_value(&arr->data.x_array.s_none.elements[i + offset])) |
| 5369 | return true; |
| 5370 | } |
| 5371 | |
| 5372 | return false; |
| 5373 | } |
| 5374 | case ConstPtrSpecialBaseStruct: |
| 5375 | case ConstPtrSpecialInvalid: |
| 5376 | case ConstPtrSpecialFunction: |
| 5377 | case ConstPtrSpecialDiscard: |
| 5378 | case ConstPtrSpecialHardCodedAddr: |
| 5379 | zig_unreachable(); |
| 5380 | } |
| 5381 | } |
| 5382 | |
| 5312 | 5383 | for (size_t i = 0; i < value->type->data.structure.src_field_count; ++i) { |
| 5313 | 5384 | if (contains_comptime_undefined_value(&str->fields[i])) |
| 5314 | 5385 | return true; |
| ... | ... | @@ -5329,7 +5400,6 @@ bool contains_comptime_undefined_value(ConstExprValue *value) { |
| 5329 | 5400 | case TypeTableEntryIdUnion: |
| 5330 | 5401 | return contains_comptime_undefined_value(value->data.x_union.payload); |
| 5331 | 5402 | |
| 5332 | | case TypeTableEntryIdPointer: |
| 5333 | 5403 | case TypeTableEntryIdArgTuple: |
| 5334 | 5404 | case TypeTableEntryIdVoid: |
| 5335 | 5405 | case TypeTableEntryIdBool: |