# Copyright 2008-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 foo

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 "STOP" ${testdir}/foo.adb]
    if {![runto "foo.adb:$bp_location"]} {
	return
    }

    # Accept "foo." prefix for older versions of GNAT.
    gdb_test "print string_p" \
	"= \\((foo\\.)?string_access\\) 0x\[0-9a-zA-Z\]+"

    gdb_test "print string_p(3..4)" "= \"ll\""

    gdb_test "print null_string" "= \\((foo\\.)?string_access\\) 0x0"

    gdb_test "print arr_ptr" "= \\(access (foo\\.)?little_array\\) 0x\[0-9a-zA-Z\]+"

    gdb_test "print arr_ptr(2)" "= 22"

    gdb_test "print arr_ptr(3..4)" "= \\(3 => 23, 24\\)"

    gdb_test "ptype arr_ptr" \
	[string_to_regexp "type = access array (1 .. 10) of integer"]
    gdb_test "ptype arr_ptr.all" \
	[string_to_regexp "type = array (1 .. 10) of integer"]

    gdb_test "ptype string_access" "= access array \\(<>\\) of character"

    # GNAT >= 12.0 has the needed fix here.
    set xfail_expected 0
    if {$scenario == "minimal" && [gnat_version_compare < 12]} {
	set xfail_expected 1
    }

    gdb_test_multiple "print pa_ptr.all" "" {
	-re -wrap " = \\(10, 20, 30, 40, 50, 60, 62, 63, -23, 42\\)" {
	    pass $gdb_test_name
	}
	-re -wrap " = \[0-9\]+" {
	    if { $xfail_expected } {
		xfail $gdb_test_name
	    } else {
		fail $gdb_test_name
	    }
	}
    }

    set xfail_cannot_subscript_re \
	"cannot subscript or call something of type `foo__packed_array_ptr'"

    gdb_test_multiple "print pa_ptr(3)" "" {
	-re -wrap " = 30" {
	    pass $gdb_test_name

	}
	-re -wrap $xfail_cannot_subscript_re {
	    if { $xfail_expected } {
		xfail $gdb_test_name
	    } else {
		fail $gdb_test_name
	    }
	}
    }

    set xfail_attempt_to_index_re \
	"Attempt to index or call something other than an array or function"

    gdb_test_multiple "print pa_ptr.all(3)" "" {
	-re -wrap " = 30" {
	    pass $gdb_test_name

	}
	-re -wrap $xfail_attempt_to_index_re {
	    if { $xfail_expected } {
		xfail $gdb_test_name
	    } else {
		fail $gdb_test_name
	    }
	}
    }
}
