r247651 - [MS ABI] Overwide bool bitfields should be permitted

David Majnemer via cfe-commits cfe-commits at lists.llvm.org
Mon Sep 14 18:00:55 PDT 2015


Author: majnemer
Date: Mon Sep 14 20:00:55 2015
New Revision: 247651

URL: http://llvm.org/viewvc/llvm-project?rev=247651&view=rev
Log:
[MS ABI] Overwide bool bitfields should be permitted

Overwide bool bitfields have eight bits of storage size, make sure we
take the padding into account when determining whether or not they are
problematic.

Modified:
    cfe/trunk/lib/Sema/SemaDecl.cpp
    cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp

Modified: cfe/trunk/lib/Sema/SemaDecl.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=247651&r1=247650&r2=247651&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaDecl.cpp (original)
+++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Sep 14 20:00:55 2015
@@ -12626,11 +12626,14 @@ ExprResult Sema::VerifyBitField(SourceLo
   }
 
   if (!FieldTy->isDependentType()) {
-    uint64_t TypeWidth = Context.getIntWidth(FieldTy);
+    bool UseMSBitfieldSemantics =
+        IsMsStruct || Context.getTargetInfo().getCXXABI().isMicrosoft();
+    bool UseStorageSize = getLangOpts().CPlusPlus && UseMSBitfieldSemantics;
+    uint64_t TypeWidth = UseStorageSize ? Context.getTypeSize(FieldTy)
+                                        : Context.getIntWidth(FieldTy);
     if (Value.ugt(TypeWidth)) {
-      if (!getLangOpts().CPlusPlus || IsMsStruct ||
-          Context.getTargetInfo().getCXXABI().isMicrosoft()) {
-        if (FieldName) 
+      if (!getLangOpts().CPlusPlus || UseMSBitfieldSemantics) {
+        if (FieldName)
           return Diag(FieldLoc, diag::err_bitfield_width_exceeds_type_width)
             << FieldName << (unsigned)Value.getZExtValue() 
             << (unsigned)TypeWidth;

Modified: cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp?rev=247651&r1=247650&r2=247651&view=diff
==============================================================================
--- cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp (original)
+++ cfe/trunk/test/SemaCXX/ms_wide_bitfield.cpp Mon Sep 14 20:00:55 2015
@@ -3,8 +3,8 @@
 struct A {
   char a : 9; // expected-error{{width of bit-field 'a' (9 bits) exceeds width of its type (8 bits)}}
   int b : 33; // expected-error{{width of bit-field 'b' (33 bits) exceeds width of its type (32 bits)}}
-  bool c : 9; // expected-error{{width of bit-field 'c' (9 bits) exceeds width of its type (1 bit)}}
-  bool d : 3; // expected-error{{width of bit-field 'd' (3 bits) exceeds width of its type (1 bit)}}
+  bool c : 9; // expected-error{{width of bit-field 'c' (9 bits) exceeds width of its type (8 bits)}}
+  bool d : 3;
 };
 
 int a[sizeof(A) == 1 ? 1 : -1];




More information about the cfe-commits mailing list