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

standard_testfile

if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug]} {
    return -1
}

if { ![runto_main] } then {
    return 0
}

gdb_breakpoint [gdb_get_line_number "Break Here"]
gdb_continue_to_breakpoint "breakpt" ".* Break Here\\. .*"

gdb_test "p z1" " = 1.5 \\+ 4.5i"
gdb_test "p z2" " = 2.5 \\+ -5.5i"
gdb_test "p z3" " = 3.5 \\+ 6.5i"

gdb_test "ptype z1" " = complex double"
gdb_test "ptype z2" " = complex float"
gdb_test "ptype z3" " = complex long double"

with_test_prefix "double imaginary" {
    gdb_test "p \$_cimag (z1)" " = 4.5"
    gdb_test "ptype \$" " = double"
}

with_test_prefix "float imaginary" {
    gdb_test "p \$_cimag (z2)" " = -5.5"
    gdb_test "ptype \$" " = float"
}

with_test_prefix "long double imaginary" {
    gdb_test "p \$_cimag (z3)" " = 6.5"
    gdb_test "ptype \$" " = long double"
}

with_test_prefix "double real" {
    gdb_test "p \$_creal (z1)" " = 1.5"
    gdb_test "ptype \$" " = double"
}

with_test_prefix "float real" {
    gdb_test "p \$_creal (z2)" " = 2.5"
    gdb_test "ptype \$" " = float"
}

with_test_prefix "long double real" {
    gdb_test "p \$_creal (z3)" " = 3.5"
    gdb_test "ptype \$" " = long double"
}

gdb_test "p \$_cimag (d1)" "expected a complex number"
gdb_test "p \$_cimag (f1)" "expected a complex number"
gdb_test "p \$_cimag (i1)" "expected a complex number"

gdb_test "p \$_creal (d1)" "expected a complex number"
gdb_test "p \$_creal (f1)" "expected a complex number"
gdb_test "p \$_creal (i1)" "expected a complex number"

#
# General complex number tests.
#

gdb_test "print 23 + 7i" " = 23 \\+ 7i"
gdb_test "print 23.125f + 7i" " = 23.125 \\+ 7i"
gdb_test "print 23 + 7.25fi" " = 23 \\+ 7.25i"
gdb_test "print (23 + 7i) + (17 + 10i)" " = 40 \\+ 17i"
gdb_test "print 23 + -7i" " = 23 \\+ -7i"
gdb_test "print 23 - 7i" " = 23 \\+ -7i"

gdb_test "print -(23 + 7i)" " = -23 \\+ -7i"
gdb_test "print +(23 + 7i)" " = 23 \\+ 7i"
gdb_test "print ~(23 + 7i)" " = 23 \\+ -7i"

gdb_test "print (5 + 5i) * (2 + 2i)" " = 0 \\+ 20i"

gdb_test "print (5 + 7i) == (5 + 7i)" " = 1"
gdb_test "print (5 + 7i) == (8 + 7i)" " = 0"
gdb_test "print (5 + 7i) == (5 + 92i)" " = 0"
gdb_test "print (5 + 7i) != (5 + 7i)" " = 0"
gdb_test "print (5 + 7i) != (8 + 7i)" " = 1"
gdb_test "print (5 + 7i) != (5 + 92i)" " = 1"

gdb_test "print (20 - 4i) / (3 + 2i)" " = 4 \\+ -4i"

gdb_test "print (_Complex int) 4" " = 4 \\+ 0i"
gdb_test "print (_Complex float) 4.5" " = 4.5 \\+ 0i"
gdb_test "ptype __complex__ short" " = _Complex short"
gdb_test "print (_Complex int) (23.75 + 8.88i)" " = 23 \\+ 8i"

set re_reject_arg "Argument to complex arithmetic operation not supported\\."
gdb_test "print (void *)0 + 5i" $re_reject_arg
gdb_test "print (_Decimal32)0 + 5i" $re_reject_arg

# Set language to c++.  Avoid warning by not having current frame.
clean_restart
gdb_test_no_output "set language c++"

# C++ type tests.
gdb_test "print (bool)1 + 1i" " = 1 \\+ 1i"
