Fix r216010 fallout
authorMarkus Trippelsdorf <markus@trippelsdorf.de>
Thu, 9 Oct 2014 17:52:00 +0000 (17:52 +0000)
committerMarkus Trippelsdorf <trippels@gcc.gnu.org>
Thu, 9 Oct 2014 17:52:00 +0000 (17:52 +0000)
This fixes fallout from r216010, which causes Firefox build failures.
Just move the gcc_assert below the new if statement.

From-SVN: r216041

gcc/ChangeLog
gcc/ipa-polymorphic-call.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/ipa/polymorphic-call-1.C [new file with mode: 0644]

index 23d7bbe4f4c5f1726f0e7d94f74c7e08c0bad230..280101caed57735a34711e4c970bf9812a058322 100644 (file)
@@ -1,3 +1,8 @@
+2014-10-09  Markus Trippelsdorf  <markus@trippelsdorf.de>
+
+       * pa-polymorphic-call.c (check_stmt_for_type_change): Move
+       assertion.
+
 2014-10-09  Richard Biener  <rguenther@suse.de>
 
        PR tree-optimization/63380
index 51c6709a86555ff0ffc684bc59b696c099ae6cab..7d58601ae365b8c829f5c1a1e4c9172f43c082dc 100644 (file)
@@ -1424,9 +1424,9 @@ check_stmt_for_type_change (ao_ref *ao ATTRIBUTE_UNUSED, tree vdef, void *data)
        }
 
       type = extr_type_from_vtbl_ptr_store (stmt, tci, &offset);
-      gcc_assert (!type || TYPE_MAIN_VARIANT (type) == type);
       if (type == error_mark_node)
        return false;
+      gcc_assert (!type || TYPE_MAIN_VARIANT (type) == type);
       if (!type)
        {
          if (dump_file)
index ceaf2b35d816ae4687f13fe67040e18948602c6c..89d7f847909f5772c1841dac06ec76f622272dec 100644 (file)
@@ -1,3 +1,7 @@
+2014-10-09  Markus Trippelsdorf  <markus@trippelsdorf.de>
+
+       * g++.dg/ipa/polymorphic-call-1.C: New testcase.
+
 2014-10-09  Marc Glisse  <marc.glisse@inria.fr>
 
        * g++.dg/cpp0x/constexpr-52892-1.C: Error on missing const in C++14.
diff --git a/gcc/testsuite/g++.dg/ipa/polymorphic-call-1.C b/gcc/testsuite/g++.dg/ipa/polymorphic-call-1.C
new file mode 100644 (file)
index 0000000..2b5b544
--- /dev/null
@@ -0,0 +1,49 @@
+// { dg-do compile }
+// { dg-options "-O2" }
+class A;
+class B
+{
+  A *mRawPtr;
+
+public:
+  void *StartAssignment___trans_tmp_2;
+  A **
+  m_fn1 ()
+  {
+    StartAssignment___trans_tmp_2 = &mRawPtr;
+    return reinterpret_cast<A **> (StartAssignment___trans_tmp_2);
+  }
+};
+class C
+{
+public:
+  C (B &p1) : mTargetSmartPtr (p1) {}
+  operator A **() { return mTargetSmartPtr.m_fn1 (); }
+  B &mTargetSmartPtr;
+};
+class A
+{
+public:
+  A ();
+};
+class D
+{
+  D (bool);
+  B mNewEntry;
+  virtual int m_fn2 ();
+};
+C
+fn1 (B &p1)
+{
+  return p1;
+}
+void
+fn2 (bool, A **)
+{
+  new A;
+}
+D::D (bool p1)
+{
+  A **a = fn1 (mNewEntry);
+  fn2 (p1, a);
+}