| ... | @@ -2615,25 +2615,30 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry * | ... | @@ -2615,25 +2615,30 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry * |
| 2615 | (!actual_type->data.pointer.is_const || expected_type->data.pointer.is_const) && | 2615 | (!actual_type->data.pointer.is_const || expected_type->data.pointer.is_const) && |
| 2616 | (!actual_type->data.pointer.is_volatile || expected_type->data.pointer.is_volatile) && | 2616 | (!actual_type->data.pointer.is_volatile || expected_type->data.pointer.is_volatile) && |
| 2617 | actual_type->data.pointer.bit_offset == expected_type->data.pointer.bit_offset && | 2617 | actual_type->data.pointer.bit_offset == expected_type->data.pointer.bit_offset && |
| 2618 | actual_type->data.pointer.unaligned_bit_count == expected_type->data.pointer.unaligned_bit_count) | 2618 | actual_type->data.pointer.unaligned_bit_count == expected_type->data.pointer.unaligned_bit_count && |
| | 2619 | actual_type->data.pointer.alignment >= expected_type->data.pointer.alignment) |
| 2619 | { | 2620 | { |
| 2620 | return types_match_const_cast_only(expected_type->data.pointer.child_type, | 2621 | return types_match_const_cast_only(expected_type->data.pointer.child_type, |
| 2621 | actual_type->data.pointer.child_type); | 2622 | actual_type->data.pointer.child_type); |
| 2622 | } | 2623 | } |
| 2623 | | 2624 | |
| 2624 | // unknown size array const | 2625 | // slice const |
| 2625 | if (expected_type->id == TypeTableEntryIdStruct && | 2626 | if (expected_type->id == TypeTableEntryIdStruct && |
| 2626 | actual_type->id == TypeTableEntryIdStruct && | 2627 | actual_type->id == TypeTableEntryIdStruct && |
| 2627 | expected_type->data.structure.is_slice && | 2628 | expected_type->data.structure.is_slice && |
| 2628 | actual_type->data.structure.is_slice && | 2629 | actual_type->data.structure.is_slice) |
| 2629 | (!actual_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_const || | | |
| 2630 | expected_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_const) && | | |
| 2631 | (!actual_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_volatile || | | |
| 2632 | expected_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_volatile)) | | |
| 2633 | { | 2630 | { |
| 2634 | return types_match_const_cast_only( | 2631 | TypeTableEntry *actual_ptr_type = actual_type->data.structure.fields[slice_ptr_index].type_entry; |
| 2635 | expected_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.child_type, | 2632 | TypeTableEntry *expected_ptr_type = expected_type->data.structure.fields[slice_ptr_index].type_entry; |
| 2636 | actual_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.child_type); | 2633 | if ((!actual_ptr_type->data.pointer.is_const || expected_ptr_type->data.pointer.is_const) && |
| | 2634 | (!actual_ptr_type->data.pointer.is_volatile || expected_ptr_type->data.pointer.is_volatile) && |
| | 2635 | actual_ptr_type->data.pointer.bit_offset == expected_ptr_type->data.pointer.bit_offset && |
| | 2636 | actual_ptr_type->data.pointer.unaligned_bit_count == expected_ptr_type->data.pointer.unaligned_bit_count && |
| | 2637 | actual_ptr_type->data.pointer.alignment >= expected_ptr_type->data.pointer.alignment) |
| | 2638 | { |
| | 2639 | return types_match_const_cast_only(expected_ptr_type->data.pointer.child_type, |
| | 2640 | actual_ptr_type->data.pointer.child_type); |
| | 2641 | } |
| 2637 | } | 2642 | } |
| 2638 | | 2643 | |
| 2639 | // maybe | 2644 | // maybe |