diff options
author | Joel Brobecker <brobecker@gnat.com> | 2012-01-04 14:24:57 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2012-01-04 14:24:57 +0000 |
commit | 1dabb4c40720ac3cc311f1cf6cb0b144d34f1af3 (patch) | |
tree | 6e96f3f43134740081832dcb2d512b9968d4ab86 /gdb/linespec.c | |
parent | 5931a2fae3e830d0eac105fc60c9652432be6a54 (diff) | |
download | gdb-1dabb4c40720ac3cc311f1cf6cb0b144d34f1af3.zip gdb-1dabb4c40720ac3cc311f1cf6cb0b144d34f1af3.tar.gz gdb-1dabb4c40720ac3cc311f1cf6cb0b144d34f1af3.tar.bz2 |
do not call decode_compound with Ada expressions.
Trying to insert a breakpoint on `ops."<"', we get the following error:
(gdb) b ops."<"
malformed template specification in command
This is because locate_first_half skips the linespec until the dot,
and the decode_line_internal thinks that the dot might mean that
we have C++ or Java compound. It then tries calling decode_compound
which errors out because it sees the opening angle bracket but not
the closing one (I am guessing).
This patch short-circuits this part of the code when the current
language is Ada.
gdb/ChangeLog:
* linespec.c (decode_line_internal): Check for C++ or Java
compound constructs only if the current language is C, C++
or Java.
Diffstat (limited to 'gdb/linespec.c')
-rw-r--r-- | gdb/linespec.c | 53 |
1 files changed, 32 insertions, 21 deletions
diff --git a/gdb/linespec.c b/gdb/linespec.c index 6276a3a..55cfec3 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -951,33 +951,44 @@ decode_line_internal (struct linespec_state *self, char **argptr) if (p[0] == '.' || p[1] == ':') { - struct symtabs_and_lines values; - volatile struct gdb_exception ex; - char *saved_argptr = *argptr; + /* We only perform this check for the languages where it might + make sense. For instance, Ada does not use this type of + syntax, and trying to apply this logic on an Ada linespec + may trigger a spurious error (for instance, decode_compound + does not like expressions such as `ops."<"', which is a + valid function name in Ada). */ + if (current_language->la_language == language_c + || current_language->la_language == language_cplus + || current_language->la_language == language_java) + { + struct symtabs_and_lines values; + volatile struct gdb_exception ex; + char *saved_argptr = *argptr; - if (is_quote_enclosed) - ++saved_arg; + if (is_quote_enclosed) + ++saved_arg; - /* Initialize it just to avoid a GCC false warning. */ - memset (&values, 0, sizeof (values)); + /* Initialize it just to avoid a GCC false warning. */ + memset (&values, 0, sizeof (values)); - TRY_CATCH (ex, RETURN_MASK_ERROR) - { - values = decode_compound (self, argptr, saved_arg, p); - } - if ((is_quoted || is_squote_enclosed) && **argptr == '\'') - *argptr = *argptr + 1; + TRY_CATCH (ex, RETURN_MASK_ERROR) + { + values = decode_compound (self, argptr, saved_arg, p); + } + if ((is_quoted || is_squote_enclosed) && **argptr == '\'') + *argptr = *argptr + 1; - if (ex.reason >= 0) - { - do_cleanups (cleanup); - return values; - } + if (ex.reason >= 0) + { + do_cleanups (cleanup); + return values; + } - if (ex.error != NOT_FOUND_ERROR) - throw_exception (ex); + if (ex.error != NOT_FOUND_ERROR) + throw_exception (ex); - *argptr = saved_argptr; + *argptr = saved_argptr; + } } else { |