From be94299666e57486be6bdb8fee2b79dbf3623c5d Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 29 Aug 2017 15:19:15 -0400 Subject: prevent implicitly increasing pointer alignment See #37 --- src/analyze.cpp | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'src/analyze.cpp') diff --git a/src/analyze.cpp b/src/analyze.cpp index c6e0c28b90..69a50253d2 100644 --- a/src/analyze.cpp +++ b/src/analyze.cpp @@ -2615,25 +2615,30 @@ bool types_match_const_cast_only(TypeTableEntry *expected_type, TypeTableEntry * (!actual_type->data.pointer.is_const || expected_type->data.pointer.is_const) && (!actual_type->data.pointer.is_volatile || expected_type->data.pointer.is_volatile) && actual_type->data.pointer.bit_offset == expected_type->data.pointer.bit_offset && - actual_type->data.pointer.unaligned_bit_count == expected_type->data.pointer.unaligned_bit_count) + actual_type->data.pointer.unaligned_bit_count == expected_type->data.pointer.unaligned_bit_count && + actual_type->data.pointer.alignment >= expected_type->data.pointer.alignment) { return types_match_const_cast_only(expected_type->data.pointer.child_type, actual_type->data.pointer.child_type); } - // unknown size array const + // slice const if (expected_type->id == TypeTableEntryIdStruct && actual_type->id == TypeTableEntryIdStruct && expected_type->data.structure.is_slice && - actual_type->data.structure.is_slice && - (!actual_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_const || - expected_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_const) && - (!actual_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_volatile || - expected_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.is_volatile)) + actual_type->data.structure.is_slice) { - return types_match_const_cast_only( - expected_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.child_type, - actual_type->data.structure.fields[slice_ptr_index].type_entry->data.pointer.child_type); + TypeTableEntry *actual_ptr_type = actual_type->data.structure.fields[slice_ptr_index].type_entry; + TypeTableEntry *expected_ptr_type = expected_type->data.structure.fields[slice_ptr_index].type_entry; + if ((!actual_ptr_type->data.pointer.is_const || expected_ptr_type->data.pointer.is_const) && + (!actual_ptr_type->data.pointer.is_volatile || expected_ptr_type->data.pointer.is_volatile) && + actual_ptr_type->data.pointer.bit_offset == expected_ptr_type->data.pointer.bit_offset && + actual_ptr_type->data.pointer.unaligned_bit_count == expected_ptr_type->data.pointer.unaligned_bit_count && + actual_ptr_type->data.pointer.alignment >= expected_ptr_type->data.pointer.alignment) + { + return types_match_const_cast_only(expected_ptr_type->data.pointer.child_type, + actual_ptr_type->data.pointer.child_type); + } } // maybe -- cgit v1.2.3