aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree.c
diff options
context:
space:
mode:
authorJan Hubicka <hubicka@ucw.cz>2014-02-04 07:28:22 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2014-02-04 06:28:22 +0000
commit39960d1cfa261751c9947534590b435b5fe761a7 (patch)
treeeeee5018125c68e6fc2b821dff471bcfb734e2f4 /gcc/tree.c
parent6f746413d43db94271199e867c03bb20de3c2d42 (diff)
downloadgcc-39960d1cfa261751c9947534590b435b5fe761a7.zip
gcc-39960d1cfa261751c9947534590b435b5fe761a7.tar.gz
gcc-39960d1cfa261751c9947534590b435b5fe761a7.tar.bz2
re PR ipa/59882 (internal compiler error: Segmentation fault)
PR ipa/59882 * tree.c (get_binfo_at_offset): Do not get confused by empty classes; * g++.dg/torture/pr59882.C: New testcase From-SVN: r207451
Diffstat (limited to 'gcc/tree.c')
-rw-r--r--gcc/tree.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/gcc/tree.c b/gcc/tree.c
index 1d06ba7..49767b6 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -12005,10 +12005,15 @@ get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type)
break;
}
else
- if (BINFO_OFFSET (base_binfo) - BINFO_OFFSET (binfo) < pos
+ if ((tree_to_shwi (BINFO_OFFSET (base_binfo))
+ - tree_to_shwi (BINFO_OFFSET (binfo)))
+ * BITS_PER_UNIT < pos
+ /* Rule out types with no virtual methods or we can get confused
+ here by zero sized bases. */
+ && BINFO_VTABLE (TYPE_BINFO (BINFO_TYPE (base_binfo)))
&& (!containing_binfo
- || (BINFO_OFFSET (containing_binfo)
- < BINFO_OFFSET (base_binfo))))
+ || (tree_to_shwi (BINFO_OFFSET (containing_binfo))
+ < tree_to_shwi (BINFO_OFFSET (base_binfo)))))
containing_binfo = base_binfo;
if (found_binfo)
{