re PR middle-end/38422 (union/bitfield causes cc1/cc1plus to run out of memory.)

PR middle-end/38422
	* fold-const.c (fold_unary) <CASE_CONVERT>: Don't convert MULT_EXPR
	operands to mult_type if it isn't narrower than op0's type.

	* gcc.c-torture/execute/pr38422.c: New test.

From-SVN: r142521
This commit is contained in:
Jakub Jelinek 2008-12-06 13:47:15 +01:00 committed by Jakub Jelinek
parent fb7ca5a762
commit b77856544b
4 changed files with 45 additions and 5 deletions

View file

@ -1,3 +1,9 @@
2008-12-06 Jakub Jelinek <jakub@redhat.com>
PR middle-end/38422
* fold-const.c (fold_unary) <CASE_CONVERT>: Don't convert MULT_EXPR
operands to mult_type if it isn't narrower than op0's type.
2008-12-06 Jan Hubicka <jh@suse.cz>
Jakub Jelinek <jakub@redhat.com>

View file

@ -8351,11 +8351,16 @@ fold_unary (enum tree_code code, tree type, tree op0)
mult_type = type;
else
mult_type = unsigned_type_for (type);
tem = fold_build2 (MULT_EXPR, mult_type,
fold_convert (mult_type, TREE_OPERAND (op0, 0)),
fold_convert (mult_type, TREE_OPERAND (op0, 1)));
return fold_convert (type, tem);
if (TYPE_PRECISION (mult_type) < TYPE_PRECISION (TREE_TYPE (op0)))
{
tem = fold_build2 (MULT_EXPR, mult_type,
fold_convert (mult_type,
TREE_OPERAND (op0, 0)),
fold_convert (mult_type,
TREE_OPERAND (op0, 1)));
return fold_convert (type, tem);
}
}
tem = fold_convert_const (code, type, op0);

View file

@ -1,3 +1,8 @@
2008-12-06 Jakub Jelinek <jakub@redhat.com>
PR middle-end/38422
* gcc.c-torture/execute/pr38422.c: New test.
2008-12-06 Janus Weil <janus@gcc.gnu.org>
PR fortran/38415

View file

@ -0,0 +1,24 @@
/* PR middle-end/38422 */
extern void abort (void);
struct S
{
int s : (sizeof (int) * __CHAR_BIT__ - 2);
} s;
void
foo (void)
{
s.s *= 2;
}
int
main ()
{
s.s = 24;
foo ();
if (s.s != 48)
abort ();
return 0;
}