# Copyright 2010-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/>.

if { [skip_cplus_tests] } { continue }
if { [skip_shlib_tests] } { continue }

standard_testfile bool.cc .cc

set sofile [standard_output_file ${testfile}.so]

# Create and source the file that provides information about the compiler
# used to compile the test case.
if [get_compiler_info "c++"] {
    return -1
}

if { [gdb_compile_shlib $srcdir/$subdir/$srcfile2 $sofile {debug c++}] != ""
     || [gdb_compile $srcdir/$subdir/$srcfile $binfile executable [list debug "c++" shlib=${sofile}]] != ""} {
    untested "failed to compile"
    return -1
}

clean_restart $testfile
gdb_load_shlib ${sofile}

gdb_test_no_output "set breakpoint pending yes"
gdb_test "break C::C" {Breakpoint [0-9]+ \(C::C\) pending\.}
gdb_test_no_output {set variable $brk = $bpnum}

# runto or runto_main would call delete_breakpoints.
gdb_breakpoint "main"
gdb_run_cmd
gdb_test "" ".*" "start"

set test "breakpoint resolved"
gdb_test_multiple {info breakpoints $brk} $test {
    -re "<PENDING>" {
	kfail breakpoints/11657 $test
    }
    -re "\r\n$gdb_prompt $" {
	# FIXME: Check more specific resolution state.
	pass $test
    }
}
