# Copyright 2012-2021 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

if {[skip_cplus_tests]} {
    unsupported "skipping C++ tests"
    return
}

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