# Copyright 2012-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 <http://www.gnu.org/licenses/>.

standard_testfile lspec.cc

set execfile $testfile

set baseone base/one/thefile.cc
set basetwo base/two/thefile.cc

require allow_cplus_tests

if {[prepare_for_testing "failed to prepare" $execfile \
	 [list $srcfile $baseone $basetwo] \
	 {debug nowarnings c++}]} {
    return -1
}

gdb_test "skip function dupname" \
	 {Function dupname will be skipped when stepping\.}

if ![runto_main] {
    return -1
}

set test "dupname ignored from main"
gdb_test_multiple "step" $test {
    -re "^step\r\ndupname .*\r\n$gdb_prompt $" {
	fail $test
    }
    -re "^step\r\nm .*\r\n$gdb_prompt $" {
	pass $test
    }
}

gdb_breakpoint "n"
gdb_continue_to_breakpoint "n" ".* dupname.* thefile breakpoint .*"

set test "dupname ignored from n"
gdb_test_multiple "step" $test {
    -re "^step\r\ndupname .*\r\n$gdb_prompt $" {
	fail $test
    }
    -re "^step\r\n\[^\r\n\]* after dupname .*\r\n$gdb_prompt $" {
	pass $test
    }
}

gdb_test_no_output "skip delete 1"

gdb_test "skip file thefile.cc" \
	 {File thefile\.cc will be skipped when stepping\.}

if ![runto_main] {
    return -1
}

gdb_test "step" "static int dupname .*" "step into dupname"
gdb_test "finish" "return dupname.* body_elsewhere.*" "finish from dupname"

set test "dupname ignored for thefile.cc"
gdb_test_multiple "step" $test {
    -re "^step\r\ndupname .*\r\n$gdb_prompt $" {
	fail $test
    }
    -re "^step\r\nf1 .* f1 breakpoint .*\r\n$gdb_prompt $" {
	pass $test
    }
}
