aboutsummaryrefslogtreecommitdiff
path: root/gdb/linespec.c
diff options
context:
space:
mode:
authorJoel Brobecker <brobecker@gnat.com>2012-01-04 14:24:57 +0000
committerJoel Brobecker <brobecker@gnat.com>2012-01-04 14:24:57 +0000
commit1dabb4c40720ac3cc311f1cf6cb0b144d34f1af3 (patch)
tree6e96f3f43134740081832dcb2d512b9968d4ab86 /gdb/linespec.c
parent5931a2fae3e830d0eac105fc60c9652432be6a54 (diff)
downloadgdb-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.c53
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
{