# Tests of overloaded operators resolution.
# Copyright 1998, 1999, 2002 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

# written by Elena Zannoni (ezannoni@cygnus.com)
#
# source file "userdef.cc"
#

if $tracelevel then {
        strace $tracelevel
}

if { [skip_cplus_tests] } { continue }

set testfile "userdef"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}


gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}


if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

send_gdb "break marker1\n" ; gdb_expect -re ".*$gdb_prompt $"
    send_gdb "cont\n"
    gdb_expect {
        -re "Break.* marker1(\\(\\)|) \\(\\) at .*:$decimal.*$gdb_prompt $" {
            send_gdb "up\n"
            gdb_expect {
                -re ".*$gdb_prompt $" { pass "up from marker1" }
                timeout { fail "up from marker1" }
            }
        }
        -re "$gdb_prompt $" { fail "continue to marker1"  }
        timeout { fail "(timeout) continue to marker1"  }
    }


gdb_test "print one + two" "\\\$\[0-9\]* = {x = 6, y = 8}"

# If GDB fails to restore the selected frame properly after the
# inferior function call above (see GDB PR 1155 for an explanation of
# why this might happen), all the subsequent tests will fail.  We
# should detect report that failure, but let the marker call finish so
# that the rest of the tests can run undisturbed.
gdb_test_multiple "frame" "re-selected 'main' frame after inferior call" {
    -re "#0  marker1.*$gdb_prompt $" {
        setup_kfail "gdb/1155" s390-*-linux-gnu
        fail "re-selected 'main' frame after inferior call"
        gdb_test "finish" ".*main.*at .*userdef.cc:.*// marker1-returns-here.*" \
                "finish call to marker1"
    }
    -re "#1  ($hex in )?main.*$gdb_prompt $" {
        pass "re-selected 'main' frame after inferior call"
    }
}
        
gdb_test "print one - two" "\\\$\[0-9\]* = {x = -2, y = -2}"

gdb_test "print one * two" "\\\$\[0-9\]* = {x = 8, y = 15}"

gdb_test "print one / two" "\\\$\[0-9\]* = {x = 0, y = 0}"

gdb_test "print one % two" "\\\$\[0-9\]* = {x = 2, y = 3}"

gdb_test "print one && two" "\\\$\[0-9\]* = 1\[\r\n\]"

gdb_test "print one || two" "\\\$\[0-9\]* = 1\[\r\n\]"

gdb_test "print one & two" "\\\$\[0-9\]* = {x = 0, y = 1}"

gdb_test "print one | two" "\\\$\[0-9\]* = {x = 6, y = 7}"

gdb_test "print one ^ two" "\\\$\[0-9\]* = {x = 6, y = 6}"

gdb_test "print one < two" "\\\$\[0-9\]* = 1\[\r\n\]"

gdb_test "print one <= two" "\\\$\[0-9\]* = 1\[\r\n\]"

gdb_test "print one > two" "\\\$\[0-9\]* = 0\[\r\n\]"

gdb_test "print one >= two" "\\\$\[0-9\]* = 0\[\r\n\]"

gdb_test "print one == two" "\\\$\[0-9\]* = 0\[\r\n\]"

gdb_test "print one != two" "\\\$\[0-9\]* = 1\[\r\n\]"

# Can't really check the output of this one without knowing
# target integer width.  Make sure we don't try to call
# the iostreams operator instead, though.
gdb_test "print one << 31" "\\\$\[0-9\]* = {x = -?\[0-9\]*, y = -?\[0-9\]*}"

# Should be fine even on < 32-bit targets.
gdb_test "print one >> 31" "\\\$\[0-9\]* = {x = 0, y = 0}"

gdb_test "print !one" "\\\$\[0-9\]* = 0\[\r\n\]"

# Assumes 2's complement.  So does everything...
gdb_test "print ~one" "\\\$\[0-9\]* = {x = -3, y = -4}"

gdb_test "print -one" "\\\$\[0-9\]* = {x = -2, y = -3}"

gdb_test "print one++" "\\\$\[0-9\]* = {x = 2, y = 4}"

gdb_test "print ++one" "\\\$\[0-9\]* = {x = 3, y = 4}"

gdb_test "print one--" "\\\$\[0-9\]* = {x = 3, y = 3}"

gdb_test "print --one" "\\\$\[0-9\]* = {x = 2, y = 3}"

gdb_test "print one += 7" "\\\$\[0-9\]* = {x = 9, y = 10}"

gdb_test "print two = one" "\\\$\[0-9\]* = {x = 9, y = 10}"

# Check that GDB tolerates whitespace in operator names.
gdb_test "break A1::'operator+'" ".*Breakpoint $decimal at.*"
gdb_test "break A1::'operator +'" ".*Breakpoint $decimal at.*"

gdb_exit
return 0
