diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 3 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr51077.c | 15 | ||||
-rw-r--r-- | gcc/tree-object-size.c | 2 |
4 files changed, 25 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fa7cbeb1bb5..b07dbca042d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2011-11-10 Jakub Jelinek <jakub@redhat.com> + + PR middle-end/51077 + * tree-object-size.c (addr_object_size): Check TREE_CODE of + MEM_REF's operand rather than code of the MEM_REF itself. + 2011-11-10 Andrew MacLeod <amacleod@redhat.com> PR rtl-optimization/51040 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ffa8b57d8fa..9615be5b53b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2011-11-10 Jakub Jelinek <jakub@redhat.com> + PR middle-end/51077 + * gcc.c-torture/compile/pr51077.c: New test. + PR rtl-optimization/51023 * gcc.c-torture/execute/pr51023.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr51077.c b/gcc/testsuite/gcc.c-torture/compile/pr51077.c new file mode 100644 index 00000000000..de2b97e58e9 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr51077.c @@ -0,0 +1,15 @@ +/* PR middle-end/51077 */ + +struct S { unsigned char s, t[256]; }; + +void +foo (const struct S *x, struct S *y, int z) +{ + int i; + for (i = 0; i < 8; i++) + { + const struct S *a = &x[i]; + __builtin___memcpy_chk (y->t, a->t, z, __builtin_object_size (y->t, 0)); + y = (struct S *) &y->t[z]; + } +} diff --git a/gcc/tree-object-size.c b/gcc/tree-object-size.c index 017f8c5e933..326b2e4c21b 100644 --- a/gcc/tree-object-size.c +++ b/gcc/tree-object-size.c @@ -175,7 +175,7 @@ addr_object_size (struct object_size_info *osi, const_tree ptr, unsigned HOST_WIDE_INT sz; if (!osi || (object_size_type & 1) != 0 - || TREE_CODE (pt_var) != SSA_NAME) + || TREE_CODE (TREE_OPERAND (pt_var, 0)) != SSA_NAME) { sz = compute_builtin_object_size (TREE_OPERAND (pt_var, 0), object_size_type & ~1); |