diff mbox

Fix r216010 fallout

Message ID 20141009144705.GA298@x4
State New
Headers show

Commit Message

Markus Trippelsdorf Oct. 9, 2014, 2:47 p.m. UTC
This fixes fallout from r216010, which causes Firefox build failures.
Just move the gcc_assert below the new if statement.

Boostrapped and tested on powerpc64-unknown-linux-gnu.
Ok for trunk?
Thanks.

2014-10-09  Markus Trippelsdorf  <markus@trippelsdorf.de>

	* pa-polymorphic-call.c (check_stmt_for_type_change): Move
	assertion.

2014-10-09  Markus Trippelsdorf  <markus@trippelsdorf.de>

	* /g++.dg/ipa/polymorphic-call-1.C: New testcase.

Comments

Marek Polacek Oct. 9, 2014, 2:50 p.m. UTC | #1
On Thu, Oct 09, 2014 at 04:47:05PM +0200, Markus Trippelsdorf wrote:
> 2014-10-09  Markus Trippelsdorf  <markus@trippelsdorf.de>
> 
> 	* /g++.dg/ipa/polymorphic-call-1.C: New testcase.

Please drop the leading '/' when you commit this patch.

	Marek
Jan Hubicka Oct. 9, 2014, 5:45 p.m. UTC | #2
> This fixes fallout from r216010, which causes Firefox build failures.
> Just move the gcc_assert below the new if statement.
> 
> Boostrapped and tested on powerpc64-unknown-linux-gnu.
> Ok for trunk?

OK, thanks!
Honza
> Thanks.
> 
> 2014-10-09  Markus Trippelsdorf  <markus@trippelsdorf.de>
> 
> 	* pa-polymorphic-call.c (check_stmt_for_type_change): Move
> 	assertion.
> 
> 2014-10-09  Markus Trippelsdorf  <markus@trippelsdorf.de>
> 
> 	* /g++.dg/ipa/polymorphic-call-1.C: New testcase.
> 
> 
> diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c
> index 51c6709a8655..7d58601ae365 100644
> --- a/gcc/ipa-polymorphic-call.c
> +++ b/gcc/ipa-polymorphic-call.c
> @@ -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)
> 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
> index 000000000000..2b5b54478349
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/ipa/polymorphic-call-1.C
> @@ -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);
> +}
> -- 
> Markus
diff mbox

Patch

diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c
index 51c6709a8655..7d58601ae365 100644
--- a/gcc/ipa-polymorphic-call.c
+++ b/gcc/ipa-polymorphic-call.c
@@ -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)
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
index 000000000000..2b5b54478349
--- /dev/null
+++ b/gcc/testsuite/g++.dg/ipa/polymorphic-call-1.C
@@ -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);
+}