# Copyright 2007, 2008, 2009, 2010, 2011 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.

if $tracelevel then {
	strace $tracelevel
}

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"
