On Wednesday, 17 November 2021 09:12:55 CET Kalle Valo wrote: > > https://www.kernel.org/doc/html/v5.15/process/coding-style.html#using-bool [...] > > Yeah, I have been worried about this as well and we should fix this. But > instead of u8 I would prefer to use bool like mt76 uses: [...] > I didn't even know using bool is legal until I saw it in mt76. Interesting, I was also not aware of it. And it also seems to have some interesting implications when assigning values to it (example 4): #include <stdbool.h> #include <stdint.h> #include <stdio.h> struct test { uint8_t u:1; uint8_t u2:1; bool b:1; bool b2:1; }; int main(void) { struct test x; x.u = false; x.b = false; printf("u %u b %u\n", x.u, x.b); x.u = true; x.b = true; printf("u %u b %u\n", x.u, x.b); x.u = 0; x.b = 0; printf("u %u b %u\n", x.u, x.b); x.u = 8; x.b = 8; printf("u %u b %u\n", x.u, x.b); return 0; } Result: u 0 b 0 u 1 b 1 u 0 b 0 u 0 b 1 The last example is basically the reason we see stuff like boolean_like_value = !!(some_retrieved_value); when using unsigned bitfields instead of bool (bitfields). And the memory layout (on x86-64): $ pahole test.o struct test { uint8_t u:1; /* 0: 0 1 */ uint8_t u2:1; /* 0: 1 1 */ _Bool b:1; /* 0: 2 1 */ _Bool b2:1; /* 0: 3 1 */ /* size: 1, cachelines: 1, members: 4 */ /* bit_padding: 4 bits */ /* last cacheline: 1 bytes */ }; To my surprise, it was already mentioned in one of the discussions [1]. Was there anything in the discussion which I might have missed and is a good reason to not use "bool ...:1" in structs? Kind regards, Sven [1] https://lore.kernel.org/all/CA+55aFwVZk1OfB9T2v014PTAKFhtVan_Zj2dOjnCy3x6E4UJfA@xxxxxxxxxxxxxx/T/#u
Attachment:
signature.asc
Description: This is a digitally signed message part.