aboutsummaryrefslogtreecommitdiff
path: root/src/check_type.cpp
diff options
context:
space:
mode:
authorAndreas T Jonsson <mail@andreasjonsson.se>2024-05-13 09:44:27 +0200
committerAndreas T Jonsson <mail@andreasjonsson.se>2024-05-13 09:44:27 +0200
commit3e181af4097fe1d4ee76d21843ad7719304b6140 (patch)
treef4f8e9025f839c8b18e7fe8977b9ef19de678dc0 /src/check_type.cpp
parenta9b94f401934612824f05f6abbe28c0da95be9c8 (diff)
parent88528f76133304eeddd2f8046df304e25e6e98b1 (diff)
Merge branch 'netbsd' into netbsd-ci
Diffstat (limited to 'src/check_type.cpp')
-rw-r--r--src/check_type.cpp9
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");
}
}