# 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}

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

    # Print My_Object and My_Object.Ptr when Ptr is null...

    gdb_test "print my_object" \
	"= \\(n => 3, ptr => 0x0, data => \\(3, 5, 8\\)\\)" \
	"print My_Object with null Ptr"

    gdb_test "print my_object.ptr" \
	"= \\(foo.table_access\\) 0x0" \
	"print My_Object.Ptr when null"

    # Same for My_P_Object...

    gdb_test "print my_p_object" \
	"= \\(n => 3, ptr => 0x0, data => \\(3, 5, 8\\)\\)" \
	"print My_P_Object with null Ptr"

    gdb_test "print my_p_object.ptr" \
	"\\(foo.p_table_access\\) 0x0" \
	"print My_P_Object.Ptr when null"

    # Continue until the Ptr component of both objects get allocated.

    set bp_location [gdb_get_line_number "STOP2" ${testdir}/foo.adb]

    gdb_breakpoint "foo.adb:$bp_location"

    gdb_test "continue" \
	"Breakpoint $decimal, foo \\(\\) at .*foo.adb:$decimal.*" \
	"continue to STOP2"

    # Inspect My_Object again...

    gdb_test "print my_object" \
	"= \\(n => 3, ptr => $hex, data => \\(3, 5, 8\\)\\)" \
	"print my_object after setting Ptr"

    gdb_test "print my_object.ptr" \
	"\\(foo.table_access\\) $hex" \
	"print my_object.ptr when no longer null"

    gdb_test "print my_object.ptr.all" \
	"= \\(13, 21, 34\\)"

    # Same with My_P_Object...

    gdb_test "print my_p_object" \
	"= \\(n => 3, ptr => $hex, data => \\(3, 5, 8\\)\\)" \
	"print my_p_object after setting Ptr"

    gdb_test "print my_p_object.ptr" \
	"= \\(foo.p_table_access\\) $hex" \
	"print My_P_Object.Ptr when no longer null"

    gdb_test "print my_p_object.ptr.all" \
	"\\(13, 21, 34\\)"

}
