+ gdb_test "step" "foo \\(\\) at.*" "step 1"
+ gdb_test "step" ".*" "step 2"; # Return from foo()
+ gdb_test "step" "main \\(\\) at.*" "step 3"
+}
+
+# Admin tests (disable,enable,delete).
+
+with_test_prefix "admin" {
+ gdb_test "skip disable"
+ gdb_test "info skip" \
+ "Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
+2\\s+n\\s+n\\s+<none>\\s+n\\s+main\\s*
+3\\s+n\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
+4\\s+n\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
+ "info skip after disabling all"
+
+ gdb_test "skip enable"
+ gdb_test "info skip" \
+ "Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
+2\\s+y\\s+n\\s+<none>\\s+n\\s+main\\s*
+3\\s+y\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
+4\\s+y\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
+ "info skip after enabling all"
+
+ gdb_test "skip disable 4 2-3"
+ gdb_test "info skip" \
+ "Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
+2\\s+n\\s+n\\s+<none>\\s+n\\s+main\\s*
+3\\s+n\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
+4\\s+n\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
+ "info skip after disabling 4 2-3"
+
+ gdb_test "skip enable 2-3"
+ gdb_test "info skip" \
+ "Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
+2\\s+y\\s+n\\s+<none>\\s+n\\s+main\\s*
+3\\s+y\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*
+4\\s+n\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
+ "info skip after enabling 2-3"
+
+ gdb_test "info skip 2-3" \
+ "Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
+2\\s+y\\s+n\\s+<none>\\s+n\\s+main\\s*
+3\\s+y\\s+n\\s+$srcfile1\\s+n\\s+<none>\\s*"
+
+ gdb_test "skip delete 2 3"
+ gdb_test "info skip" \
+ "Num\\s+Enb\\s+Glob\\s+File\\s+RE\\s+Function\\s*
+4\\s+n\\s+n\\s+<none>\\s+n\\s+baz\\s*" \
+ "info skip after deleting 2 3"
+
+ gdb_test "skip delete"
+ gdb_test "info skip" "Not skipping any files or functions\." \
+ "info skip after deleting all"
+}
+
+# Now test skip -fi, etc.
+
+# Create a skiplist entry for a specified file and function.
+gdb_test "skip -fi skip1.c" "File .*$srcfile1 will be skipped when stepping\."
+gdb_test "skip -gfi sk*1.c" "File\\(s\\) sk\\*1.c will be skipped when stepping\."
+gdb_test "skip -fu baz" "Function baz will be skipped when stepping\."
+gdb_test "skip -rfu ^b.z$" "Function\\(s\\) \\^b\\.z\\$ will be skipped when stepping."
+
+with_test_prefix "step using -fi" {
+ if ![runto_main] {
+ fail "can't run to main"
+ return
+ }
+
+ gdb_test_no_output "skip disable"
+ gdb_test_no_output "skip enable 5"
+ gdb_test "step" "foo \\(\\) at.*" "step 1"
+ gdb_test "step" ".*" "step 2"; # Return from foo()
+ gdb_test "step" "main \\(\\) at.*" "step 3"
+}
+
+with_test_prefix "step using -gfi" {
+ if ![runto_main] {
+ fail "can't run to main"
+ return
+ }
+
+ gdb_test_no_output "skip disable"
+ gdb_test_no_output "skip enable 6"
+ gdb_test "step" "foo \\(\\) at.*" "step 1"
+ gdb_test "step" ".*" "step 2"; # Return from foo()
+ gdb_test "step" "main \\(\\) at.*" "step 3"
+}
+
+with_test_prefix "step using -fu for baz" {
+ if ![runto_main] {
+ fail "can't run to main"
+ return
+ }
+
+ gdb_test_no_output "skip disable"
+ gdb_test_no_output "skip enable 7"
+ gdb_test "step" "bar \\(\\) at.*" "step 1"
+ gdb_test "step" ".*" "step 2"; # Return from bar()
+ # With gcc 9.2.0 we jump once back to main before entering foo here.
+ # If that happens try to step a second time.
+ gdb_test "step" "foo \\(\\) at.*" "step 3" "main \\(\\) at.*" "step"
+ gdb_test "step" ".*" "step 4"; # Return from foo()
+ gdb_test "step" "main \\(\\) at.*" "step 5"
+}
+
+with_test_prefix "step using -rfu for baz" {
+ if ![runto_main] {
+ fail "can't run to main"
+ return
+ }
+
+ gdb_test_no_output "skip disable"
+ gdb_test_no_output "skip enable 8"
+ gdb_test "step" "bar \\(\\) at.*" "step 1"
+ gdb_test "step" ".*" "step 2"; # Return from bar()
+ # With gcc 9.2.0 we jump once back to main before entering foo here.
+ # If that happens try to step a second time.
+ gdb_test "step" "foo \\(\\) at.*" "step 3" "main \\(\\) at.*" "step"
+ gdb_test "step" ".*" "step 4"; # Return from foo()
+ gdb_test "step" "main \\(\\) at.*" "step 5"
+}
+
+# Test -fi + -fu.
+
+with_test_prefix "step using -fi + -fu" {
+ gdb_test_no_output "skip delete"
+
+ if ![runto test_skip_file_and_function no-message] {
+ fail "can't run to test_skip_file_and_function"
+ return
+ }
+
+ gdb_test "skip -fi skip1.c -fu test_skip" \
+ "Function test_skip in file skip1.c will be skipped when stepping\."
+ # Verify we can step into skip.c:test_skip but not skip1.c:test_skip.
+ gdb_test "step" "test_skip \\(\\) at.*" "step 1"
+ gdb_test "step" "test_skip_file_and_function \\(\\) at.*" "step 2"; # Return from test_skip()
+ gdb_test "step" "skip1_test_skip_file_and_function \\(\\) at.*" "step 3"
+ gdb_test "step" ".*" "step 4"; # Skip over test_skip()
+ gdb_test "step" "test_skip_file_and_function \\(\\) at.*" "step 5"; # Return from skip1_test_skip_file_and_function()
+}
+
+with_test_prefix "skip delete completion" {
+ global binfile
+ clean_restart "${binfile}"
+ if ![runto_main] {
+ fail "can't run to main"
+ return
+ }
+
+ # Create a bunch of skips, don't care what they are.
+ for {set i 0} {$i < 12} {incr i} {
+ gdb_test "skip" ".*" "add skip $i"
+ }
+
+ set all_numbers { "1" "10" "11" "12" "2" "3" "4" "5" "6" "7" "8" "9" }
+
+ # Test completing single numbers.
+ test_gdb_complete_multiple "skip delete " "" "" $all_numbers
+ test_gdb_complete_multiple "skip delete " "1" "" { "1" "10" "11" "12" }
+ test_gdb_complete_multiple "skip delete 2 " "" "" $all_numbers
+ test_gdb_complete_unique "skip delete 11" "skip delete 11"
+
+ # Test completing ranges.
+ test_gdb_complete_multiple "skip delete 2-" "" "" $all_numbers
+ test_gdb_complete_unique "skip delete 2-5" "skip delete 2-5"
+
+ # Test cases with no completion.
+ test_gdb_complete_none "skip delete 123"
+ test_gdb_complete_none "skip delete a1"
+ test_gdb_complete_none "skip delete 2-33"
+}