diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 81467f19fdb..b78f3ab145f 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8320,11 +8320,11 @@ native_encode_initializer (tree init, unsigned char *ptr, int len, return 0; HOST_WIDE_INT repr_size = int_size_in_bytes (repr_type); gcc_assert (repr_size > 0 && repr_size <= len); - if (pos + repr_size <= len) + if (pos + repr_size <= o + len) rpos = pos; else { - rpos = len - repr_size; + rpos = o + len - repr_size; gcc_assert (rpos <= pos); } } diff --git a/gcc/testsuite/gcc.c-torture/compile/pr98199.c b/gcc/testsuite/gcc.c-torture/compile/pr98199.c new file mode 100644 index 00000000000..b5c8d204f0e --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr98199.c @@ -0,0 +1,7 @@ +/* PR tree-optimization/98199 */ + +struct A { long a; short d; int c, f, e, g; }; +struct B { int a, i; short j; struct A k; signed : 20; int e, g; } __attribute__((packed)); +struct C { short a; unsigned i, k; struct B d; const int : 30; signed e : 20; signed : 18; }; +const struct C l = { 1, 6, 0, {}, 0 }; +int foo (void) { return l.e || 0; }