# Copyright 1998-2013 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"

