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

standard_testfile .c

set test_sso [expr \
		  [supports_scalar_storage_order_attribute] \
		  && [supports_gnuc]]

if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \
	  [list debug additional_flags=-DTEST_SSO=$test_sso]] } {
  return -1
}

set bp_location [gdb_get_line_number "START"]
if ![runto "endianity.c:$bp_location" ] then {
  return -1
}

gdb_test "print o" "= {v = 3, w = 2, x = 7, f = 23.5, cplx = 1.25 \\+ 7.25i, d = 75}" \
    "print o before assignment"

gdb_test "print o.v = 4" "= 4"
gdb_test "print o.w = 3" "= 3"
gdb_test "print o.x = 2" "= 2"
gdb_test "print o.f = 1.5" "= 1.5"
gdb_test "print o.d = -23.125" "= -23.125"

gdb_test "print o" "= {v = 4, w = 3, x = 2, f = 1.5, cplx = 1.25 \\+ 7.25i, d = -23.125}" \
    "print o after assignment"

if { !$test_sso } {
    # The rest of the testcase requires Scalar Storage Order support.
    # This compiler does not support it, so skip the rest.
    unsupported "No scalar storage order support"
    return -1
}

gdb_test "x/x &o.v" "0x04000000"
gdb_test "x/xh &o.w" "0x0300"
