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.
This commit is contained in:
Joel Brobecker
2012-01-04 14:24:57 +00:00
parent 5931a2fae3
commit 1dabb4c407
2 changed files with 42 additions and 25 deletions

View File

@ -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;
if (is_quote_enclosed)
++saved_arg;
/* Initialize it just to avoid a GCC false warning. */
memset (&values, 0, sizeof (values));
TRY_CATCH (ex, RETURN_MASK_ERROR)
/* 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)
{
values = decode_compound (self, argptr, saved_arg, p);
struct symtabs_and_lines values;
volatile struct gdb_exception ex;
char *saved_argptr = *argptr;
if (is_quote_enclosed)
++saved_arg;
/* 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;
if (ex.reason >= 0)
{
do_cleanups (cleanup);
return values;
}
if (ex.error != NOT_FOUND_ERROR)
throw_exception (ex);
*argptr = saved_argptr;
}
if ((is_quoted || is_squote_enclosed) && **argptr == '\'')
*argptr = *argptr + 1;
if (ex.reason >= 0)
{
do_cleanups (cleanup);
return values;
}
if (ex.error != NOT_FOUND_ERROR)
throw_exception (ex);
*argptr = saved_argptr;
}
else
{