Commit d3ae6c2a by Joseph Myers Committed by Joseph Myers

re PR c/42439 (Linux kernel BUILD_BUG_ON() broke)

	PR c/42439
	* c-decl.c (check_bitfield_type_and_width): Only pedwarn if
	pedantic for bit-field width not an integer constant expression
	but folding to one.

testsuite:
	* gcc.dg/bitfld-19.c, gcc.dg/bitfld-20.c, gcc.dg/bitfld-21.c: New
	tests.

From-SVN: r155526
parent 7417f6c0
2009-12-30 Joseph Myers <joseph@codesourcery.com>
PR c/42439
* c-decl.c (check_bitfield_type_and_width): Only pedwarn if
pedantic for bit-field width not an integer constant expression
but folding to one.
2009-12-30 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/41956
......@@ -4570,14 +4570,26 @@ check_bitfield_type_and_width (tree *type, tree *width, tree orig_name)
/* Detect and ignore out of range field width and process valid
field widths. */
if (!INTEGRAL_TYPE_P (TREE_TYPE (*width))
|| TREE_CODE (*width) != INTEGER_CST)
if (!INTEGRAL_TYPE_P (TREE_TYPE (*width)))
{
error ("bit-field %qs width not an integer constant", name);
*width = integer_one_node;
}
else
{
if (TREE_CODE (*width) != INTEGER_CST)
{
*width = c_fully_fold (*width, false, NULL);
if (TREE_CODE (*width) == INTEGER_CST)
pedwarn (input_location, OPT_pedantic,
"bit-field %qs width not an integer constant expression",
name);
}
if (TREE_CODE (*width) != INTEGER_CST)
{
error ("bit-field %qs width not an integer constant", name);
*width = integer_one_node;
}
constant_expression_warning (*width);
if (tree_int_cst_sgn (*width) < 0)
{
......
2009-12-30 Joseph Myers <joseph@codesourcery.com>
PR c/42439
* gcc.dg/bitfld-19.c, gcc.dg/bitfld-20.c, gcc.dg/bitfld-21.c: New
tests.
2009-12-30 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/41956
......
/* Test for bit-field widths not integer constant expressions but
folding to integer constants: PR 42439. */
/* { dg-do compile } */
/* { dg-options "-O2" } */
void
f (void)
{
const int m = 1;
((void)(sizeof(struct { int i:!!m; })));
}
/* Test for bit-field widths not integer constant expressions but
folding to integer constants: PR 42439. */
/* { dg-do compile } */
/* { dg-options "-O2 -pedantic" } */
void
f (void)
{
const int m = 1;
((void)(sizeof(struct { int i:!!m; }))); /* { dg-warning "not an integer constant expression" } */
}
/* Test for bit-field widths not integer constant expressions but
folding to integer constants: PR 42439. */
/* { dg-do compile } */
/* { dg-options "-O2 -pedantic-errors" } */
void
f (void)
{
const int m = 1;
((void)(sizeof(struct { int i:!!m; }))); /* { dg-error "not an integer constant expression" } */
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment