aboutsummaryrefslogtreecommitdiff
path: root/gdb/valops.c
diff options
context:
space:
mode:
authorTankut Baris Aktemur <tankut.baris.aktemur@intel.com>2019-11-29 12:17:36 +0100
committerTankut Baris Aktemur <tankut.baris.aktemur@intel.com>2019-11-29 12:18:21 +0100
commite9194a1a0e49f0646d5ac415836cc5d133f14bbe (patch)
treec4a6ebe2cea13ab40b0c0c15f21de41d7a61cb72 /gdb/valops.c
parent13364701d8c1b5b184ac6db4b835a3bb680766a0 (diff)
downloadgdb-e9194a1a0e49f0646d5ac415836cc5d133f14bbe.zip
gdb-e9194a1a0e49f0646d5ac415836cc5d133f14bbe.tar.gz
gdb-e9194a1a0e49f0646d5ac415836cc5d133f14bbe.tar.bz2
gdb: fix segfault in overload resolution debug output
A segfault occurs if overload resolution debug mode is turned on via the 'set debug overload' command. E.g.: ~~~ $ gdb ./a.out ... (gdb) start ... (gdb) set debug overload 1 (gdb) print foo(5) -- Arg is int [8], parm is double [9] Overloaded function instance (null) # of parms 1 Segmentation fault $ ~~~ The problem is, GDB tries to print the badness vector after it has been std::move'd. Fix the problem by printing the vector before it is moved. gdb/ChangeLog: 2019-11-29 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com> * valops.c (find_oload_champ): Print part of debug messages before the badness vector is std::move'd. Change-Id: Ia623f9637e82ec332bfeac23eb6b0f2ffdcdde27
Diffstat (limited to 'gdb/valops.c')
-rw-r--r--gdb/valops.c48
1 files changed, 25 insertions, 23 deletions
diff --git a/gdb/valops.c b/gdb/valops.c
index cbb1f30..8af53de 100644
--- a/gdb/valops.c
+++ b/gdb/valops.c
@@ -3023,6 +3023,28 @@ find_oload_champ (gdb::array_view<value *> args,
bv = rank_function (parm_types,
args.slice (static_offset));
+ if (overload_debug)
+ {
+ if (methods != NULL)
+ fprintf_filtered (gdb_stderr,
+ "Overloaded method instance %s, # of parms %d\n",
+ methods[ix].physname, (int) parm_types.size ());
+ else if (xmethods != NULL)
+ fprintf_filtered (gdb_stderr,
+ "Xmethod worker, # of parms %d\n",
+ (int) parm_types.size ());
+ else
+ fprintf_filtered (gdb_stderr,
+ "Overloaded function instance "
+ "%s # of parms %d\n",
+ functions[ix]->demangled_name (),
+ (int) parm_types.size ());
+ for (jj = 0; jj < args.size () - static_offset; jj++)
+ fprintf_filtered (gdb_stderr,
+ "...Badness @ %d : %d\n",
+ jj, bv[jj].rank);
+ }
+
if (oload_champ_bv->empty ())
{
*oload_champ_bv = std::move (bv);
@@ -3048,29 +3070,9 @@ find_oload_champ (gdb::array_view<value *> args,
break;
}
if (overload_debug)
- {
- if (methods != NULL)
- fprintf_filtered (gdb_stderr,
- "Overloaded method instance %s, # of parms %d\n",
- methods[ix].physname, (int) parm_types.size ());
- else if (xmethods != NULL)
- fprintf_filtered (gdb_stderr,
- "Xmethod worker, # of parms %d\n",
- (int) parm_types.size ());
- else
- fprintf_filtered (gdb_stderr,
- "Overloaded function instance "
- "%s # of parms %d\n",
- functions[ix]->demangled_name (),
- (int) parm_types.size ());
- for (jj = 0; jj < args.size () - static_offset; jj++)
- fprintf_filtered (gdb_stderr,
- "...Badness @ %d : %d\n",
- jj, bv[jj].rank);
- fprintf_filtered (gdb_stderr, "Overload resolution "
- "champion is %d, ambiguous? %d\n",
- oload_champ, oload_ambiguous);
- }
+ fprintf_filtered (gdb_stderr, "Overload resolution "
+ "champion is %d, ambiguous? %d\n",
+ oload_champ, oload_ambiguous);
}
return oload_champ;