diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 14bdc37b009..b7e0a64be80 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2012-10-08 Marek Polacek + + PR debug/54831 + * var-tracking.c (vt_add_function_parameter): Use condition instead + of gcc_assert. + + * testsuite/g++.dg/debug/pr54831.C: New test. + 2012-10-08 Dehao Chen * predict.c (predict_loops): Predict for short-circuit conditions. diff --git a/gcc/testsuite/g++.dg/debug/pr54831.C b/gcc/testsuite/g++.dg/debug/pr54831.C new file mode 100644 index 00000000000..8e7312061a0 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/pr54831.C @@ -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); +} diff --git a/gcc/var-tracking.c b/gcc/var-tracking.c index bbd2f4b6923..6a6cd420a0c 100644 --- a/gcc/var-tracking.c +++ b/gcc/var-tracking.c @@ -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; }