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

load_lib "ada.exp"

if { [skip_ada_tests] } { return -1 }

standard_ada_testfile p

if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} {
    return -1
}

clean_restart ${testfile}

# Start the inferior

if ![runto_main] then {
   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"

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

# 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"

# On hppa32, the value returned is too large to be returned via a register.
# Instead, it is returned using the struct convention, and the debugger
# unfortunately cannot find the address of the result.  The following
# test is therefore expected to fail for all hppa targets except hppa64.
if { ! [istarget "hppa*64*-*-*"] } then {
  setup_xfail "hppa*-*-*"
}

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

# Now continue until reaching the third breakpoint, and then do another
# "finish" again.

gdb_test "cont" \
         "Breakpoint \[0-9\]+, pck.create_small_float_vector \\(\\).*" \
         "continuing to Create_Small_Float_Vector"

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

