diff options
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/func-ptr.c | 30 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/func-ptr.exp | 30 | ||||
-rw-r--r-- | gdb/valops.c | 4 |
5 files changed, 72 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e3a5c54..ff22280 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,9 @@ 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, effectively, struct symbol_search **. (make_cleanup_free_search_symbols): Change arg to struct diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index f73f2e1..e3b0683 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -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> * gdb.python/py-sync-interp.c: New. diff --git a/gdb/testsuite/gdb.base/func-ptr.c b/gdb/testsuite/gdb.base/func-ptr.c new file mode 100644 index 0000000..b30ccb8 --- /dev/null +++ b/gdb/testsuite/gdb.base/func-ptr.c @@ -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; +} diff --git a/gdb/testsuite/gdb.base/func-ptr.exp b/gdb/testsuite/gdb.base/func-ptr.exp new file mode 100644 index 0000000..b7351bf --- /dev/null +++ b/gdb/testsuite/gdb.base/func-ptr.exp @@ -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 .*" diff --git a/gdb/valops.c b/gdb/valops.c index a3ab24f..f527550 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -2188,7 +2188,7 @@ value_struct_elt (struct value **argp, struct value **args, { *argp = value_ind (*argp); /* 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); 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); /* 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); t = check_typedef (value_type (*argp)); } |