diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fold-const.c | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr98199.c | 7 |
2 files changed, 9 insertions, 2 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 81467f1..b78f3ab 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 0000000..b5c8d20 --- /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; } |