diff options
author | Daniel Jacobowitz <drow@false.org> | 2010-02-16 20:51:51 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2010-02-16 20:51:51 +0000 |
commit | 791dfb6488c972e2352ff5c3b4aa5659ce476136 (patch) | |
tree | 8df2dc07b5461cf5d0868edfe205d1538e5e695f /gdb/linespec.c | |
parent | 14d1346bd3b6fc51d1144d2060ee1e6822341c5d (diff) | |
download | gdb-791dfb6488c972e2352ff5c3b4aa5659ce476136.zip gdb-791dfb6488c972e2352ff5c3b4aa5659ce476136.tar.gz gdb-791dfb6488c972e2352ff5c3b4aa5659ce476136.tar.bz2 |
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.
Diffstat (limited to 'gdb/linespec.c')
-rw-r--r-- | gdb/linespec.c | 44 |
1 files changed, 33 insertions, 11 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c index 74902b6..60d7611 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; |