# Copyright 2019-2024 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]} {
    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"

# The following 3 tests are broken for Clang.
# More info at https://github.com/llvm/llvm-project/issues/52996.
if {[test_compiler_info clang-*-*]} { setup_xfail *-*-* }
gdb_test "ptype z1" " = complex double"
if {[test_compiler_info clang-*-*]} { setup_xfail *-*-* }
gdb_test "ptype z2" " = complex float"
if {[test_compiler_info clang-*-*]} { setup_xfail *-*-* }
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"
