rnk added a comment.

In https://reviews.llvm.org/D24289#598169, @rsmith wrote:

> This is causing warnings to fire for headers shared between C and C++, where 
> the "give the enum an unsigned underlying type" advice doesn't work, and 
> where the code in question will never be built for the MS ABI. It seems 
> really hard to justify this being on by default.
>
> I'm going to turn it off by default for now, but we should probably consider 
> turning it back on by default when targeting the MS ABI (as a "your code is 
> wrong" warning rather than a "your code is not portable" warning).


Seems reasonable. I asked to make it off by default, but got argued down to 
putting it under -Wall.

> Yeah, suggesting adding an underlying type to the enum to solve this problem 
> seems like a bad idea, since that fundamentally changes the nature of the 
> enum -- typically allowing it to store a lot more values, and making putting 
> it in a bitfield a bad idea.

Any time you use a bitfield it stores fewer values than the original integer 
type. I don't see how enums are special here. Even if I can store values in the 
enum not representable as a bitwise combination of enumerators, people usually 
don't, and adding an underlying type doesn't change the conventions of normal 
C++ code.

Do you have any better suggestions for people that want this code to do the 
right thing when built with MSVC?

  enum E /* : unsigned */ { E0, E1, E2, E3 };
  struct A { E b : 2; };
  int main() {
    A a;
    a.b = E3;
    return a.b; // comes out as -1 without the underlying type
  }

Widening the bitfield wastes a bit. Making the bitfield a plain integer and 
cast in and out of the enum type, but that obscures the true type of the 
bitfield. So, I still support this suggestion.


Repository:
  rL LLVM

https://reviews.llvm.org/D24289



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to