# Copyright 2005 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 2 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, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA

if $tracelevel then {
    strace $tracelevel
}

load_lib "ada.exp"

set testdir "array_return"
set testfile "${testdir}/p"
set srcfile ${srcdir}/${subdir}/${testfile}.adb
set binfile ${objdir}/${subdir}/${testfile}

file mkdir ${objdir}/${subdir}/${testdir}
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
  return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# Start the inferior

if ![runto_main] then {
   fail "Cannot run to main, testcase aborted"
   return 0
}

# Create a breakpoint in each function from which we want to test
# the "finish" command.

gdb_test "break create_small" \
         "Breakpoint \[0-9\]+ at.*: file .*pck.adb, line \[0-9\]+." \
         "insert breakpoint in create_small"

gdb_test "break create_large" \
         "Breakpoint \[0-9\]+ at.*: file .*pck.adb, line \[0-9\]+." \
         "insert breakpoint in create_large"

# Then continue until reaching the first breakpoint inside Create_Small,
# and then do a "finish".

gdb_test "cont" \
         "Breakpoint \[0-9\]+, pck.create_small \\(\\).*" \
         "Continuing to Create.Small"

gdb_test "finish" \
         "Value returned is \\\$\[0-9\]+ = \\(1, 1\\)" \
         "value printed by finish of Create_Small"

# Now continue until reaching the second breakpoint inside Create_Large,
# and then do another "finish".

gdb_test "cont" \
         "Breakpoint \[0-9\]+, pck.create_large \\(\\).*" \
         "Continuing to Create.Large"

gdb_test "finish" \
         "Value returned is \\\$\[0-9\]+ = \\(2, 2, 2, 2\\)" \
         "value printed by finish of Create_Large"

