# 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 }

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

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


