@@ -2155,7 +2155,7 @@ ipa_analyze_call_uses (struct func_body_info *fbi, gcall *call)
if (cs && !cs->indirect_unknown_callee)
return;
- if (cs->indirect_info->polymorphic)
+ if (cs->indirect_info->polymorphic && flag_devirtualize)
{
tree instance;
tree target = gimple_call_fn (call);
new file mode 100644
@@ -0,0 +1,56 @@
+// { dg-options "-r -nostdlib -O2 -flto -fno-devirtualize" }
+// { dg-require-effective-target lto }
+
+class A;
+class B
+{
+public:
+ A *operator->();
+};
+class C
+{
+public:
+ virtual void m_fn1 ();
+};
+class A
+{
+public:
+ C *m_fn2 ();
+};
+class D
+{
+public:
+ void
+ m_fn3 ()
+ {
+ list_m->m_fn2 ()->m_fn1 ();
+ }
+ B list_m;
+};
+
+class F
+{
+public:
+ D m_fn4 ();
+};
+class G
+{
+public:
+ F m_fn5 (int, int);
+};
+class H
+{
+public:
+ void
+ m_fn6 ()
+ {
+ fieldEngine_m.m_fn5 (0, 0).m_fn4 ().m_fn3 ();
+ }
+ G fieldEngine_m;
+};
+
+void
+fn1 (H a)
+{
+ a.m_fn6 ();
+}