From 7f5d76fb976770ec90deaf562ba7cf566bf9b0be Mon Sep 17 00:00:00 2001
From: Paolo Carlini <paolo.carlini@oracle.com>
Date: Fri, 24 May 2013 17:37:41 +0000
Subject: [PATCH] re PR c++/19618 (Do warn if a bit-field exceeds the size of a
 bool type)

/cp
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.

From-SVN: r199306
---
 gcc/cp/ChangeLog                       |  6 ++++++
 gcc/cp/class.c                         |  9 ++++++---
 gcc/testsuite/ChangeLog                |  5 +++++
 gcc/testsuite/g++.dg/expr/bitfield12.C | 19 +++++++++++++++++++
 4 files changed, 36 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/expr/bitfield12.C

diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 585ab73bf408..7b02b8b3b5b8 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 94ae5672548e..d6684cfd68b4 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8c2e2939561d..a0278d5fe330 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 000000000000..3ae88ca191c1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/expr/bitfield12.C
@@ -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__;
+};
-- 
GitLab