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

load_lib "ada.exp"

if { [skip_ada_tests] } { return -1 }

standard_ada_testfile ops_test

if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != ""} {
    return -1
}

clean_restart ${testfile}

# This test won't work properly if system debuginfo is installed.
gdb_test_no_output "set debug-file-directory"

set bp_location [gdb_get_line_number "BEGIN" ${testdir}/ops_test.adb]
runto "ops_test.adb:$bp_location"

# Set breakpoints for all operators, using just the operator name in quotes.

foreach op { "+" "-" } {
    set op_re [string_to_regexp $op]
    gdb_test "break \"$op\"" \
             "Breakpoint $decimal at $hex: \"$op_re\"\. \\(2 locations\\)"
}

foreach op { "*" "/" "mod" "rem" "**" "<" "<=" ">" ">=" "=" "and" "or" "xor" "&" "abs" "not"} {
    set op_re [string_to_regexp $op]
    gdb_test "break \"$op\"" \
             "Breakpoint $decimal at $hex: file .*ops.adb, line $decimal."
}

# Make sure we stop correctly in each operator function.

foreach op { "+" "-" "*" "/" "mod" "rem" "**" "<" "<=" ">" ">=" "=" "and" "or" "xor" "&" "abs" "not"} {
    set op_re [string_to_regexp $op]
    gdb_test "continue" \
             "Breakpoint $decimal, ops\\.\"$op_re\" .*"\
             "continue to \"$op\""
}

# Perform the same test, but using the qualified name of the operator,
# instead of the just the operator name (as in 'break ops."+"').

clean_restart ${testfile}

runto "ops_test.adb:$bp_location"

# Set breakpoints for all operators, using just the operator name in quotes.

foreach op { "+" "-" } {
    set op_re [string_to_regexp $op]
    gdb_test "break ops.\"$op\"" \
             "Breakpoint $decimal at $hex: ops\\.\"$op_re\"\. \\(2 locations\\)"
}

foreach op { "*" "/" "mod" "rem" "**" "<" "<=" ">" ">=" "=" "and" "or" "xor" "&" "abs" "not"} {
    set op_re [string_to_regexp $op]
    gdb_test "break ops.\"$op\"" \
             "Breakpoint $decimal at $hex: file .*ops.adb, line $decimal."
}

# Make sure we stop correctly in each operator function.

foreach op { "+" "-" "*" "/" "mod" "rem" "**" "<" "<=" ">" ">=" "=" "and" "or" "xor" "&" "abs" "not"} {
    set op_re [string_to_regexp $op]
    gdb_test "continue" \
             "Breakpoint $decimal, ops\\.\"$op_re\" .*"\
             "continue to ops.\"$op\""
}


