PR symtab/15695

* valops.c (value_struct_elt): Add missing call to check_typedef.
	(value_find_oload_method_list): Ditto.

	testsuite/
	* gdb.base/func-ptr.exp: New file.
	* gdb.base/func-ptr.c: New file.
This commit is contained in:
Doug Evans 2013-08-01 23:59:48 +00:00
parent b52109bc0c
commit b846d303c6
5 changed files with 72 additions and 2 deletions

View File

@ -1,5 +1,9 @@
2013-08-01 Doug Evans <dje@google.com> 2013-08-01 Doug Evans <dje@google.com>
PR symtab/15695
* valops.c (value_struct_elt): Add missing call to check_typedef.
(value_find_oload_method_list): Ditto.
* symtab.c (do_free_search_symbols_cleanup): Change arg to, * symtab.c (do_free_search_symbols_cleanup): Change arg to,
effectively, struct symbol_search **. effectively, struct symbol_search **.
(make_cleanup_free_search_symbols): Change arg to struct (make_cleanup_free_search_symbols): Change arg to struct

View File

@ -1,3 +1,9 @@
2013-08-01 Doug Evans <dje@google.com>
PR symtab/15695
* gdb.base/func-ptr.exp: New file.
* gdb.base/func-ptr.c: New file.
2013-08-01 Yao Qi <yao@codesourcery.com> 2013-08-01 Yao Qi <yao@codesourcery.com>
* gdb.python/py-sync-interp.c: New. * gdb.python/py-sync-interp.c: New.

View File

@ -0,0 +1,30 @@
/* This testcase is part of GDB, the GNU debugger.
Copyright 2013 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. */
void
bar ()
{
}
typedef void foo (void);
foo *pbar = bar;
int
main ()
{
return 0;
}

View File

@ -0,0 +1,30 @@
# Copyright 2013 Free Software Foundation, Inc.
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This testcase exercises bug 15695.
# Trying to print foo->bar if foo is a pointer to a typedef of a pointer
# to a function will put gdb into an infinite loop.
if { [prepare_for_testing func-ptr.exp "func-ptr" {func-ptr.c} {debug}] } {
return -1
}
if ![runto_main] {
fail "Can't run to main"
return 0
}
# This would put gdb into an infinite loop.
gdb_test "print pbar->baz" "Attempt to extract .*"

View File

@ -2188,7 +2188,7 @@ value_struct_elt (struct value **argp, struct value **args,
{ {
*argp = value_ind (*argp); *argp = value_ind (*argp);
/* Don't coerce fn pointer to fn and then back again! */ /* Don't coerce fn pointer to fn and then back again! */
if (TYPE_CODE (value_type (*argp)) != TYPE_CODE_FUNC) if (TYPE_CODE (check_typedef (value_type (*argp))) != TYPE_CODE_FUNC)
*argp = coerce_array (*argp); *argp = coerce_array (*argp);
t = check_typedef (value_type (*argp)); t = check_typedef (value_type (*argp));
} }
@ -2352,7 +2352,7 @@ value_find_oload_method_list (struct value **argp, const char *method,
{ {
*argp = value_ind (*argp); *argp = value_ind (*argp);
/* Don't coerce fn pointer to fn and then back again! */ /* Don't coerce fn pointer to fn and then back again! */
if (TYPE_CODE (value_type (*argp)) != TYPE_CODE_FUNC) if (TYPE_CODE (check_typedef (value_type (*argp))) != TYPE_CODE_FUNC)
*argp = coerce_array (*argp); *argp = coerce_array (*argp);
t = check_typedef (value_type (*argp)); t = check_typedef (value_type (*argp));
} }