aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fold-const.c4
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr98199.c7
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; }