re PR ipa/64282 (ICE in gimple_get_virt_method_for_vtable, at gimple-fold.c:5635)
authorJan Hubicka <hubicka@ucw.cz>
Tue, 27 Jan 2015 16:59:31 +0000 (17:59 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Tue, 27 Jan 2015 16:59:31 +0000 (16:59 +0000)
PR ipa/64282
* gimple-fold.c (gimple_get_virt_method_for_vtable): Remove assert
on vtable being vtable.
* g++.dg/torture/pr64282.C: New testcase.

From-SVN: r220177

gcc/ChangeLog
gcc/gimple-fold.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/torture/pr64282.C [new file with mode: 0644]

index 3f7164d21cc46d8fbceef691f4ed6afe11e764c1..03097cf2a3fbb39aa69bbaad76385cc9a9451025 100644 (file)
@@ -1,3 +1,9 @@
+2015-01-27  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/64282
+       * gimple-fold.c (gimple_get_virt_method_for_vtable): Remove assert
+       on vtable being vtable.
+
 2015-01-27  Dominik Vogt  <vogt@linux.vnet.ibm.com>
 
         * doc/extend.texi: s/390: Update documentation of hotpatch attribute.
index baec077a53313a46d0a97321615cea1bd44e50e5..3015901d8c1f1fb73db12396bab4081e7335c508 100644 (file)
@@ -5649,7 +5649,6 @@ gimple_get_virt_method_for_vtable (HOST_WIDE_INT token,
   if (TREE_CODE (v) != VAR_DECL
       || !DECL_VIRTUAL_P (v))
     {
-      gcc_assert (in_lto_p);
       /* Pass down that we lost track of the target.  */
       if (can_refer)
        *can_refer = false;
index 1648a49b8fa924e3f6bcd500980ccda119b9ab00..c8170c1525d139d8edddb9de207cf1eaf46f1000 100644 (file)
@@ -1,3 +1,8 @@
+2015-01-27  Jan Hubicka  <hubicka@ucw.cz>
+
+       PR ipa/64282
+       * g++.dg/torture/pr64282.C: New testcase.
+
 2015-01-27  Kyrylo Tkachov  <kyrylo.tkachov@arm.com>
 
        * gcc.target/aarch64/store-pair-1.c: Update scan-assembler to check
diff --git a/gcc/testsuite/g++.dg/torture/pr64282.C b/gcc/testsuite/g++.dg/torture/pr64282.C
new file mode 100644 (file)
index 0000000..4842988
--- /dev/null
@@ -0,0 +1,101 @@
+// { dg-do compile }
+template <class _T1> struct A
+{
+  _T1 first;
+};
+struct B
+{
+  int operator!=(B);
+};
+template <typename _Tp> struct C
+{
+  C (B);
+  _Tp operator*();
+  int operator!=(C);
+};
+template <typename _Tp> class D
+{
+public:
+  typedef C<_Tp> const_iterator;
+  const_iterator m_fn1 () const;
+  B m_fn2 ();
+  void m_fn3 ();
+};
+class F
+{
+  struct G
+  {
+    static G &
+    m_fn5 ()
+    {
+      void fn1 ();
+      return *reinterpret_cast<G *> (fn1);
+    }
+    int *
+    m_fn6 ()
+    {
+      return reinterpret_cast<int *> (this);
+    }
+  };
+  struct _Alloc_hider
+  {
+    _Alloc_hider (int *p1, int) : _M_p (p1) {}
+    int *_M_p;
+  } _M_dataplus;
+  G &
+  m_fn4 ()
+  {
+    return G::m_fn5 ();
+  }
+public:
+  F () : _M_dataplus (m_fn4 ().m_fn6 (), 0) {}
+};
+class H
+{
+  void m_fn7 (const F &, bool &);
+  bool m_fn8 (const D<F> &, const F &, F &);
+};
+typedef A<int> CandPair;
+class I
+{
+public:
+  virtual void m_fn9 (const F &, bool, D<CandPair> &);
+};
+class J : I
+{
+public:
+  void m_fn9 (const F &, bool, D<CandPair> &);
+};
+D<I *> c;
+void
+J::m_fn9 (const F &, bool, D<CandPair> &)
+{
+  D<int> a;
+  for (B b; b != a.m_fn2 ();)
+    ;
+}
+inline void
+fn2 (F p1, int, int, J *p4, D<CandPair>)
+{
+  D<CandPair> d;
+  d.m_fn3 ();
+  p4->m_fn9 (p1, 0, d);
+  for (D<I *>::const_iterator e = c.m_fn1 (); e != c.m_fn2 ();)
+    (*e)->m_fn9 (p1, 0, d);
+}
+void
+H::m_fn7 (const F &, bool &)
+{
+  A<F> f;
+  D<F> g;
+  F h;
+  m_fn8 (g, f.first, h);
+}
+bool
+H::m_fn8 (const D<F> &p1, const F &, F &)
+{
+  F i;
+  p1.m_fn1 ();
+  D<CandPair> j;
+  fn2 (i, 0, 0, 0, j);
+}