# Copyright 2025 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 . # Test 'forward-search' and 'reverse-search' commands. This test # relies on some hard-coded line numbers relating to the source file. # We could switch to using gdb_get_line_number, but it doesn't feel # like that would add much value; just don't change the source file. standard_testfile if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } { return } gdb_test "forward-search This testcase is part" \ "1\\s+/\\* This testcase is part of GDB, the GNU debugger\\." \ "search for first line of the file" gdb_test "forward-search This testcase is part" \ "Expression not found" \ "repeated search doesn't find the same first line" # The 'reverse-search' command starts searching from the line before # the last line displayed. So in this case, the reverse search starts # from line 0, i.e. nothing is searched. gdb_test "reverse-search This testcase is part" \ "Expression not found" \ "reverse search doesn't find the first line either" # List some source lines, and then perform some forward-searches. The # searches start from the first line after the last line displayed. gdb_test "list 20" ".*" \ "list source code ahead of a forward-search" gdb_test "forward-search Line 2" \ "25\\s+/\\* Line 25 \\*/" \ "first forward-search after a list" gdb_test "forward-search Line 2" \ "26\\s+/\\* Line 26 \\*/" \ "second forward-search after a list" gdb_test "forward-search Line 2" \ "27\\s+/\\* Line 27 \\*/" \ "third forward-search after a list" # Now reverse-search from where we got too. gdb_test "reverse-search Line 2" \ "26\\s+/\\* Line 26 \\*/" \ "first reverse-search for 'Line 2'" gdb_test "reverse-search Line 2" \ "25\\s+/\\* Line 25 \\*/" \ "second reverse-search for 'Line 2'" gdb_test "reverse-search Line 2" \ "24\\s+/\\* Line 24 \\*/" \ "third reverse-search for 'Line 2'" # List some source lines, and then perform a reverse-search. The # search starts frm the first line before the last line displayed. gdb_test "list 20" ".*" \ "list source code ahead of a reverse-search" gdb_test "reverse-search Line 2" \ "23\\s+/\\* Line 23 \\*/" \ "reverse-search after a list" # List the last lines of the file, then reverse search for the last # line. As reverse-search starts on the line before the last line # displayed, this will fail to find the last line. gdb_test "list 127" gdb_test "reverse-search Last line" \ "Expression not found" \ "reverse search for the last line fails" # List some lines from the middle of the file. Then try an invalid # 'list' command. Finally, check searches pick up from the middle of # the file where the first 'list' successfully completed. foreach_with_prefix search_direction { forward reverse } { foreach_with_prefix bad_list { out-of-range backwards } { gdb_test "list 50" if { $bad_list eq "out-of-range" } { gdb_test "list 1000" \ "Line number 995 out of range; \[^\r\n\]+ has 127 lines\\." } else { gdb_test_no_output "list 60,50" } if { $search_direction eq "forward" } { set line 55 } else { set line 53 } gdb_test "${search_direction}-search Line" \ "$line\\s+/\\* Line $line \\*/" } }