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

if {[gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != ""} {
    untested "Couldn't compile $srcfile"
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_file_cmd ${binfile}
gdb_test_no_output "set listsize 1"

# initial sal should be first statement in main
gdb_test "list" \
    "v0 = 0;" \
    "list before run"

gdb_load ${binfile}
if {! [runto_main]} {
    return -1
}

gdb_test "list" \
    "v0 = 0;" \
    "list in main"

if {! [runto "func2"]} {
    return -1
}

gdb_test "list" \
    "v2 = 2;" \
    "list in func2"

# make sure backtrace doesn't change current source location.
gdb_test "backtrace" \
    ".*"
gdb_test "list -1" \
    "v2 = 2;" \
    "list after backtrace"

# check the window
gdb_test_no_output "set listsize 3"

if {! [runto_main]} {
    return -1
}
gdb_test "list" \
    "func1 \\(\\);" \
    "list size 3"

return 0
