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

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

# This testcase exercises evaluation with amd64 calling conventions.

require is_x86_64_m64_target

standard_testfile .cc

if { [prepare_for_testing "failed to prepare" $testfile $srcfile \
	  { debug c++ additional_flags=-std=c++11 }] } {
    return -1
}

if ![runto_main] {
    return -1
}

gdb_breakpoint [gdb_get_line_number "break-here"]
gdb_continue_to_breakpoint "break-here"

gdb_test "call foo.return_simple_base(12)" \
    " = {x = 12}"
gdb_test "call foo.return_simple_derived(34)" \
    " = {<SimpleBase> = {x = 34}, <No data fields>}"
gdb_test "call foo.return_non_trivial_destructor(56)" \
    " = {<SimpleBase> = {x = 56}, <No data fields>}"
gdb_test "call foo.return_unaligned(78, 9.25)" \
    " = {x = 78, y = 9.25}"
gdb_test "call foo.return_unaligned_in_base(23, 4.5, 67)" \
    " = {<UnalignedFields> = {x = 23, y = 4.5}, x2 = 67}"
gdb_test "call foo.return_bitfields(23, 74)" \
    " = {fld = 23, fld2 = 74}"
