linespec rewrite:
* linespec.c (decode_compound): Remove. (enum offset_relative_sign): New enum. (struct line_offset): New struct. (struct linespec): New struct. (struct linespec_state): Move file_symtabs, user_filename, and user_function into struct linespec. Make result an anonymous struct holding vectors of symbolp and minsym_and_objfile_d. Add language member. (enum ls_token_type): New enum. (linespec_keywords): New array. (struct ls_token): New struct. (struct ls_parser): New struct. (linespec_lexer_lex_number): New function. (linespec_lexer_lex_keyword): New function. (is_ada_operator): New function. (skip_quote_char): New function. (copy_token_string): New function. (is_closing_quote_enclosed): New function. (find_parameter_list_end): New function. (linespec_lexer_lex_string): New function. (linespec_lexer_lex_one): New function. (linespec_lexer_consume_token): New function. (linespec_lexer_peek_token): New function. (cplusplus_error): Remove unused function. (find_methods): Update comment. (find_toplevel_char): Return const. (is_objc_method_format): Remove unused function. (find_toplevel_string): New function. (is_linespec_boundary): Remove. (symbol_not_found_error): New function. (find_method_overload_end): Remove function. (unexpected_linespec_error): New function. (keep_name_info): Remove. (linespec_parse_line_offset): New function. (linespec_parse_basic): New function. (canonicalize_linespec): New function. (decode_line_internal): Remove. (create_sals_line_offset): New function adapted from decode_all_digits. (convert_linespec_to_sals): New function. (parse_linespec): New function. (linespec_parser_new): New function. (linespec_state_destructor): Change parameter type to struct linespec_state *. Add language parameter. Remove freeing of moved members. (linespec_parser_delete): New function. (decode_line_full): Use parse_linespec and linespec_parser_new. (decode_line_1): Likewise. (decode_indirect): Rename to ... (linespec_expression_to_pc): ... this and rewrite to simply find CORE_ADDR, storing this result for later conversion to SALs. (locate_first_half): Remove. (deocde_objc): Add parameter LS. Initialize new struct collect_info members. Handle minimal symbols, too. (decode_compound): Delete. (lookup_prefix_sym): Rewrite. (compare_msymbols): New function. (find_method): Rewrite. Do not call cplusplus_error. (symtabs_from_filename): Rewrite. (collect_function_symbols): Delete. (find_function_symbols): Rewrite without ARGPTR-style processing. (decode_all_digits): Delete. (Rewritten as create_sals_line_offset.) (decode_dollar): Adapted and renamed to ... (linespec_parse_variable): ... this. (find_linespec_symbols): New function. (decode_label): Adapted and renamed to ... (find_label_symbols): ... this. (decode_digits_list_mode): Add and use LS argument. (decode_digits_ordinary): Likewise. (collect_symbols): Do not collect SALs, just symbols and msymbols. If in list mode, allow any symbol class. Otherwise, only permit LOC_BLOCK symbols. (minsym_found): Update comments. (search_minsyms_for_name): Do not convert the matching symbol into a SAL. Simply push the symbol and objfile into the result vector. (decode_variable): Delete. Contents adapted into find_linespec_symbols. * cp-support.c (SKIP_SPACE): Remove. (operator_tokens): Remove unused global. (cp_validate_operator): Remove. * cp-support.h (cp_validate_operator): Remove declaration. * gdb.base/advance.exp: Update error message for "advance malformed" test. * gdb.base/break.exp: Likewise for "breakpoint with trailing garbage" test. * gdb.base/hbreak2.exp: Likewise for "hardware breakpoint with trailing garbage" test. * gdb.base/jump.exp: Likewise for "jump with trailing argument junk" test. * gdb.base/sepdebug.exp: Likewise for "breakpoint with trailng garbage" test. * gdb.base/until.exp: Likewise for "malformed until" test. * gdb.cp/ovldbreak.exp: Create the breakpoint table for "breakpoint info (after setting on all)". * gdb.cp/userdef.exp: Remove quoting for "break A2::operator+" tests. * gdb.cp/cplabel.cc: New file. * gdb.cp/cplabel.exp: New test. * gdb.linespec/ls-errs.c: New file. * gdb.linespec/ls-errs.exp: New test.
This commit is contained in:
parent
9d236627e7
commit
40e084e177
@ -1,3 +1,95 @@
|
||||
2012-04-05 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
* linespec.c (decode_compound): Remove.
|
||||
(enum offset_relative_sign): New enum.
|
||||
(struct line_offset): New struct.
|
||||
(struct linespec): New struct.
|
||||
(struct linespec_state): Move file_symtabs,
|
||||
user_filename, and user_function into struct linespec.
|
||||
Make result an anonymous struct holding vectors of
|
||||
symbolp and minsym_and_objfile_d.
|
||||
Add language member.
|
||||
(enum ls_token_type): New enum.
|
||||
(linespec_keywords): New array.
|
||||
(struct ls_token): New struct.
|
||||
(struct ls_parser): New struct.
|
||||
(linespec_lexer_lex_number): New function.
|
||||
(linespec_lexer_lex_keyword): New function.
|
||||
(is_ada_operator): New function.
|
||||
(skip_quote_char): New function.
|
||||
(copy_token_string): New function.
|
||||
(is_closing_quote_enclosed): New function.
|
||||
(find_parameter_list_end): New function.
|
||||
(linespec_lexer_lex_string): New function.
|
||||
(linespec_lexer_lex_one): New function.
|
||||
(linespec_lexer_consume_token): New function.
|
||||
(linespec_lexer_peek_token): New function.
|
||||
(cplusplus_error): Remove unused function.
|
||||
(find_methods): Update comment.
|
||||
(find_toplevel_char): Return const.
|
||||
(is_objc_method_format): Remove unused function.
|
||||
(find_toplevel_string): New function.
|
||||
(is_linespec_boundary): Remove.
|
||||
(symbol_not_found_error): New function.
|
||||
(find_method_overload_end): Remove function.
|
||||
(unexpected_linespec_error): New function.
|
||||
(keep_name_info): Remove.
|
||||
(linespec_parse_line_offset): New function.
|
||||
(linespec_parse_basic): New function.
|
||||
(canonicalize_linespec): New function.
|
||||
(decode_line_internal): Remove.
|
||||
(create_sals_line_offset): New function adapted from
|
||||
decode_all_digits.
|
||||
(convert_linespec_to_sals): New function.
|
||||
(parse_linespec): New function.
|
||||
(linespec_parser_new): New function.
|
||||
(linespec_state_destructor): Change parameter type to
|
||||
struct linespec_state *.
|
||||
Add language parameter.
|
||||
Remove freeing of moved members.
|
||||
(linespec_parser_delete): New function.
|
||||
(decode_line_full): Use parse_linespec and linespec_parser_new.
|
||||
(decode_line_1): Likewise.
|
||||
(decode_indirect): Rename to ...
|
||||
(linespec_expression_to_pc): ... this and rewrite
|
||||
to simply find CORE_ADDR, storing this result for later
|
||||
conversion to SALs.
|
||||
(locate_first_half): Remove.
|
||||
(deocde_objc): Add parameter LS.
|
||||
Initialize new struct collect_info members.
|
||||
Handle minimal symbols, too.
|
||||
(decode_compound): Delete.
|
||||
(lookup_prefix_sym): Rewrite.
|
||||
(compare_msymbols): New function.
|
||||
(find_method): Rewrite.
|
||||
Do not call cplusplus_error.
|
||||
(symtabs_from_filename): Rewrite.
|
||||
(collect_function_symbols): Delete.
|
||||
(find_function_symbols): Rewrite without ARGPTR-style
|
||||
processing.
|
||||
(decode_all_digits): Delete. (Rewritten as create_sals_line_offset.)
|
||||
(decode_dollar): Adapted and renamed to ...
|
||||
(linespec_parse_variable): ... this.
|
||||
(find_linespec_symbols): New function.
|
||||
(decode_label): Adapted and renamed to ...
|
||||
(find_label_symbols): ... this.
|
||||
(decode_digits_list_mode): Add and use LS argument.
|
||||
(decode_digits_ordinary): Likewise.
|
||||
(collect_symbols): Do not collect SALs, just symbols and msymbols.
|
||||
If in list mode, allow any symbol class. Otherwise, only
|
||||
permit LOC_BLOCK symbols.
|
||||
(minsym_found): Update comments.
|
||||
(search_minsyms_for_name): Do not convert the matching symbol
|
||||
into a SAL. Simply push the symbol and objfile into the
|
||||
result vector.
|
||||
(decode_variable): Delete. Contents adapted into
|
||||
find_linespec_symbols.
|
||||
|
||||
* cp-support.c (SKIP_SPACE): Remove.
|
||||
(operator_tokens): Remove unused global.
|
||||
(cp_validate_operator): Remove.
|
||||
* cp-support.h (cp_validate_operator): Remove declaration.
|
||||
|
||||
2012-04-03 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* cp-valprint.c (cp_print_value_fields): Check valprint_check_validity
|
||||
|
117
gdb/cp-support.c
117
gdb/cp-support.c
@ -73,19 +73,6 @@ struct cmd_list_element *maint_cplus_cmd_list = NULL;
|
||||
static void maint_cplus_command (char *arg, int from_tty);
|
||||
static void first_component_command (char *arg, int from_tty);
|
||||
|
||||
/* Operator validation.
|
||||
NOTE: Multi-byte operators (usually the assignment variety
|
||||
operator) must appear before the single byte version, i.e., "+="
|
||||
before "+". */
|
||||
static const char *operator_tokens[] =
|
||||
{
|
||||
"++", "+=", "+", "->*", "->", "--", "-=", "-", "*=", "*",
|
||||
"/=", "/", "%=", "%", "!=", "==", "!", "&&", "<<=", "<<",
|
||||
">>=", ">>", "<=", "<", ">=", ">", "~", "&=", "&", "|=",
|
||||
"||", "|", "^=", "^", "=", "()", "[]", ",", "new", "delete"
|
||||
/* new[] and delete[] require special whitespace handling */
|
||||
};
|
||||
|
||||
/* A list of typedefs which should not be substituted by replace_typedefs. */
|
||||
static const char * const ignore_typedefs[] =
|
||||
{
|
||||
@ -1459,110 +1446,6 @@ first_component_command (char *arg, int from_tty)
|
||||
|
||||
extern initialize_file_ftype _initialize_cp_support; /* -Wmissing-prototypes */
|
||||
|
||||
#define SKIP_SPACE(P) \
|
||||
do \
|
||||
{ \
|
||||
while (*(P) == ' ' || *(P) == '\t') \
|
||||
++(P); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
/* Returns the length of the operator name or 0 if INPUT does not
|
||||
point to a valid C++ operator. INPUT should start with
|
||||
"operator". */
|
||||
int
|
||||
cp_validate_operator (const char *input)
|
||||
{
|
||||
int i;
|
||||
char *copy;
|
||||
const char *p;
|
||||
struct expression *expr;
|
||||
struct value *val;
|
||||
volatile struct gdb_exception except;
|
||||
|
||||
p = input;
|
||||
|
||||
if (strncmp (p, "operator", 8) == 0)
|
||||
{
|
||||
int valid = 0;
|
||||
|
||||
p += 8;
|
||||
SKIP_SPACE (p);
|
||||
for (i = 0;
|
||||
i < sizeof (operator_tokens) / sizeof (operator_tokens[0]);
|
||||
++i)
|
||||
{
|
||||
int length = strlen (operator_tokens[i]);
|
||||
|
||||
/* By using strncmp here, we MUST have operator_tokens
|
||||
ordered! See additional notes where operator_tokens is
|
||||
defined above. */
|
||||
if (strncmp (p, operator_tokens[i], length) == 0)
|
||||
{
|
||||
const char *op = p;
|
||||
|
||||
valid = 1;
|
||||
p += length;
|
||||
|
||||
if (strncmp (op, "new", 3) == 0
|
||||
|| strncmp (op, "delete", 6) == 0)
|
||||
{
|
||||
|
||||
/* Special case: new[] and delete[]. We must be
|
||||
careful to swallow whitespace before/in "[]". */
|
||||
SKIP_SPACE (p);
|
||||
|
||||
if (*p == '[')
|
||||
{
|
||||
++p;
|
||||
SKIP_SPACE (p);
|
||||
if (*p == ']')
|
||||
++p;
|
||||
else
|
||||
valid = 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (valid)
|
||||
return (p - input);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check input for a conversion operator. */
|
||||
|
||||
/* Skip past base typename. */
|
||||
while (*p != '*' && *p != '&' && *p != 0 && *p != ' ')
|
||||
++p;
|
||||
SKIP_SPACE (p);
|
||||
|
||||
/* Add modifiers '*' / '&'. */
|
||||
while (*p == '*' || *p == '&')
|
||||
{
|
||||
++p;
|
||||
SKIP_SPACE (p);
|
||||
}
|
||||
|
||||
/* Check for valid type. [Remember: input starts with
|
||||
"operator".] */
|
||||
copy = savestring (input + 8, p - input - 8);
|
||||
expr = NULL;
|
||||
val = NULL;
|
||||
TRY_CATCH (except, RETURN_MASK_ALL)
|
||||
{
|
||||
expr = parse_expression (copy);
|
||||
val = evaluate_type (expr);
|
||||
}
|
||||
|
||||
xfree (copy);
|
||||
if (expr)
|
||||
xfree (expr);
|
||||
|
||||
if (val != NULL && value_type (val) != NULL)
|
||||
return (p - input);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Implement "info vtbl". */
|
||||
|
||||
|
@ -170,8 +170,6 @@ extern struct symbol **make_symbol_overload_list_adl (struct type **arg_types,
|
||||
extern struct type *cp_lookup_rtti_type (const char *name,
|
||||
struct block *block);
|
||||
|
||||
extern int cp_validate_operator (const char *input);
|
||||
|
||||
/* Functions/variables from cp-namespace.c. */
|
||||
|
||||
extern int cp_is_anonymous (const char *namespace);
|
||||
|
3375
gdb/linespec.c
3375
gdb/linespec.c
File diff suppressed because it is too large
Load Diff
@ -1,3 +1,23 @@
|
||||
2012-04-05 Keith Seitz <keiths@redhat.com>
|
||||
|
||||
* gdb.base/advance.exp: Update error message for
|
||||
"advance malformed" test.
|
||||
* gdb.base/break.exp: Likewise for "breakpoint with
|
||||
trailing garbage" test.
|
||||
* gdb.base/hbreak2.exp: Likewise for "hardware breakpoint
|
||||
with trailing garbage" test.
|
||||
* gdb.base/sepdebug.exp: Likewise for "breakpoint with
|
||||
trailng garbage" test.
|
||||
* gdb.base/until.exp: Likewise for "malformed until" test.
|
||||
* gdb.cp/ovldbreak.exp: Create the breakpoint table
|
||||
for "breakpoint info (after setting on all)".
|
||||
* gdb.cp/userdef.exp: Remove quoting for "break A2::operator+"
|
||||
tests.
|
||||
* gdb.cp/cplabel.cc: New file.
|
||||
* gdb.cp/cplabel.exp: New test.
|
||||
* gdb.linespec/ls-errs.c: New file.
|
||||
* gdb.linespec/ls-errs.exp: New test.
|
||||
|
||||
2012-04-03 Jan Kratochvil <jan.kratochvil@redhat.com>
|
||||
|
||||
* gdb.trace/unavailable.exp
|
||||
|
@ -45,7 +45,8 @@ gdb_test "advance [gdb_get_line_number "advance this location"]" \
|
||||
# Verify that a malformed "advance" is gracefully caught.
|
||||
#
|
||||
gdb_test "advance [gdb_get_line_number "advance malformed"] then stop" \
|
||||
"Junk at end of arguments." "malformed advance"
|
||||
"malformed linespec error: unexpected string, \"then stop\"" \
|
||||
"malformed advance"
|
||||
|
||||
# Verify that "advance <funcname>" works.
|
||||
#
|
||||
|
@ -600,7 +600,7 @@ gdb_test "break $bp_location12 thread foo" \
|
||||
# trailing garbage.
|
||||
#
|
||||
gdb_test "break $bp_location12 foo" \
|
||||
"Junk at end of arguments.*" \
|
||||
"malformed linespec error: unexpected string, \"foo\".*" \
|
||||
"breakpoint with trailing garbage disallowed"
|
||||
|
||||
# Verify that GDB responds gracefully to a "clear" command that has
|
||||
|
@ -356,7 +356,7 @@ gdb_test "hbreak $bp_location12 thread foo" \
|
||||
# trailing garbage.
|
||||
#
|
||||
gdb_test "hbreak $bp_location12 foo" \
|
||||
"Junk at end of arguments.*" \
|
||||
"malformed linespec error: unexpected string, \"foo\".*" \
|
||||
"hardware breakpoint with trailing garbage disallowed"
|
||||
|
||||
# Verify that GDB responds gracefully to a "clear" command that has
|
||||
|
@ -92,7 +92,7 @@ gdb_test "jump" "Argument required .starting address.*" \
|
||||
# trailing junk.
|
||||
#
|
||||
gdb_test "jump 21 100" \
|
||||
"Junk at end of line specification: 100.*" \
|
||||
"malformed linespec error: unexpected number, \"100\"" \
|
||||
"jump with trailing argument junk"
|
||||
|
||||
|
||||
|
@ -408,7 +408,7 @@ gdb_test "break $bp_location12 thread foo" \
|
||||
#
|
||||
|
||||
gdb_test "break $bp_location12 foo" \
|
||||
"Junk at end of arguments.*" \
|
||||
"malformed linespec error: unexpected string, \"foo\".*" \
|
||||
"breakpoint with trailing garbage disallowed"
|
||||
|
||||
# Verify that GDB responds gracefully to a "clear" command that has
|
||||
|
@ -40,7 +40,8 @@ gdb_test "until $bp_location1" \
|
||||
# Verify that a malformed "advance" is gracefully caught.
|
||||
#
|
||||
gdb_test "until 80 then stop" \
|
||||
"Junk at end of arguments." "malformed until"
|
||||
"malformed linespec error: unexpected string, \"then stop\"." \
|
||||
"malformed until"
|
||||
|
||||
# Rerun up to factorial, outer invocation
|
||||
if { ![runto factorial] } then { gdb_suppress_tests; }
|
||||
|
80
gdb/testsuite/gdb.cp/cplabel.cc
Normal file
80
gdb/testsuite/gdb.cp/cplabel.cc
Normal file
@ -0,0 +1,80 @@
|
||||
/* This testcase is part of GDB, the GNU debugger.
|
||||
|
||||
Copyright 2012 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
class foo
|
||||
{
|
||||
public:
|
||||
static int bar (void)
|
||||
{
|
||||
int i = 5;
|
||||
bool first = true;
|
||||
|
||||
to_the_top: /* bar:to_the_top */
|
||||
while (1)
|
||||
{
|
||||
if (i == 1)
|
||||
{
|
||||
if (first)
|
||||
{
|
||||
first = false;
|
||||
goto to_the_top;
|
||||
}
|
||||
else
|
||||
goto get_out_of_here;
|
||||
}
|
||||
|
||||
--i;
|
||||
}
|
||||
|
||||
get_out_of_here: /* bar:get_out_of_here */
|
||||
return i;
|
||||
}
|
||||
|
||||
int baz (int a)
|
||||
{
|
||||
int i = a;
|
||||
bool first = true;
|
||||
|
||||
to_the_top: /* baz:to_the_top */
|
||||
while (1)
|
||||
{
|
||||
if (i == 1)
|
||||
{
|
||||
if (first)
|
||||
{
|
||||
first = false;
|
||||
goto to_the_top;
|
||||
}
|
||||
else
|
||||
goto get_out_of_here;
|
||||
}
|
||||
|
||||
--i;
|
||||
}
|
||||
|
||||
get_out_of_here: /* baz:get_out_of_here */
|
||||
return i;
|
||||
}
|
||||
};
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
foo f;
|
||||
return f.baz (foo::bar () + 3);
|
||||
}
|
||||
|
40
gdb/testsuite/gdb.cp/cplabel.exp
Normal file
40
gdb/testsuite/gdb.cp/cplabel.exp
Normal file
@ -0,0 +1,40 @@
|
||||
# Copyright 2012 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Tests for breakpoint on labels in methods.
|
||||
|
||||
if {[skip_cplus_tests]} { continue }
|
||||
|
||||
set testfile cplabel
|
||||
set srcfile "$testfile.cc"
|
||||
if {[prepare_for_testing "$testfile.exp" $testfile $srcfile {c++ debug}]} {
|
||||
return -1
|
||||
}
|
||||
|
||||
if {![runto_main]} {
|
||||
untested "could not run to main"
|
||||
return -1
|
||||
}
|
||||
|
||||
set methods {"bar" "baz"}
|
||||
set labels {"to_the_top" "get_out_of_here"}
|
||||
|
||||
foreach m $methods {
|
||||
foreach l $labels {
|
||||
set line [gdb_get_line_number "$m:$l"]
|
||||
gdb_test "break foo::$m:$l" \
|
||||
"Breakpoint $decimal at $hex: file .*/$srcfile, line $line\."
|
||||
}
|
||||
}
|
@ -320,23 +320,17 @@ gdb_expect {
|
||||
}
|
||||
}
|
||||
|
||||
gdb_test "info break" \
|
||||
"Num Type\[\t \]+Disp Enb Address\[\t \]+What.*
|
||||
\[0-9\]+\[\t \]+breakpoint keep y\[\t \]+<MULTIPLE>\[\t \]*\r
|
||||
\[0-9\]+.1\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(double\\) at.*$srcfile:140\r
|
||||
\[0-9\]+.2\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(float\\) at.*$srcfile:137\r
|
||||
\[0-9\]+.3\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned long|long unsigned)( int)?\\) at.*$srcfile:134\r
|
||||
\[0-9\]+.4\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(long( int)?\\) at.*$srcfile:131\r
|
||||
\[0-9\]+.5\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned|unsigned int)\\) at.*$srcfile:128\r
|
||||
\[0-9\]+.6\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(int\\) at.*$srcfile:125\r
|
||||
\[0-9\]+.7\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((unsigned short|short unsigned)( int)?\\) at.*$srcfile:122\r
|
||||
\[0-9\]+.8\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(short( int)?\\) at.*$srcfile:119\r
|
||||
\[0-9\]+.9\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(unsigned char\\) at.*$srcfile:116\r
|
||||
\[0-9\]+.10\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(signed char\\) at.*$srcfile:113\r
|
||||
\[0-9\]+.11\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(char\\) at.*$srcfile:110\r
|
||||
\[0-9\]+.12\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\((void|)\\) at.*$srcfile:107" \
|
||||
"breakpoint info (after setting on all)"
|
||||
# Create the breakpoint table for "info breakpoint".
|
||||
set bptable "Num Type\[\t \]+Disp Enb Address\[\t \]+What.*\[\r\n]+"
|
||||
append bptable "\[0-9\]+\[\t \]+breakpoint\[\t \]+keep\[\t \]y\[\t \]+<MULTIPLE>.*\[\r\n\]+"
|
||||
foreach ovld {void char signed_char unsigned_char short_int \
|
||||
unsigned_short_int int unsigned_int long_int \
|
||||
unsigned_long_int float double} {
|
||||
append bptable [format "\[0-9\]+.\[0-9\]+\[\t \]+y\[\t \]+$hex\[\t \]+in foo::overload1arg\\(%s\\) at.*$srcfile:%d\[\r\n\]+" \
|
||||
$types($ovld) $line($ovld)]
|
||||
}
|
||||
|
||||
gdb_test "info break" $bptable "breakpoint info (after setting on all)"
|
||||
|
||||
# Run through each breakpoint.
|
||||
proc continue_to_bp_overloaded {bpnumber might_fail line argtype argument} {
|
||||
|
@ -136,8 +136,8 @@ gdb_test "print one += 7" "\\\$\[0-9\]* = {x = 9, y = 10}"
|
||||
gdb_test "print two = one" "\\\$\[0-9\]* = {x = 9, y = 10}"
|
||||
|
||||
# Check that GDB tolerates whitespace in operator names.
|
||||
gdb_test "break A2::'operator+'" ".*Breakpoint $decimal at.*"
|
||||
gdb_test "break A2::'operator +'" ".*Breakpoint $decimal at.*"
|
||||
gdb_test "break A2::operator+" ".*Breakpoint $decimal at.*"
|
||||
gdb_test "break A2::operator +" ".*Breakpoint $decimal at.*"
|
||||
|
||||
# Check that GDB handles operator* correctly.
|
||||
gdb_test "print c" "\\\$\[0-9\]* = {m = {z = .*}}"
|
||||
|
29
gdb/testsuite/gdb.linespec/ls-errs.c
Normal file
29
gdb/testsuite/gdb.linespec/ls-errs.c
Normal file
@ -0,0 +1,29 @@
|
||||
/* This testcase is part of GDB, the GNU debugger.
|
||||
|
||||
Copyright 2012 Free Software Foundation, Inc.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
||||
|
||||
int myfunction (void) { return 0; }
|
||||
|
||||
int
|
||||
main (void)
|
||||
{
|
||||
int a;
|
||||
|
||||
a = myfunction ();
|
||||
|
||||
here:
|
||||
return a;
|
||||
}
|
189
gdb/testsuite/gdb.linespec/ls-errs.exp
Normal file
189
gdb/testsuite/gdb.linespec/ls-errs.exp
Normal file
@ -0,0 +1,189 @@
|
||||
# Copyright 2012 Free Software Foundation, Inc.
|
||||
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
# Tests for linespec error conditions
|
||||
|
||||
set base ls-errs
|
||||
set srcfile "$base.c"
|
||||
set testfile "$base.exp"
|
||||
set exefile $base
|
||||
|
||||
if {[prepare_for_testing $testfile $exefile $srcfile \
|
||||
{debug nowarnings}]} {
|
||||
return -1
|
||||
}
|
||||
|
||||
# Turn off the pending breakpoint queries.
|
||||
gdb_test_no_output "set breakpoint pending off"
|
||||
|
||||
# We intentionally do not use gdb_breakpoint for these tests.
|
||||
|
||||
# Add the (invalid) LINESPEC to the test array named in ARRAY_NAME.
|
||||
# Use the index into ::error_messages MSG_ID and ARGS to create
|
||||
# an error message which is the expect result of attempting to
|
||||
# break on the given LINESPEC.
|
||||
proc add {array_name linespec msg_id args} {
|
||||
global error_messages
|
||||
upvar $array_name tests
|
||||
|
||||
lappend tests(linespecs) $linespec
|
||||
set tests("$linespec") [string_to_regexp \
|
||||
[eval format \$error_messages($msg_id) $args]]
|
||||
}
|
||||
|
||||
# Common error message format strings.
|
||||
array set error_messages {
|
||||
invalid_file "No source file named %s."
|
||||
invalid_function "Function \"%s\" not defined."
|
||||
invalid_var_or_func "Undefined convenience variable or function \"%s\" not defined."
|
||||
invalid_function_f "Function \"%s\" not defined in \"%s\"."
|
||||
invalid_var_or_func_f \
|
||||
"Undefined convenience variable or function \"%s\" not defined in \"%s\"."
|
||||
invalid_label "No label \"%s\" defined in function \"%s\"."
|
||||
invalid_offset "No line %d in the current file."
|
||||
invalid_offset_f "No line %d in file \"%s\"."
|
||||
unexpected "malformed linespec error: unexpected %s"
|
||||
unexpected_opt "malformed linespec error: unexpected %s, \"%s\""
|
||||
unmatched_quote "unmatched quote"
|
||||
}
|
||||
|
||||
# Some commonly used whitespace tests around ':'.
|
||||
set spaces [list ":" ": " " :" " : " "\t: " " :\t" "\t:\t" " \t:\t " \
|
||||
"\t \t:\t \t \t"]
|
||||
|
||||
# A list of invalid offsets.
|
||||
set invalid_offsets [list -100 +500 1000]
|
||||
|
||||
# THE_TESTS will hold all of our test information. Array index
|
||||
# "linespecs" will contain the complete list of all linespecs
|
||||
# to be tested. An array index of \"$linespec\" will contain
|
||||
# the expected result.
|
||||
set the_tests(linespecs) {}
|
||||
|
||||
# Try some simple, invalid linespecs involving spaces.
|
||||
foreach x $spaces {
|
||||
add the_tests $x unexpected "colon"
|
||||
}
|
||||
|
||||
# Test invalid filespecs starting with offset. This is done
|
||||
# first so that default offsets are tested.
|
||||
foreach x $invalid_offsets {
|
||||
set offset $x
|
||||
|
||||
# Relative offsets are relative to line 16. Adjust
|
||||
# expected offset from error message accordingly.
|
||||
if {[string index $x 0] == "+" ||
|
||||
[string index $x 0] == "-"} {
|
||||
incr offset 16
|
||||
}
|
||||
add the_tests $x invalid_offset $offset
|
||||
}
|
||||
|
||||
# Test offsets with trailing tokens w/ and w/o spaces.
|
||||
foreach x $spaces {
|
||||
add the_tests "3$x" unexpected "colon"
|
||||
add the_tests "+10$x" unexpected "colon"
|
||||
add the_tests "-10$x" unexpected "colon"
|
||||
}
|
||||
|
||||
foreach x {1 +1 +100 -10} {
|
||||
add the_tests "3 $x" unexpected_opt "number" $x
|
||||
add the_tests "+10 $x" unexpected_opt "number" $x
|
||||
add the_tests "-10 $x" unexpected_opt "number" $x
|
||||
}
|
||||
|
||||
add the_tests "3 foo" unexpected_opt "string" "foo"
|
||||
add the_tests "+10 foo" unexpected_opt "string" "foo"
|
||||
add the_tests "-10 foo" unexpected_opt "string" "foo"
|
||||
|
||||
# Test invalid linespecs starting with filename.
|
||||
foreach x [list "this_file_doesn't_exist.c" \
|
||||
"this file has spaces.c" \
|
||||
"\"file::colons.c\"" \
|
||||
"'file::colons.c'" \
|
||||
"\"this \"file\" has quotes.c\"" \
|
||||
"'this \"file\" has quotes.c'" \
|
||||
"'this 'file' has quotes.c'" \
|
||||
"\"this 'file' has quotes.c\""] {
|
||||
# Remove any quoting from FILENAME for the error message.
|
||||
add the_tests "$x:3" invalid_file [string trim $x \"']
|
||||
}
|
||||
|
||||
# Test unmatched quotes.
|
||||
foreach x {"\"src-file.c'" "'src-file.c"} {
|
||||
add the_tests "$x:3" unmatched_quote
|
||||
}
|
||||
|
||||
add the_tests $srcfile invalid_function $srcfile
|
||||
foreach x {"foo" " foo" " foo "} {
|
||||
# Trim any leading/trailing whitespace for error messages.
|
||||
add the_tests "$srcfile:$x" invalid_function_f [string trim $x] $srcfile
|
||||
add the_tests "$srcfile:main:$x" invalid_label [string trim $x] "main"
|
||||
}
|
||||
|
||||
foreach x $spaces {
|
||||
add the_tests "$srcfile$x" unexpected "end of input"
|
||||
add the_tests "$srcfile:main$x" unexpected "end of input"
|
||||
}
|
||||
|
||||
add the_tests "${srcfile}::" invalid_function "${srcfile}::"
|
||||
add the_tests "$srcfile:3 1" unexpected_opt "number" "1"
|
||||
add the_tests "$srcfile:3 +100" unexpected_opt "number" "+100"
|
||||
add the_tests "$srcfile:3 -100" unexpected_opt "number" "-100"
|
||||
add the_tests "$srcfile:3 foo" unexpected_opt "string" "foo"
|
||||
|
||||
foreach x $invalid_offsets {
|
||||
add the_tests "$srcfile:$x" invalid_offset_f $x $srcfile
|
||||
}
|
||||
|
||||
# Test invalid filespecs starting with function.
|
||||
foreach x {"foobar" "foo::bar" "foo.bar" "foo ." "foo bar" "foo 1" \
|
||||
"foo 0" "foo +10" "foo -10" "foo +100" "foo -100"} {
|
||||
add the_tests $x invalid_function $x
|
||||
}
|
||||
|
||||
foreach x $spaces {
|
||||
add the_tests "main${x}there" invalid_label "there" "main"
|
||||
add the_tests "main:here${x}" unexpected "end of input"
|
||||
}
|
||||
|
||||
add the_tests "main 3" invalid_function "main 3"
|
||||
add the_tests "main +100" invalid_function "main +100"
|
||||
add the_tests "main -100" invalid_function "main -100"
|
||||
add the_tests "main foo" invalid_function "main foo"
|
||||
|
||||
foreach x {"3" "+100" "-100" "foo"} {
|
||||
add the_tests "main:here $x" invalid_label "here $x" "main"
|
||||
}
|
||||
|
||||
foreach x {"if" "task" "thread"} {
|
||||
add the_tests $x unexpected_opt "keyword" $x
|
||||
}
|
||||
|
||||
add the_tests "'main.c'flubber" unexpected_opt "string" "flubber"
|
||||
add the_tests "'main.c',21" invalid_function "main.c"
|
||||
add the_tests "'main.c' " invalid_function "main.c"
|
||||
add the_tests "'main.c'3" unexpected_opt "number" "3"
|
||||
add the_tests "'main.c'+3" unexpected_opt "number" "+3"
|
||||
|
||||
# Test undefined convenience variables.
|
||||
set x {$zippo}
|
||||
add the_tests $x invalid_var_or_func $x
|
||||
add the_tests "$srcfile:$x" invalid_var_or_func_f $x $srcfile
|
||||
|
||||
# Run the tests
|
||||
foreach linespec $the_tests(linespecs) {
|
||||
gdb_test "break $linespec" $the_tests("$linespec")
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user