aboutsummaryrefslogtreecommitdiff
path: root/gcc
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
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')
-rw-r--r--gcc/ChangeLog27
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr59882.C30
-rw-r--r--gcc/tree.c11
4 files changed, 59 insertions, 14 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b3fcc14..237ec96 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,9 +1,14 @@
-2014-02-03 Jan Hubicka <jh@suse.cz>
+2014-02-03 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/59882
+ * tree.c (get_binfo_at_offset): Do not get confused by empty classes;
+
+2014-02-03 Jan Hubicka <hubicka@ucw.cz>
* gimple-fold.c (gimple_extract_devirt_binfo_from_cst): Remove.
* gimple-fold.h (gimple_extract_devirt_binfo_from_cst): Remove.
-2014-02-03 Jan Hubicka <jh@suse.cz>
+2014-02-03 Jan Hubicka <hubicka@ucw.cz>
PR ipa/59831
* ipa-cp.c (ipa_get_indirect_edge_target_1): Use ipa-devirt
@@ -14,7 +19,7 @@
(get_polymorphic_call_info): ... here.
(get_polymorphic_call_info_from_invariant): New function.
-2014-02-03 Jan Hubicka <jh@suse.cz>
+2014-02-03 Jan Hubicka <hubicka@ucw.cz>
* ipa-cp.c (ipa_get_indirect_edge_target_1): Do direct
lookup via vtable pointer; check for type consistency
@@ -152,7 +157,7 @@
(reduc_splus_<mode>): Call gen_altivec_vsumsws_direct instead of
gen_altivec_vsumsws.
-2014-02-02 Jan Hubicka <jh@suse.cz>
+2014-02-02 Jan Hubicka <hubicka@ucw.cz>
* ipa-devirt.c (subbinfo_with_vtable_at_offset,
vtable_pointer_value_to_binfo): New functions.
@@ -479,7 +484,7 @@
if -minrt given.
(ENDFILE_SPEC): Likewise.
-2014-01-29 Jan Hubicka <jh@suse.cz>
+2014-01-29 Jan Hubicka <hubicka@ucw.cz>
* ipa-inline-analysis.c (clobber_only_eh_bb_p): New function.
(estimate_function_body_sizes): Use it.
@@ -1234,12 +1239,12 @@
* config/microblaze/microblaze.md: Correct bswaphi2 insn.
-2014-01-22 Jan Hubicka <jh@suse.cz>
+2014-01-22 Jan Hubicka <hubicka@ucw.cz>
* config/i386/x86-tune.def (X86_TUNE_ACCUMULATE_OUTGOING_ARGS):
Enable for generic and recent AMD targets.
-2014-01-22 Jan Hubicka <jh@suse.cz>
+2014-01-22 Jan Hubicka <hubicka@ucw.cz>
* combine-stack-adj.c (combine_stack_adjustments_for_block): Remove
ARG_SIZE note when adjustment was eliminated.
@@ -1404,7 +1409,7 @@
* config/i386/i386.c (ix86_avoid_lea_for_addr): Return false
if operands[1] is a REG or ZERO_EXTEND of a REG.
-2014-01-19 Jan Hubicka <jh@suse.cz>
+2014-01-19 Jan Hubicka <hubicka@ucw.cz>
* varasm.c (compute_reloc_for_constant): Use targetm.binds_local_p.
@@ -1481,7 +1486,7 @@
* ree.c (combine_set_extension): Temporarily disable test for
changing number of hard registers.
-2014-01-17 Jan Hubicka <jh@suse.cz>
+2014-01-17 Jan Hubicka <hubicka@ucw.cz>
PR middle-end/58125
* ipa-inline-analysis.c (inline_free_summary):
@@ -1658,7 +1663,7 @@
* ipa-ref.c (ipa_remove_stmt_references): Fix references
traversal when removing references.
-2014-01-16 Jan Hubicka <jh@suse.cz>
+2014-01-16 Jan Hubicka <hubicka@ucw.cz>
PR ipa/59775
* tree.c (get_binfo_at_offset): Look harder for virtual bases.
@@ -2070,7 +2075,7 @@
occurs before the extension when optimizing extensions with
different source and destination hard registers.
-2014-01-10 Jan Hubicka <jh@suse.cz>
+2014-01-10 Jan Hubicka <hubicka@ucw.cz>
PR ipa/58585
* ipa-devirt.c (build_type_inheritance_graph): Also add types of
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 131b6c9..ee68207 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2014-02-03 Jan Hubicka <hubicka@ucw.cz>
+
+ PR ipa/59882
+ * g++.dg/torture/pr59882.C: New testcase
+
2014-02-03 Jan Hubicka <jh@suse.cz>
PR ipa/59831
diff --git a/gcc/testsuite/g++.dg/torture/pr59882.C b/gcc/testsuite/g++.dg/torture/pr59882.C
new file mode 100644
index 0000000..b61f247
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr59882.C
@@ -0,0 +1,30 @@
+/* { dg-do compile } */
+class A;
+class B {};
+struct C {
+ virtual void dispatch();
+ int traversal_map_;
+};
+template <typename> class F : public virtual C {};
+
+struct I : F<A>, F<int> {};
+struct J : B, I {};
+class D {};
+struct L {
+ L(D &, int &p2) : map_(p2) {}
+ virtual void traverse(int &p1) {
+ int &s = p1;
+ names<L>(s, names_);
+ }
+ int &map_;
+ J names_;
+ template <typename> void names(int &, C &p2) { p2.dispatch(); }
+};
+
+struct G : D {
+ G(D &, int &p2) : map_(p2) { L(*this, map_); }
+ int &map_;
+};
+
+int a;
+void fn1(D &p1) { G(p1, a); }
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)
{