From 791dfb6488c972e2352ff5c3b4aa5659ce476136 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Tue, 16 Feb 2010 20:51:51 +0000 Subject: [PATCH] gdb/ * linespec.c (decode_line_1): Handle FILE:FUNCTION even if FUNCTION contains parentheses. Improve removal of a trailing single quote. gdb/testsuite/ * gdb.base/list.exp (test_list_filename_and_function): Add test with single quotes. * gdb.cp/overload.cc (intToChar): Rewrite onto one line for easy matching. * gdb.cp/overload.exp: Add tests with filename, function, and quotes. Add KFAIL'd tests for PR gdb/11289. --- gdb/ChangeLog | 6 +++++ gdb/linespec.c | 44 +++++++++++++++++++++++-------- gdb/testsuite/ChangeLog | 9 +++++++ gdb/testsuite/gdb.base/list.exp | 3 +++ gdb/testsuite/gdb.cp/overload.cc | 5 +--- gdb/testsuite/gdb.cp/overload.exp | 15 +++++++++++ 6 files changed, 67 insertions(+), 15 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 564983b2a57..d7d71fde570 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2010-02-16 Daniel Jacobowitz + + * linespec.c (decode_line_1): Handle FILE:FUNCTION even if + FUNCTION contains parentheses. Improve removal of a trailing + single quote. + 2010-02-16 Daniel Jacobowitz * gcore.c (do_bfd_delete_cleanup): New function. diff --git a/gdb/linespec.c b/gdb/linespec.c index 74902b6f9d7..60d76112403 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -698,6 +698,8 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, int is_quote_enclosed; int is_objc_method = 0; char *saved_arg = *argptr; + /* If IS_QUOTED, the end of the quoted bit. */ + char *end_quote = NULL; if (not_found_ptr) *not_found_ptr = 0; @@ -717,6 +719,8 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, */ set_flags (*argptr, &is_quoted, &paren_pointer); + if (is_quoted) + end_quote = skip_quoted (*argptr); /* Check to see if it's a multipart linespec (with colons or periods). */ @@ -747,13 +751,13 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, return values; } + if (is_quoted) + *argptr = *argptr + 1; + /* Does it look like there actually were two parts? */ - if ((p[0] == ':' || p[0] == '.') && paren_pointer == NULL) + if (p[0] == ':' || p[0] == '.') { - if (is_quoted) - *argptr = *argptr + 1; - /* Is it a C++ or Java compound data structure? The check on p[1] == ':' is capturing the case of "::", since p[0]==':' was checked above. @@ -762,14 +766,30 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, can return now. */ if (p[0] == '.' || p[1] == ':') - return decode_compound (argptr, funfirstline, canonical, - saved_arg, p, not_found_ptr); + { + if (paren_pointer == NULL) + return decode_compound (argptr, funfirstline, canonical, + saved_arg, p, not_found_ptr); + /* Otherwise, fall through to decode_variable below. */ + } + else + { + /* No, the first part is a filename; set file_symtab to be that file's + symtab. Also, move argptr past the filename. */ - /* No, the first part is a filename; set file_symtab to be that file's - symtab. Also, move argptr past the filename. */ + file_symtab = symtab_from_filename (argptr, p, is_quote_enclosed, + not_found_ptr); - file_symtab = symtab_from_filename (argptr, p, is_quote_enclosed, - not_found_ptr); + /* Check for single quotes on the non-filename part. */ + if (!is_quoted) + { + is_quoted = (**argptr + && strchr (get_gdb_completer_quote_characters (), + **argptr) != NULL); + if (is_quoted) + end_quote = skip_quoted (*argptr); + } + } } #if 0 /* No one really seems to know why this was added. It certainly @@ -829,7 +849,7 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, p = skip_quoted (*argptr + (((*argptr)[1] == '$') ? 2 : 1)); else if (is_quoted) { - p = skip_quoted (*argptr); + p = end_quote; if (p[-1] != '\'') error (_("Unmatched single quote.")); } @@ -862,6 +882,8 @@ decode_line_1 (char **argptr, int funfirstline, struct symtab *default_symtab, copy[p - *argptr - 1] = '\0'; copy++; } + else if (is_quoted) + copy[p - *argptr - 1] = '\0'; while (*p == ' ' || *p == '\t') p++; *argptr = p; diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 3f1096579f4..2d857f96c49 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2010-02-16 Daniel Jacobowitz + + * gdb.base/list.exp (test_list_filename_and_function): Add test + with single quotes. + * gdb.cp/overload.cc (intToChar): Rewrite onto one line for easy + matching. + * gdb.cp/overload.exp: Add tests with filename, function, and quotes. + Add KFAIL'd tests for PR gdb/11289. + 2010-02-16 Daniel Jacobowitz * gdb.cp/cpcompletion.exp: Specify source file name explicitly. diff --git a/gdb/testsuite/gdb.base/list.exp b/gdb/testsuite/gdb.base/list.exp index ba3e63772b3..11804c834f2 100644 --- a/gdb/testsuite/gdb.base/list.exp +++ b/gdb/testsuite/gdb.base/list.exp @@ -473,6 +473,9 @@ proc test_list_filename_and_function {} { pass "list filename:function ($testcnt tests)" + # Test with quoting. + gdb_test "list 'list0.c:main'" "int main.*" + # Test some invalid specs # The following test takes the FIXME result on most systems using # DWARF. It fails to notice that main() is not in the file requested. diff --git a/gdb/testsuite/gdb.cp/overload.cc b/gdb/testsuite/gdb.cp/overload.cc index e643d4cdfde..78fae1455fc 100644 --- a/gdb/testsuite/gdb.cp/overload.cc +++ b/gdb/testsuite/gdb.cp/overload.cc @@ -56,10 +56,7 @@ namespace N { int nsoverload (int x, int y) { return x + y; } }; -int intToChar (char c) -{ - return 297; -} +int intToChar (char c) { return 297; } void marker1() {} diff --git a/gdb/testsuite/gdb.cp/overload.exp b/gdb/testsuite/gdb.cp/overload.exp index 317cbc5eb69..101be4a5d82 100644 --- a/gdb/testsuite/gdb.cp/overload.exp +++ b/gdb/testsuite/gdb.cp/overload.exp @@ -293,6 +293,21 @@ gdb_test "list \"foo::overloadfnarg(int, int (*)(int))\"" \ "int foo::overloadfnarg.*\\(int arg, int \\(\\*foo\\) \\(int\\)\\).*" \ "list overloaded function with function ptr args - quotes around argument" +# Test list with filename. + +gdb_test "list ${srcfile}:intToChar" "int intToChar.*" +gdb_test "list ${srcfile}:intToChar(char)" "int intToChar.*" +gdb_test "list ${srcfile}:'intToChar(char)'" "int intToChar.*" +gdb_test "list '${srcfile}:intToChar(char)'" "int intToChar.*" + +# And with filename and namespace... which does not work. + +setup_kfail *-*-* gdb/11289 +gdb_test "list ${srcfile}:foo::overloadfnarg(int)" "int foo::overloadfnarg" + +setup_kfail *-*-* gdb/11289 +gdb_test "list ${srcfile}:'foo::overloadfnarg(int)'" "int foo::overloadfnarg" + # Now some tests to see how overloading and namespaces interact. gdb_test "print overloadNamespace(1)" ".\[0-9\]* = 1"