# Copyright 2005-2026 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

if { [prepare_for_testing "prepare" $testfile $srcfile] != 0 } {
    return
}

if {![runto_main]} {
    return
}

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

# Print the original value of b32, b64 and b128.
gdb_test "print b32" ".*1 = 1\.5.*" "the original value of b32 is 1.5"
gdb_test "print b64" ".*2 = 2\.25.*" "the original value of b64 is 2.25"
gdb_test "print b128" ".*3 = 3\.375.*" "the original value of b128 is 3.375"

# Test that gdb could correctly recognize float constant expression with a suffix.
gdb_test "print b32=-1.5f" ".*4 = -1\.5.*" "try to change b32 to -1.5 with 'print b32=-1.5f'"
gdb_test "print b64=-2.25f" ".*5 = -2\.25.*" "try to change b64 to -2.25 with 'print b64=-2.25f'"
gdb_test "print b128=-3.375l" ".*6 = -3\.375.*" "try to change b128 to -3.375 with 'print b128=-3.375l'"

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

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

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

gdb_test "print b32" ".*7 = 10\.5.*" "the value of b32 is changed to 10.5"
gdb_test "print b64" ".*8 = 20\.25.*" "the value of b64 is changed to 20.25"
gdb_test "print b128" ".*9 = 30\.375.*" "the value of b128 is changed to 30.375"

# Test that gdb could handle invalid suffix correctly.

set test "set variable b32 = 100.5a"
gdb_test_multiple "set var b32=100.5a" "$test" {
    -re "Invalid number.*$gdb_prompt $" {
	pass "$test"
    }
    -re "$gdb_prompt $" {
	fail "$test (do not report error on invalid suffix)"
    }
}

set test "set variable b64 = 200.25x"
gdb_test_multiple "set var b64=200.25x" "$test" {
    -re "Invalid number.*$gdb_prompt $" {
	pass "$test"
    }
    -re "$gdb_prompt $" {
	fail "$test (do not report error on invalid suffix)"
    }
}

set test "set variable b128 = 300.375fl"
gdb_test_multiple "set var b128=300.375fl" "$test" {
    -re "Invalid number.*$gdb_prompt $" {
	pass "$test"
    }
    -re "$gdb_prompt $" {
	fail "$test (do not report error on invalid suffix)"
    }
}

set test "set variable b128 = 300.375fff"
gdb_test_multiple "set var b128=300.375fff" "$test" {
    -re "Invalid number.*$gdb_prompt $" {
	pass "$test"
    }
    -re "$gdb_prompt $" {
	fail "$test (do not report error on invalid suffix)"
    }
}
