https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51242

Tom Honermann <tom at honermann dot net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |tom at honermann dot net

--- Comment #27 from Tom Honermann <tom at honermann dot net> ---
We got bit by this warning recently.  We compile with -Werror and, without an
option to suppress warnings in the following code, gcc rejects it.  We think
this code should be accepted without a warning given the constant expressions
involved.

Clang does not issue a warning for this code.  However, if an assignment to the
bit-field from a literal '2' (cast to E) is added, then Clang warns on the
assignment itself (as opposed to on the bit-field declaration).  This seems
like a more useful approach.

$ cat t.cpp
enum E : unsigned char {
    e0 = 0,
    e1 = 1
};
struct S {
    E e : 1;
};
void f(S s) {
    s.e = e0;
    s.e = e1;
    s.e = (E)0;
    s.e = (E)1;
};

$ g++ --version
g++ (GCC) 6.1.1 20160531
...

$ g++ -c -std=c++11 -Werror t.cpp
t.cpp:6:11: error: ‘S::e’ is too small to hold all values of ‘enum E’ [-Werror]
     E e : 1;
           ^
cc1plus: all warnings being treated as errors

Reply via email to