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

load_lib "ada.exp"

if { [skip_ada_tests] } { return -1 }

standard_ada_testfile foo

foreach_with_prefix scenario {all minimal} {
    set flags [list debug additional_flags=-fgnat-encodings=$scenario]

    if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != ""} {
	return -1
    }

    clean_restart ${testfile}

    # GNAT 9 and 10 are known to fail.
    if {$scenario == "minimal" && ([test_compiler_info {gcc-9-*}] \
				       || [test_compiler_info {gcc-10-*}])} {
	set old_compiler 1
    } else {
	set old_compiler 0
    }

    set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
    runto "foo.adb:$bp_location"

    gdb_test "ptype full" \
	"type = array \\(black \\.\\. white\\) of boolean <packed: 1-bit elements>"

    gdb_test "print full" " = \\(false, true, false, true, false\\)"

    gdb_test "print full'first" " = black"

    gdb_test "ptype primary" \
	"type = array \\(red \\.\\. blue\\) of boolean <packed: 1-bit elements>"

    gdb_test "print primary" " = \\(red => false, true, false\\)"

    gdb_test "print primary'first" " = red"

    gdb_test "ptype cold" \
	"type = array \\(green \\.\\. blue\\) of boolean <packed: 1-bit elements>"

    gdb_test "print cold" " = \\(green => false, true\\)"

    gdb_test "print cold'first" " = green"

    # Note the bounds values are still not correctly displayed.  So we get
    # the enum equivalent of "1 .. 0" (empty range) as the array ranges.
    # Accept that for now.
    # GNAT >= 11.0 has the needed fix here.
    if {$old_compiler} {
	setup_kfail "minimal encodings" *-*-*
    }
    gdb_test "ptype small" \
	"array \\(red \\.\\. green\\) of boolean <packed: 1-bit elements>"

    if {$old_compiler} {
	setup_kfail "minimal encodings" *-*-*
    }
    gdb_test "print small" " = \\(red => false, true\\)"

    if {$old_compiler} {
	setup_kfail "minimal encodings" *-*-*
    }
    gdb_test "print small'first" " = red"

    if {$old_compiler} {
	setup_kfail "minimal encodings" *-*-*
    }
    gdb_test "ptype multi" \
	"array \\(red \\.\\. green, low .. medium\\) of boolean <packed: 1-bit elements>"

    if {$old_compiler} {
	setup_kfail "minimal encodings" *-*-*
    }
    gdb_test "print multi" \
	" = \\(red => \\(low => true, false\\), \\(low => true, false\\)\\)"

    if {$old_compiler} {
	setup_kfail "minimal encodings" *-*-*
    }
    gdb_test "print multi'first" " = red"

    set base "\\(true, false, true, false, true, false, true, false, true, false\\)"
    set matrix "\\("
    foreach x {1 2 3 4 5 6 7} {
	if {$x > 1} {
	    append matrix ", "
	}
	append matrix $base
    }
    append matrix "\\)"

    if {$old_compiler} {
	setup_kfail "minimal encodings" *-*-*
    }
    gdb_test "print multi_multi" " = \\($matrix, $matrix\\)"
    if {$old_compiler} {
	setup_kfail "minimal encodings" *-*-*
    }
    gdb_test "print multi_multi(1,3)" " = $base"
    if {$old_compiler} {
	setup_kfail "minimal encodings" *-*-*
    }
    gdb_test "print multi_multi(2)" " = $matrix"

    gdb_test "print multi_access.all" \
	" = \\(\\(8, 13, 21, 34, 55\\), \\(1, 1, 2, 3, 5\\)\\)"

    gdb_test "print confused_array(red, green)" " = 2"
    gdb_test "print confused_array(green, red)" " = 6"
}
