On Mon, Oct 16, 2017 at 01:06:04AM +0100, Jonathan Wakely wrote: > On 14 October 2017 at 17:19, Sam van Kampen via gcc <gcc@gcc.gnu.org> wrote: > > On Sat, Oct 14, 2017 at 04:43:33PM +0100, Jonathan Wakely wrote: > >> On 14 October 2017 at 15:50, Sam van Kampen wrote: > >> > Dear maintainers, > >> > > >> > Having come across https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61414 > >> > (bug #61414) quite often myself I decided I wanted to fix it. > >> > > >> > By reading through parts of the GCC internals manual I have > >> > managed to add a warning flag, the code for which I will submit to > >> > gcc-patches, but since this is my first time contributing to GCC I have > >> > some questions. > >> > > >> > 1. When it comes to the patch, should I post it to the bug tracker > >> > before sending it to gcc-patches? > >> > >> No. Patches go to the mailing list, not bugzilla. > >> > >> But you can add the URL of the gcc-patches mail to bugzilla (and then > >> somebody should add the "patch" keyword to the bug). > > > > Noted. > > > >> > 2. A better fix for this bug would be to only warn when the number > >> > of defined enumerators would not fit inside a bitfield of the > >> > specified size. Seeing as I don't know the GCC internals very > >> > well, I'm wondering if anyone could point me in the right > >> > direction when it comes to getting the number of defined > >> > enumerators in an enum type. > >> > >> Why does the number of enumerators make any difference? > > > > I suppose the number of enumerators does not make any difference, but > > rather the enumerator with the highest integer value. For instance, in > > And the lowest value, consider enum X { Y = -200, Z = 5 }; > > > this example: > > > > enum class A { A, B, C; }; > > struct D { A enum_field : 2; }; > > > > the enumerator with the highest integer value is C, with an integer > > value of 2. This enum type therefore fits inside the bit-field in > > But it doesn't, because as I think it says in the bug report, a scoped > enum (i.e. enum class) has a fixed underlying type, and all values of > the underlying type are valid values of the enumeration type. > > enum class A { a, b, c }; > A max = A{std::numeric_limits<std::underlying_type_t<A>>::max()}; > Fair enough, I suppose that is the way they are defined in the standard (and that is the document we have to follow, after all). I wish there was a way of defining scoped enums that have a precision that is lower than eight bits, but it is what it is.
> > struct D, and so the compiler should not emit a warning in my eyes. > > > > Of course, you can cast an integer to an enum type and assign it that > > way, which should probably trigger a warning if the value could be too > > large (it already triggers -Woverflow if the value is a compile-time > > constant). > > As I said in the bug report, PR 51242 comment 27 suggests a more useful > warning. > > Right. On the code: enum class FooEnum {A,B,C,D,E,F}; struct Bar { FooEnum baz:2; }; Bar b; b.baz = FooEnum::F; clang 5.0.0 warns with: warning: implicit truncation from 'FooEnum' to bit-field changes value from 5 to 1 [-Wbitfield-constant-conversion] (when adding -Wbitfield-enum-conversion, clang warns with an error that is similar to the error gcc gives by default, but points at an assignment (whether it fits or not) instead of a declaration) and gcc (trunk) warns with: warning: overflow in conversion from ‘FooEnum’ to ‘signed char:2’ changes value from ‘(FooEnum)5’ to ‘1’ [-Woverflow] Neither compiler warns when a value is assigned that is not known to fit. So what do you propose: 1. Keeping the current warning on declaration and warn if we don't know whether a value fits? 2. Keeping the current warning and warning when we know a value does not fit? 3/4. Dropping the current warning and doing one of the above? In any case, I'll send the flag-only patch to gcc-patches, since that and a discussion on other warnings to add are logically separate changes. > >> > 3. When it comes to documentation and tests, I've documented the > >> > flag in doc/invoke.texi and will add a test in the test suite, > >> > hopefully when the patch includes the check specified in 2. Are > >> > there are any other places I should add documentation? > >> > >> No, that's all. > > > > Thanks. > > > > Sam