# Copyright 1998-2022 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 file is part of the gdb testsuite
# file written by Elena Zannoni (ezannoni@cygnus.com)

#
# tests for expressions with struct/array elements and mixed operator types
# with elementary types
# 

# By default, the datastructures are allocated on the stack.  For targets
# with very small stack, that will not work.  In that case, just set
# storage to `-DSTORAGE=static' which changes the datastructures to be
# allocated in data segment.
set storage "-DSTORAGE="
if [target_info exists gdb,small_stack_section] {
    set storage "-DSTORAGE=static"
}

set additional_flags "additional_flags=${storage}"

#
# test running programs
#

standard_testfile .c

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug ${additional_flags} nowarnings]] != "" } {
    untested "failed to compile"
    return -1
}

clean_restart ${binfile}


#
# set it up at a breakpoint so we can play with the variable values
#
if ![runto_main] then {
    perror "couldn't run to breakpoint"
    return
}

# This is used as an expected result value.
set false 0

gdb_test "break marker1" ".*" ""

gdb_test "cont" \
    "Break.* marker1 \\(\\) at .*:$decimal.*" \
    "continue to marker1"

gdb_test "up" " main .*" "up from marker1"

global hex

gdb_test "print &ibig.i\[0\]" " = \\(int \\*\\) $hex"

gdb_test_multiple "print &cbig.c\[0\]" "" {
    -re ".\[0-9\]* = $hex \"\".*$gdb_prompt $" {
        pass $gdb_test_name
    }
    -re ".\[0-9\]* = $hex \"*\".*$gdb_prompt $" {
        pass $gdb_test_name
    }
}

gdb_test "print &fbig.f\[0\]" " = \\(float \\*\\) $hex"

gdb_test "print &dbig.d\[0\]" " = \\(double \\*\\) $hex"

gdb_test_multiple "print &sbig.s\[0\]" "" {
    -re ".\[0-9\]* = \\(short \\*\\) $hex.*$gdb_prompt $" {
        pass $gdb_test_name
    }
    -re ".\[0-9\]* = \\(short int \\*\\) $hex.*$gdb_prompt $" {
        pass $gdb_test_name
    }
}

gdb_test_multiple "print &lbig.l\[0\]" "" {
    -re ".\[0-9\]* = \\(long \\*\\) $hex.*$gdb_prompt $" {
        pass $gdb_test_name
    }
    -re ".\[0-9\]* = \\(long int \\*\\) $hex.*$gdb_prompt $" {
        pass $gdb_test_name
    }
}

gdb_test "print ibig.i\[100\] | 1" " = 5"

gdb_test "print sbig.s\[90\] & 127" " = 127"

gdb_test "print !ibig.i\[100\]" " = $false"

gdb_test "print !sbig.s\[90\]" " = $false"

gdb_test "print !fbig.f\[100\]" " = $false"

gdb_test "print !dbig.d\[202\]" " = $false"

gdb_test "print sbig.s\[90\] * 10" " = 2550"

gdb_test "print ibig.i\[100\] * sbig.s\[90\]" " = 1275"

gdb_test "print fbig.f\[100\] * dbig.d\[202\]" " = 119.99\[0-9\]*"

gdb_test "print !(sbig.s\[90\] * 2)" " = $false"

gdb_test "print sizeof(sbig)" " = 800"

gdb_test "print sizeof(cbig)" " = 100"

gdb_test "print sizeof(lbig)/sizeof(long)" " = 900"

gdb_test "print ibig.i\[100\] << 2" " = 20"

gdb_test "print sbig.s\[90\] >> 4" " = 15"

gdb_test "print lbig.l\[333\] >> 6" " = 15624999"

