aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMartin Jambor <mjambor@suse.cz>2010-10-21 16:34:58 +0200
committerMartin Jambor <jamborm@gcc.gnu.org>2010-10-21 16:34:58 +0200
commitae1f6fcec0d9a0a0551578915a7a83c39be894aa (patch)
treeb7250dedbfc34a37e874e771b58ad2229c079a5a /gcc
parent9e2995b26c10404ee4975d4a70e580018417c0f7 (diff)
downloadgcc-ae1f6fcec0d9a0a0551578915a7a83c39be894aa.zip
gcc-ae1f6fcec0d9a0a0551578915a7a83c39be894aa.tar.gz
gcc-ae1f6fcec0d9a0a0551578915a7a83c39be894aa.tar.bz2
re PR tree-optimization/45875 (ice in gimple_fold_obj_type_ref_known_binfo with -O2)
2010-10-21 Martin Jambor <mjambor@suse.cz> PR tree-optimization/45875 * tree.c (get_binfo_at_offset): Remove initial zero offset test. * testsuite/g++.dg/ipa/pr45875.C: New test. From-SVN: r165780
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/ipa/pr45875.C48
-rw-r--r--gcc/tree.c3
4 files changed, 58 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index bac7867..8d110cf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-21 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/45875
+ * tree.c (get_binfo_at_offset): Remove initial zero offset test.
+
2010-10-21 Nathan Froyd <froydnj@codesourcery.com>
* tree-into-ssa.c (rewrite_update_enter_block): Remove unused
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b4387d5..c714e1f 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2010-10-21 Martin Jambor <mjambor@suse.cz>
+
+ PR tree-optimization/45875
+ * g++.dg/ipa/pr45875.C: New test.
+
2010-10-21 Ira Rosen <irar@il.ibm.com>
PR tree-optimization/46049
diff --git a/gcc/testsuite/g++.dg/ipa/pr45875.C b/gcc/testsuite/g++.dg/ipa/pr45875.C
new file mode 100644
index 0000000..34f02e3
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/pr45875.C
@@ -0,0 +1,48 @@
+/* { dg-do compile } */
+/* { dg-options "-O3 -fno-early-inlining -fno-ipa-cp" } */
+
+extern "C" void abort (void);
+
+class A
+{
+public:
+ virtual int foo (int i);
+};
+
+class B
+{
+public:
+ class A confusion;
+};
+
+int A::foo (int i)
+{
+ return i + 1;
+}
+
+int __attribute__ ((noinline,noclone)) get_input(void)
+{
+ return 1;
+}
+
+static int middleman_a (class A *obj, int i)
+{
+ return obj->foo (i);
+}
+
+static int middleman_b (class B *obj, int i)
+{
+ return middleman_a (&obj->confusion, i);
+}
+
+
+int main (int argc, char *argv[])
+{
+ class B b;
+ int i, j = get_input ();
+
+ for (i = 0; i < j; i++)
+ if (middleman_b (&b, j) != 2)
+ abort ();
+ return 0;
+}
diff --git a/gcc/tree.c b/gcc/tree.c
index 6d1b5a4..48279eb 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -10893,9 +10893,6 @@ get_binfo_at_offset (tree binfo, HOST_WIDE_INT offset, tree expected_type)
{
tree type;
- if (offset == 0)
- return binfo;
-
type = TREE_TYPE (binfo);
while (offset > 0)
{