/cp
authorpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 May 2013 17:37:41 +0000 (17:37 +0000)
committerpaolo <paolo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 24 May 2013 17:37:41 +0000 (17:37 +0000)
2013-05-24  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/19618
* class.c (check_bitfield_decl): Warn for bool and enum bitfields
with width exceeding the type.

/testsuite
2013-05-24  Paolo Carlini  <paolo.carlini@oracle.com>

PR c++/19618
* g++.dg/expr/bitfield12.C: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199306 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/expr/bitfield12.C [new file with mode: 0644]

index 585ab73..7b02b8b 100644 (file)
@@ -1,3 +1,9 @@
+2013-05-24  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/19618
+       * class.c (check_bitfield_decl): Warn for bool and enum bitfields
+       with width exceeding the type.
+
 2013-05-24  Jason Merrill  <jason@redhat.com>
 
        PR c++/57391
index 94ae567..d6684cf 100644 (file)
@@ -3140,9 +3140,12 @@ check_bitfield_decl (tree field)
          error ("zero width for bit-field %q+D", field);
          w = error_mark_node;
        }
-      else if (compare_tree_int (w, TYPE_PRECISION (type)) > 0
-              && TREE_CODE (type) != ENUMERAL_TYPE
-              && TREE_CODE (type) != BOOLEAN_TYPE)
+      else if ((TREE_CODE (type) != ENUMERAL_TYPE
+               && TREE_CODE (type) != BOOLEAN_TYPE
+               && compare_tree_int (w, TYPE_PRECISION (type)) > 0)
+              || ((TREE_CODE (type) == ENUMERAL_TYPE
+                   || TREE_CODE (type) == BOOLEAN_TYPE)
+                  && tree_int_cst_lt (TYPE_SIZE (type), w)))
        warning (0, "width of %q+D exceeds its type", field);
       else if (TREE_CODE (type) == ENUMERAL_TYPE
               && (0 > (compare_tree_int
index 8c2e293..a0278d5 100644 (file)
@@ -1,3 +1,8 @@
+2013-05-24  Paolo Carlini  <paolo.carlini@oracle.com>
+
+       PR c++/19618
+       * g++.dg/expr/bitfield12.C: New.
+
 2013-05-24  Jeff Law  <law@redhat.com>
 
        PR tree-optimization/57124
diff --git a/gcc/testsuite/g++.dg/expr/bitfield12.C b/gcc/testsuite/g++.dg/expr/bitfield12.C
new file mode 100644 (file)
index 0000000..3ae88ca
--- /dev/null
@@ -0,0 +1,19 @@
+// PR c++/19618
+
+struct bset1 {
+  bool bit : sizeof(bool) * __CHAR_BIT__ + 1;  // { dg-warning "exceeds" }
+};
+
+enum E {};
+
+struct bset2 {
+  E bit : sizeof(E) * __CHAR_BIT__ + 1;        // { dg-warning "exceeds" }
+};
+
+struct bset3 {
+  bool bit : sizeof(bool) * __CHAR_BIT__;
+};
+
+struct bset4 {
+  E bit : sizeof(E) * __CHAR_BIT__;
+};