summaryrefslogtreecommitdiff
path: root/gcc/cp/class.c
diff options
context:
space:
mode:
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2017-06-07 13:41:20 +0000
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>2017-06-07 13:41:20 +0000
commite8c653c68cf10a64732ee53963212d0d8c95f3c2 (patch)
treebf5e6dfe8190f774703697026d6f9fcac7768161 /gcc/cp/class.c
parent5c672d0baa8281f405c68604b3bec98d91da2bab (diff)
downloadgcc-e8c653c68cf10a64732ee53963212d0d8c95f3c2.tar.gz
* class.c (layout_class_type): Restructure overlong-bitfield tpe
search. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@248971 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r--gcc/cp/class.c60
1 files changed, 29 insertions, 31 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 96377cc79ae..227466ec913 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -6426,41 +6426,39 @@ layout_class_type (tree t, tree *virtuals_p)
if (DECL_C_BIT_FIELD (field)
&& tree_int_cst_lt (TYPE_SIZE (type), DECL_SIZE (field)))
{
- unsigned int itk;
- tree integer_type;
bool was_unnamed_p = false;
/* We must allocate the bits as if suitably aligned for the
- longest integer type that fits in this many bits. type
- of the field. Then, we are supposed to use the left over
- bits as additional padding. */
- for (itk = itk_char; itk != itk_none; ++itk)
- if (integer_types[itk] != NULL_TREE
- && (tree_int_cst_lt (size_int (MAX_FIXED_MODE_SIZE),
- TYPE_SIZE (integer_types[itk]))
- || tree_int_cst_lt (DECL_SIZE (field),
- TYPE_SIZE (integer_types[itk]))))
- break;
-
- /* ITK now indicates a type that is too large for the
- field. We have to back up by one to find the largest
- type that fits. */
- do
- {
- --itk;
- integer_type = integer_types[itk];
- } while (itk > 0 && integer_type == NULL_TREE);
+ longest integer type that fits in this many bits. Then,
+ we are supposed to use the left over bits as additional
+ padding. */
+
+ /* Do not pick a type bigger than MAX_FIXED_MODE_SIZE. */
+ tree limit = size_int (MAX_FIXED_MODE_SIZE);
+ if (tree_int_cst_lt (DECL_SIZE (field), limit))
+ limit = DECL_SIZE (field);
+
+ tree integer_type = integer_types[itk_char];
+ for (unsigned itk = itk_char; itk != itk_none; itk++)
+ if (tree next = integer_types[itk])
+ {
+ if (tree_int_cst_lt (limit, TYPE_SIZE (next)))
+ /* Too big, so our current guess is what we want. */
+ break;
+ /* Not bigger than limit, ok */
+ integer_type = next;
+ }
/* Figure out how much additional padding is required. */
- if (tree_int_cst_lt (TYPE_SIZE (integer_type), DECL_SIZE (field)))
- {
- if (TREE_CODE (t) == UNION_TYPE)
- /* In a union, the padding field must have the full width
- of the bit-field; all fields start at offset zero. */
- padding = DECL_SIZE (field);
- else
- padding = size_binop (MINUS_EXPR, DECL_SIZE (field),
- TYPE_SIZE (integer_type));
- }
+ if (TREE_CODE (t) == UNION_TYPE)
+ /* In a union, the padding field must have the full width
+ of the bit-field; all fields start at offset zero. */
+ padding = DECL_SIZE (field);
+ else
+ padding = size_binop (MINUS_EXPR, DECL_SIZE (field),
+ TYPE_SIZE (integer_type));
+
+ if (integer_zerop (padding))
+ padding = NULL_TREE;
/* An unnamed bitfield does not normally affect the
alignment of the containing class on a target where