# Copyright 1998-2000, 2007-2012 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
#

set testfile "miscexprs"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

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

if [get_compiler_info ${binfile}] {
    return -1;
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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"

