浏览代码

[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.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@247651 91177308-0d34-0410-b5e6-96231b3b80d8
David Majnemer 10 年之前
父节点
当前提交
f4a9596475
共有 2 个文件被更改,包括 9 次插入6 次删除
  1. 7 4
      lib/Sema/SemaDecl.cpp
  2. 2 2
      test/SemaCXX/ms_wide_bitfield.cpp

+ 7 - 4
lib/Sema/SemaDecl.cpp

@@ -12626,11 +12626,14 @@ ExprResult Sema::VerifyBitField(SourceLocation FieldLoc,
   }
 
   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;

+ 2 - 2
test/SemaCXX/ms_wide_bitfield.cpp

@@ -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];