# Copyright 2005, 2007-2012 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.

set testfile "bfp-test"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
    untested "Couldn't compile ${srcfile}"
    return -1
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${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 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)"
    }
}
