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:
Keith Seitz 2012-04-05 18:50:29 +00:00
parent 9d236627e7
commit 40e084e177
17 changed files with 2325 additions and 1663 deletions

View File

@ -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

View File

@ -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". */

View File

@ -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);

File diff suppressed because it is too large Load Diff

View File

@ -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

View File

@ -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.
#

View File

@ -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

View File

@ -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

View File

@ -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"

View File

@ -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

View File

@ -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; }

View 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);
}

View 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\."
}
}

View File

@ -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} {

View File

@ -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 = .*}}"

View 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;
}

View 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")
}