# Copyright 2013 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

if {[skip_cplus_tests]} {
    unsupported ${testfile}.exp
    return
}

set opts {debug c++}
set objfile1 [standard_output_file ${testfile}one.o]
set objfile2 [standard_output_file ${testfile}two.o]

if { [file pathtype $objdir] == "relative" } {
    untested "objdir $objdir should be absolute"
    return
}
set saved_pwd [pwd]
cd $srcdir/${subdir}/base/one
set err1 [gdb_compile "thefile.cc" $objfile1 object $opts]
cd $saved_pwd
cd $srcdir/${subdir}/base/two
set err2 [gdb_compile "thefile.cc" $objfile2 object $opts]
cd $saved_pwd
if { $err1 != "" || $err2 != "" } {
    untested "compilation failed"
    return -1
}

if { [gdb_compile "$srcdir/${subdir}/$srcfile $objfile1 $objfile2" \
		  $binfile executable $opts] != "" } {
    return -1
}

clean_restart ${testfile}

gdb_test_no_output "set multiple-symbols ask"

gdb_test_no_output "set filename-display absolute"
set cmd "break twodup"
set test "break twodup absolute"
gdb_test_multiple $cmd $test {
    -re "^$cmd\r\n\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] \[^\r\n\]+/base/one/thefile\\.cc:twodup\\\(\\\)\r\n\\\[3\\\] \[^\r\n\]+/base/two/thefile\\.cc:twodup\\\(\\\)\r\n> $" {
	pass $test
    }
}
gdb_test "0" "canceled"

gdb_test_no_output "set filename-display relative"

set cmd "break twodup"
set test "break twodup relative"
gdb_test_multiple $cmd $test {
    -re "^$cmd\r\n\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] thefile\\.cc:twodup\\\(\\\)\r\n\\\[3\\\] thefile\\.cc:twodup\\\(\\\)\r\n> $" {
	pass $test
    }
}
gdb_test "2" "^2\r\nBreakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file thefile\\.cc, line \[0-9a-f\]+\\."

gdb_breakpoint "body_elsewhere"

gdb_run_cmd
gdb_test "" "Breakpoint \[0-9\]+, twodup \\(\\) at thefile.cc:\[0-9\]+\r\n.*" "expect breakpoint"

gdb_test "info source" "\r\nLocated in \[^\r\n\]+/base/one/thefile\\.cc\r\n.*"

gdb_continue_to_breakpoint "body_elsewhere" ".* body_elsewhere marker .*"

delete_breakpoints

set cmd "break twodup"
set test "break twodup relative other"
gdb_test_multiple $cmd $test {
    -re "^$cmd\r\n\\\[0\\\] cancel\r\n\\\[1\\\] all\r\n\\\[2\\\] thefile\\.cc:twodup\\\(\\\)\r\n\\\[3\\\] thefile\\.cc:twodup\\\(\\\)\r\n> $" {
	pass $test
    }
}
gdb_test "3" "^3\r\nBreakpoint \[0-9\]+ at 0x\[0-9a-f\]+: file thefile\\.cc, line \[0-9a-f\]+\\."

gdb_breakpoint "body_elsewhere"

gdb_run_cmd
gdb_test "" "Breakpoint \[0-9\]+, twodup \\(\\) at thefile.cc:\[0-9\]+\r\n.*" "expect breakpoint other"

gdb_test "info source" "\r\nLocated in \[^\r\n\]+/base/two/thefile\\.cc\r\n.*" "info source other"

gdb_continue_to_breakpoint "body_elsewhere other" ".* body_elsewhere marker .*"
