@@ -0,0 +1,20 @@
+// PR debug/54831
+// { dg-do compile }
+// { dg-options "-O -fno-split-wide-types -g" }
+
+struct S
+{
+ int m1();
+ int m2();
+};
+
+typedef void (S::*mptr) ();
+
+mptr gmp;
+void bar (mptr f);
+
+void foo (mptr f)
+{
+ f = gmp;
+ bar (f);
+}
@@ -9404,12 +9404,13 @@ vt_add_function_parameter (tree parm)
if (parm != decl)
{
- /* Assume that DECL_RTL was a pseudo that got spilled to
- memory. The spill slot sharing code will force the
- memory to reference spill_slot_decl (%sfp), so we don't
- match above. That's ok, the pseudo must have referenced
- the entire parameter, so just reset OFFSET. */
- gcc_assert (decl == get_spill_slot_decl (false));
+ /* If that DECL_RTL wasn't a pseudo that got spilled to
+ memory, bail out. Otherwise, the spill slot sharing code
+ will force the memory to reference spill_slot_decl (%sfp),
+ so we don't match above. That's ok, the pseudo must have
+ referenced the entire parameter, so just reset OFFSET. */
+ if (decl != get_spill_slot_decl (false))
+ return;
offset = 0;
}
On Mon, Oct 08, 2012 at 06:09:41PM +0200, Jakub Jelinek wrote: > Ok with those changes. Thanks, this is what I've checked in: 2012-10-08 Marek Polacek <polacek@redhat.com> PR debug/54831 * var-tracking.c (vt_add_function_parameter): Use condition instead of gcc_assert. * testsuite/g++.dg/debug/pr54831.C: New test. Marek