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

# 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"
    continue
}

# 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"
    }
}

