diff options
author | Jan Hubicka <hubicka@ucw.cz> | 2014-02-04 07:28:22 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2014-02-04 06:28:22 +0000 |
commit | 39960d1cfa261751c9947534590b435b5fe761a7 (patch) | |
tree | eeee5018125c68e6fc2b821dff471bcfb734e2f4 /gcc/tree.c | |
parent | 6f746413d43db94271199e867c03bb20de3c2d42 (diff) | |
download | gcc-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.c | 11 |
1 files changed, 8 insertions, 3 deletions
@@ -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) { |