# Copyright 2012-2021 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.

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

foreach op { "*" "/" "mod" "rem" "**" "<" "<=" ">" ">=" "=" "and" "or" "xor" "&" "abs" "not"} {
    set op_re [string_to_regexp $op]
    gdb_test_multiple "break \"$op\"" "" {
	-re -wrap "$bp_re: file .*ops.adb, line $decimal." {
	    pass $gdb_test_name
	}
	-re -wrap "$bp_re: \"$op_re\"\. \\($decimal locations\\).*" {
	    pass $gdb_test_name
	}
    }
}

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


