# 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] {
    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"

