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


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

if [get_compiler_info] {
    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"
    continue
}

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" \
    "print value of &ibig.i\[0\]"

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

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

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

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

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

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

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

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

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

gdb_test "print !fbig.f\[100\]" " = $false" \
    "print value of !ibig.i\[100\]"

gdb_test "print !dbig.d\[202\]" " = $false" \
    "print value of !ibig.i\[100\]"

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

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

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

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

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

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

gdb_test "print sizeof(lbig)/sizeof(long)" " = 900" \
    "print value of sizeof lbig / sizeof long"

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

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

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

