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

    send_gdb "print $var'access\n"
    gdb_expect {
	-re "\\$\[0-9\]+ = \\(.*\\) (0x\[0-9a-f\]+).*$gdb_prompt $" {
            return $expect_out(1,string)
 	}
        timeout { 
	    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"
}

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

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"
