Commit b8815bd3 by Richard Biener Committed by Richard Biener

re PR middle-end/59338 (error: position plus size exceeds size of referenced…

re PR middle-end/59338 (error: position plus size exceeds size of referenced object in BIT_FIELD_REF)

2013-11-29  Richard Biener  <rguenther@suse.de>

	PR middle-end/59338
	* tree-cfg.c (verify_expr): Restrict bounds verification of
	BIT_FIELD_REF arguments to non-aggregate typed base objects.

	* gcc.dg/torture/pr59338.c: New testcase.

From-SVN: r205521
parent b54fc5b7
2013-11-29 Richard Biener <rguenther@suse.de>
PR middle-end/59338
* tree-cfg.c (verify_expr): Restrict bounds verification of
BIT_FIELD_REF arguments to non-aggregate typed base objects.
2013-11-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/59334
* tree-ssa-dce.c (eliminate_unnecessary_stmts): Fix bug
in previous commit.
2013-11-29 Richard Biener <rguenther@suse.de>
PR middle-end/59338
* gcc.dg/torture/pr59338.c: New testcase.
2013-11-29 Jakub Jelinek <jakub@redhat.com>
PR lto/59326
......
/* { dg-do compile } */
typedef enum
{
XYZZY,
} enumType;
typedef struct
{
unsigned char More : 1;
} tResp;
typedef struct
{
enumType QueryType;
union
{
tResp l[0];
} u;
} tQResp;
void test(void)
{
tQResp *qResp = (0);
if (qResp->u.l[0].More == 0)
return;
}
......@@ -2715,17 +2715,6 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
tree t0 = TREE_OPERAND (t, 0);
tree t1 = TREE_OPERAND (t, 1);
tree t2 = TREE_OPERAND (t, 2);
tree t0_type = TREE_TYPE (t0);
unsigned HOST_WIDE_INT t0_size = 0;
if (tree_fits_uhwi_p (TYPE_SIZE (t0_type)))
t0_size = tree_to_uhwi (TYPE_SIZE (t0_type));
else
{
HOST_WIDE_INT t0_max_size = max_int_size_in_bytes (t0_type);
if (t0_max_size > 0)
t0_size = t0_max_size * BITS_PER_UNIT;
}
if (!tree_fits_uhwi_p (t1)
|| !tree_fits_uhwi_p (t2))
{
......@@ -2749,8 +2738,9 @@ verify_expr (tree *tp, int *walk_subtrees, void *data ATTRIBUTE_UNUSED)
"match field size of BIT_FIELD_REF");
return t;
}
if (t0_size != 0
&& tree_to_uhwi (t1) + tree_to_uhwi (t2) > t0_size)
if (!AGGREGATE_TYPE_P (TREE_TYPE (t0))
&& (tree_to_uhwi (t1) + tree_to_uhwi (t2)
> tree_to_uhwi (TYPE_SIZE (TREE_TYPE (t0)))))
{
error ("position plus size exceeds size of referenced object in "
"BIT_FIELD_REF");
......
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