# Copyright 2007-2012 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"

set testdir "formatted_ref"
set testfile "${testdir}/formatted_ref"
set srcfile ${srcdir}/${subdir}/${testfile}.adb
set binfile ${objdir}/${subdir}/${testfile}


file mkdir ${objdir}/${subdir}/${testdir}
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

    set test "print/x $var'access"
    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"
