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

set testfile "frame-args"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${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_load ${binfile}

if ![runto break_me] then {
  perror "Couldn't run ${testfile}"
  return
}

# Test with "print frame-arguments" set to "all"

gdb_test_no_output "set print frame-arguments all" \
         "set print frame-arguments all"
gdb_test "frame 1" \
         ".*in call_me \\(i=3, f=5, s=({a = 3, b = 5}|<optimized out>), ss=0x\[0-9a-f\]\+, u=({.*}|<optimized out>), e=green\\) at .*frame-args\\.c:.*" \
         "frame 1 with print frame-arguments set to all"

# Test with "print frame-arguments" set to "scalars"

gdb_test_no_output "set print frame-arguments scalars" \
         "set print frame-arguments scalars"
gdb_test "frame 1" \
         ".*in call_me \\(i=3, f=5, s=\\.\\.\\., ss=0x\[0-9a-f\]\+, u=\\.\\.\\., e=green\\) at .*frame-args\\.c:.*" \
         "frame 1 with print frame-arguments set to scalars"

# Test with "print frame-arguments" set to "none"

gdb_test_no_output "set print frame-arguments none" \
         "set print frame-arguments none"
gdb_test "frame 1" \
         ".*in call_me \\(i=\\.\\.\\., f=\\.\\.\\., s=\\.\\.\\., ss=\\.\\.\\., u=\\.\\.\\., e=\\.\\.\\.\\) at .*frame-args\\.c:.*" \
         "frame 1 with print frame-arguments set to none"


