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

# Author: P. N. Hilfinger, AdaCore Inc.

# Note: This test is essentially a transcription of gdb.cp/formatted-ref.exp,
# and is thus much more wordy than it needs to be. There are fewer 
# tests because only a few parameter types in Ada are required to be 
# passed by reference, and there is no equivalent of &(&x) for reference
# values.
# This also tests that some other arithmetic operations on references
# work properly: condition expression using a reference object as one of its
# operand.

load_lib "ada.exp"

standard_ada_testfile formatted_ref

if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug ]] != "" } {
    untested formatted-ref.exp
    return -1
}

proc get_address { var } {
    global expect_out
    global gdb_prompt

    gdb_test_multiple "print $var'access" "address of $var" {
	-re "\\$\[0-9\]+ = \\(.*\\) (0x\[0-9a-f\]+).*$gdb_prompt $" {
            return $expect_out(1,string)
        }
    }
    perror "couldn't find address of $var"
    return ""
}

proc test_p_x { var val addr } {
    global gdb_prompt

    set test "print/x $var"
    gdb_test_multiple "$test" $test {
        -re "\\$\[0-9\]+ = [string_to_regexp $val].*$gdb_prompt $" {
	    pass $test
	} 
	-re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" {
            fail "$test (prints just address)"
        }
	-re "\\$\[0-9\]+ = 0x\[a-f0-9\]+.*$gdb_prompt $" {
            fail "$test (prints unexpected address)"
        }
    }
    return 0
}

proc test_p_x_addr { var addr } {
    global gdb_prompt

    foreach attr {access unchecked_access unrestricted_access} {
	set test "print/x $var'$attr"
	gdb_test_multiple $test $test {
	    -re "\\$\[0-9\]+ = $addr.*$gdb_prompt $" {
		pass $test
	    }
	    -re "\\$\[0-9\]+ = 0x\[a-f0-9+\]+.*$gdb_prompt $" {
		fail "$test (prints unexpected address)"
	    }
	}
    }
    return 0
}

proc test_p_op1_equals_op2 {op1 op2} {
    set test "print $op1 = $op2"
    gdb_test $test "\\$\[0-9\]+ = true"
}

clean_restart ${testfile}

runto defs.adb:[gdb_get_line_number "marker here" ${testdir}/defs.adb ]

set s1_address  [get_address "s1"]

test_p_x "s" "(x => 0xd, y => 0x13)" $s1_address

test_p_x_addr "s" $s1_address

test_p_op1_equals_op2 "s.x" "13"
