# Copyright 2016-2022 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.  It is intended to test that
# gdb could correctly handle floating point constant with a suffix.

standard_testfile .c

proc do_compile { {opts {}} } {
    global srcdir subdir srcfile binfile
    set ccopts {debug quiet}
    foreach opt $opts {lappend ccopts "additional_flags=$opt"}
    gdb_compile "${srcdir}/${subdir}/${srcfile}" "$binfile" executable $ccopts
}

if { [do_compile] != "" && [do_compile {-mfloat128}] != "" } {
    untested "compiler can't handle __float128 type?"
    return -1
}

clean_restart ${binfile}

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

# Run to the breakpoint at return.
gdb_breakpoint [gdb_get_line_number "return"]
gdb_continue_to_breakpoint "return"

# Print the original value of ld and f128
gdb_test "print ld" ".* = 1\\.375.*" "the original value of ld is 1.375"
gdb_test "print f128" ".* = 2\\.375.*" "the original value of f128 is 2.375"

# Test that gdb could correctly recognize float constant expression with a suffix.
# FIXME: gdb does not yet recognize the GNU extension 'q' suffix for __float128 constants.
gdb_test "print ld=-1.375l" ".* = -1\\.375.*" "try to change ld to -1.375 with 'print ld=-1.375l'"
gdb_test "print f128=-2.375l" ".* = -2\\.375.*" "try to change f128 to -2.375 with 'print f128=-2.375l'"

# Test that gdb could handle the above correctly with "set var" command.
set test "set variable ld=10.375l"
gdb_test_multiple "set var ld=10.375l" "$test" {
    -re "$gdb_prompt $" {
	pass "$test"
    }
    -re "Invalid number.*$gdb_prompt $" {
	fail "$test (do not recognize 10.375l)"
    }
}

set test "set variable f128=20.375l"
gdb_test_multiple "set var f128=20.375l" "$test" {
    -re "$gdb_prompt $" {
	pass "$test"
    }
    -re "Invalid number.*$gdb_prompt $" {
	fail "$test (do not recognize 20.375l)"
    }
}

gdb_test "print ld" ".* = 10\\.375.*" "the value of ld is changed to 10.375"
gdb_test "print f128" ".* = 20\\.375.*" "the value of f128 is changed to 20.375"

set mpfr_supported -1
gdb_test_multiple "show configuration" "" {
    -wrap -re "--with-mpfr\r\n.*" {
       set mpfr_supported 1
    }
    -wrap -re "--without-mpfr\r\n.*" {
       set mpfr_supported 0
    }
}

# Test that we can correctly handle the largest IEEE-128 value
# Note: If we get "inf" instead of the correct result, we may have run into
# an internal overflow.  This typically happens on host platforms without
# native IEEE-128 support where GDB was built without MPFR support.
set test "print large128"
gdb_test_multiple "print large128" "$test" {
    -re ".* = 1\\.18973149535723176508575932662800702e\\+4932.*$gdb_prompt $" {
	pass "$test"
    }
    -re ".* = inf.*$gdb_prompt $" {
       if { $mpfr_supported == 0 } {
	   # If the host platform has native 128-bit float support (as is
	   # the case for some versions of s390 and powerpc), the
	   # "print large128" test should be passing, even without MPFR
	   # support.  So, in those cases we should have fail here rather than
	   # unsupported.  However, given that we don't have a way to readily
	   # test for this, we fall back to unsupported.
	   unsupported "$test (Missing MPFR support)"
       } else {
           fail $test
       }
    }
    -re ".*$gdb_prompt $" {
	fail "$test"
    }
}

