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

load_lib "ada.exp"

require allow_ada_tests

standard_ada_testfile fixed_points

foreach_gnat_encoding scenario flags {all minimal} {
    lappend flags debug
    if {[gdb_compile_ada "${srcfile}" "${binfile}-${scenario}" executable $flags] != ""} {
	return -1
    }

    clean_restart ${testfile}-${scenario}

    set bp_location [gdb_get_line_number "Set breakpoint here" ${testdir}/fixed_points.adb]
    runto "fixed_points.adb:$bp_location"

    # Fixed point subtypes:

    gdb_test "print base_object" \
	"= -50" \
	"p on a fixed point type"

    gdb_test "print subtype_object" \
	"= -50" \
	"p on a subtype fixed point type"

    gdb_test "print new_type_object" \
	"= -50" \
	"p on a new fixed point type"

    # Overprecise delta:

    gdb_test "print Overprecise_Object" \
	"= 0.13579135791"

    gdb_test "ptype Overprecise_Object" \
	"type = <2-byte fixed point \\(small = 135791357913579/1000000000000000\\)>"

    # FP*_Var...

    gdb_test "print fp1_var" \
	" = 0.25"

    gdb_test "ptype fp1_var" "type = <1-byte fixed point \\(small = 1/16\\)>"

    gdb_test "print fp2_var" \
	" = -0.01"

    gdb_test "ptype fp2_var" "type = <8-byte fixed point \\(small = 1/100\\)>"

    gdb_test "print fp3_var" \
	" = 0.1"

    gdb_test "ptype fp3_var" "type = <1-byte fixed point \\(small = 1/30\\)>"

    gdb_test "print fp2_var + 0" \
	" = -0.01"
    gdb_test "print 0 + fp2_var" \
	" = -0.01"
    gdb_test "print fp2_var - 0" \
	" = -0.01"

    gdb_test "print + fp2_var" \
	" = -0.01"
    gdb_test "print - fp2_var" \
	" = 0.01"

    set fp4 "= 2e-07"
    gdb_test "print fp4_var" $fp4
    gdb_test "print fp4_var * 1" $fp4
    gdb_test "print 1 * fp4_var" $fp4
    gdb_test "print fp4_var / 1" $fp4

    # This only started working in GCC 11.
    if {$scenario == "minimal" && [gnat_version_compare >= 11]} {
	gdb_test "print fp5_var" " = 3e-19"

	gdb_test "print Float(Object_Fixed) = Float(Semicircle_Delta * 5)" \
	    " = true" \
	    "examine object_fixed"
    }

    # This failed before GCC 10.
    if {$scenario == "all" && [gnat_version_compare >= 10]} {
	gdb_test "p Float(Another_Fixed) = Float(Another_Delta * 5)" "true" \
	    "value of another_fixed"
    }
}
