diff options
| author | Andreas T Jonsson <mail@andreasjonsson.se> | 2024-05-13 09:21:32 +0200 |
|---|---|---|
| committer | Andreas T Jonsson <mail@andreasjonsson.se> | 2024-05-13 09:21:32 +0200 |
| commit | 5d82f0cad5e0500d577bb03e1c175716d4d8b995 (patch) | |
| tree | 86b4662246c85cfa2a58ee22d101cc8ffc14df54 /src/check_type.cpp | |
| parent | f428e30211c3113ac7c7918f9a0f5c03cc7b4669 (diff) | |
| parent | 1183f4794b5bd3f1afddbb351c941a8a617a085f (diff) | |
Merge branch 'master' into netbsd
Diffstat (limited to 'src/check_type.cpp')
| -rw-r--r-- | src/check_type.cpp | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/check_type.cpp b/src/check_type.cpp index 11e332757..4df0c5d19 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -1133,18 +1133,21 @@ gb_internal void check_bit_field_type(CheckerContext *ctx, Type *bit_field_type, return Endian_Native; }; - EndianKind backing_type_endian_kind = determine_endian_kind(core_array_type(backing_type)); + Type *backing_type_elem = core_array_type(backing_type); + i64 backing_type_elem_size = type_size_of(backing_type_elem); + EndianKind backing_type_endian_kind = determine_endian_kind(backing_type_elem); EndianKind endian_kind = Endian_Unknown; for (Entity *f : fields) { EndianKind field_kind = determine_endian_kind(f->type); + i64 field_size = type_size_of(f->type); - if (field_kind && backing_type_endian_kind != field_kind) { + if (field_kind && backing_type_endian_kind != field_kind && field_size > 1 && backing_type_elem_size > 1) { error(f->token, "All 'bit_field' field types must match the same endian kind as the backing type, i.e. all native, all little, or all big"); } if (endian_kind == Endian_Unknown) { endian_kind = field_kind; - } else if (field_kind && endian_kind != field_kind) { + } else if (field_kind && endian_kind != field_kind && field_size > 1) { error(f->token, "All 'bit_field' field types must be of the same endian variety, i.e. all native, all little, or all big"); } } |