[Bug c++/87292] Warnings with Bit Fields
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87292 Eric Gallager changed: What|Removed |Added See Also||https://gcc.gnu.org/bugzill ||a/show_bug.cgi?id=39170 --- Comment #7 from Eric Gallager --- Besides bug 61414 this bug also reminds me of bug 39170
[Bug c++/87292] Warnings with Bit Fields
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87292 Jonathan Wakely changed: What|Removed |Added Status|UNCONFIRMED |NEW Last reconfirmed||2018-09-13 Ever confirmed|0 |1 --- Comment #6 from Jonathan Wakely --- (In reply to Nuno Gonçalves from comment #4) > I found that the issue with enum have been extensively debated at #61414. > Sorry. Yes, we already have Bug 61414 for that. > So actually this bug report is only regarding the warning with initializer > list: > > struct{ > uint8_t c1:6; > uint8_t c2:6; > } a; > auto c = {a.c1, a.c2}; //warning: narrowing conversion of '(unsigned > char)c1' from 'unsigned char' to 'unsigned char:6' [-Wnarrowing] Confirmed. The initializers should be promoted before deciding the type of the std::initializer_list. This should compile: #include struct { int c1 : 6; int c2 : 6; } a; auto c = { a.c1, a.c2 }; std::initializer_list& r = c; n.cc:7:14: warning: narrowing conversion of '(int)a.::c1' from 'int' to 'signed char:6' [-Wnarrowing] 7 | auto c = { a.c1, a.c2 }; |~~^~ n.cc:7:14: warning: narrowing conversion of 'a.::c1' from 'int' to 'signed char:6' [-Wnarrowing] n.cc:7:20: warning: narrowing conversion of '(int)a.::c2' from 'int' to 'signed char:6' [-Wnarrowing] 7 | auto c = { a.c1, a.c2 }; | ~~^~ n.cc:7:20: warning: narrowing conversion of 'a.::c2' from 'int' to 'signed char:6' [-Wnarrowing] n.cc:8:33: error: invalid initialization of reference of type 'std::initializer_list&' from expression of type 'std::initializer_list' 8 | std::initializer_list& r = c; |
[Bug c++/87292] Warnings with Bit Fields
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87292 --- Comment #5 from Jonathan Wakely --- (In reply to Andrew Pinski from comment #1) > I think the second is correct but I dont know the exact rules about enum > classes; are they unsigned by default? No, the default underlying type is 'int'
[Bug c++/87292] Warnings with Bit Fields
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87292 --- Comment #4 from Nuno Gonçalves --- I found that the issue with enum have been extensively debated at #61414. Sorry. So actually this bug report is only regarding the warning with initializer list: struct{ uint8_t c1:6; uint8_t c2:6; } a; auto c = {a.c1, a.c2}; //warning: narrowing conversion of '(unsigned char)c1' from 'unsigned char' to 'unsigned char:6' [-Wnarrowing]
[Bug c++/87292] Warnings with Bit Fields
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87292 --- Comment #3 from Nuno Gonçalves --- Also to add, this could be suppressed if enum class Bool : bool{False=0, True=1}; So a better example is for a 2 bit BitField: enum class Nr : uint8_t{Zero=0, One=1, Two=2, Three=3}; struct{ Nr v:2; } b;
[Bug c++/87292] Warnings with Bit Fields
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87292 --- Comment #2 from Nuno Gonçalves --- Not the case since, same warning if: enum class Bool : uint8_t {False=0, True=1}
[Bug c++/87292] Warnings with Bit Fields
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87292 --- Comment #1 from Andrew Pinski --- I think the second is correct but I dont know the exact rules about enum classes; are they unsigned by default? I know normal emuns are signed by default.