# This testcase is part of GDB, the GNU debugger.

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

# Test various aspects of packages.

load_lib "go.exp"

if { [skip_go_tests] } { continue }

set testfile "package"
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${testfile}2.go" "${binfile}2.o" object {debug go}] != "" } {
    untested $testfile
    return -1
}

if  { [gdb_compile "${srcdir}/${subdir}/${testfile}1.go ${binfile}2.o" "${binfile}" executable "debug go libdir=${objdir}/${subdir}"] != "" } {
    untested $testfile
    return -1
}

clean_restart $testfile

if { [go_runto_main] < 0 } {
    untested methods
    return -1
}

set bp_location1 {package2.Foo}
set bp_location1_regexp {package2[.]Foo.*package2[.]go:}

if { [gdb_breakpoint ${bp_location1}] } {
    pass "setting breakpoint 1"
}
gdb_test "cont" "Breakpoint .*${bp_location1_regexp}.*" "Going to first breakpoint"
