# Copyright 2007-2020 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"

standard_ada_testfile foo

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

clean_restart ${testfile}

# Some global variables used to simplify the maintenance of some of
# the regular expressions below.
set any_nb "\[0-9\]+"
set any_addr "0x\[0-9a-zA-Z\]+"
set eol "\[\r\n\]+"
set sp "\[ \t\]*"

set info_break_header "Num${sp}Type${sp}Disp${sp}Enb${sp}Address${sp}What"
set catch_exception_info \
  "$any_nb${sp}catchpoint${sp}keep${sp}y${sp}all Ada exceptions"

####################################
# 1. Try catching all exceptions.  #
####################################

if ![runto_main] then {
   fail "cannot run to main, testcase aborted"
   return 0
}

set msg "insert catchpoint on all Ada exceptions"
gdb_test_multiple "catch exception" $msg {
    -re "Catchpoint $any_nb: all Ada exceptions$eol$gdb_prompt $" {
	pass $msg
    }
    -re "Your Ada runtime appears to be missing some debugging information.*$eol$gdb_prompt $" {
	# If the runtime was not built with enough debug information,
	# or if it was stripped, we can not test exception
	# catchpoints.
	unsupported $msg
	return -1
    }
}

gdb_test "info break" \
         "$info_break_header$eol.*$catch_exception_info" \
         "info break, catch all Ada exceptions"

set catchpoint_msg \
  "Catchpoint $any_nb, CONSTRAINT_ERROR (\\\(foo\\.adb:$decimal explicit raise\\\) )?at $any_addr in foo \\\(\\\).*at .*foo.adb:$any_nb"
gdb_test "continue" \
         "Continuing\.$eol$catchpoint_msg$eol.*SPOT1" \
         "continuing to first exception"

set catchpoint_msg \
  "Catchpoint $any_nb, PROGRAM_ERROR (\\\(foo\\.adb:$decimal explicit raise\\\) )?at $any_addr in foo \\\(\\\).*at .*foo.adb:$any_nb"
gdb_test "continue" \
         "Continuing\.$eol$catchpoint_msg$eol.*SPOT2" \
         "continuing to second exception"

################################################
# 2. Try catching only some of the exceptions. #
################################################

# Here is the scenario:
#  - Restart the debugger from scratch, runto_main
#  - We'll catch only "Program_Error"
#    We'll catch assertions
#    We'll catch unhandled exceptions
#  - continue, we should see the first Program_Error exception
#  - continue, we should see the failed assertion
#  - continue, we should see the unhandled Constrait_Error exception
#  - continue, the program exits.

if ![runto_main] then {
   fail "cannot run to main, testcase aborted"
   return 0
}

gdb_test "catch exception Program_Error" \
         "Catchpoint $any_nb: \`Program_Error' Ada exception" \
         "insert catchpoint on Program_Error"

gdb_test "catch assert" \
         "Catchpoint $any_nb: failed Ada assertions" \
         "insert catchpoint on failed assertions"

gdb_test "catch exception unhandled" \
         "Catchpoint $any_nb: unhandled Ada exceptions" \
         "insert catchpoint on unhandled exceptions"

set catch_exception_entry \
  "$any_nb${sp}catchpoint${sp}keep${sp}y${sp}\`Program_Error' Ada exception"
set catch_assert_entry \
  "$any_nb${sp}catchpoint${sp}keep${sp}y${sp}failed Ada assertions"
set catch_unhandled_entry \
  "$any_nb${sp}catchpoint${sp}keep${sp}y${sp}unhandled Ada exceptions"

gdb_test "info break" \
         "$info_break_header$eol.*$catch_exception_entry$eol$catch_assert_entry$eol$catch_unhandled_entry" \
         "info break, second run"

set catchpoint_msg \
  "Catchpoint $any_nb, PROGRAM_ERROR (\\\(foo.adb:$decimal explicit raise\\\) )?at $any_addr in foo \\\(\\\).*at .*foo.adb:$any_nb"
gdb_test "continue" \
         "Continuing\.$eol$catchpoint_msg$eol.*SPOT2" \
         "continuing to Program_Error exception"

set catchpoint_msg \
  "Catchpoint $any_nb, failed assertion at $any_addr in foo \\\(\\\).*at .*foo.adb:$any_nb"
gdb_test "continue" \
         "Continuing\.$eol$catchpoint_msg$eol.*SPOT3" \
         "continuing to failed assertion"

set catchpoint_msg \
  "Catchpoint $any_nb, unhandled CONSTRAINT_ERROR at $any_addr in foo \\\(\\\).*at .*foo.adb:$any_nb"
gdb_test "continue" \
         "Continuing\.$eol$catchpoint_msg$eol.*SPOT4" \
         "continuing to unhandled exception"

gdb_test "continue" \
         "Continuing\..*$inferior_exited_re.*" \
         "continuing to program completion"

#################################
# 3. Try temporary catchpoints. #
#################################

# Scenario:
#   - Insert a temporary catchpoint on all exceptions.
#   - Run to that catchpoint
#   - Continue; we should reach the program's exit, not stopping
#     at any of the other exceptions that are being raised inside
#     the program.

if ![runto_main] then {
   fail "cannot run to main, testcase aborted"
   return 0
}

gdb_test "tcatch exception" \
         "Temporary catchpoint $any_nb: all Ada exceptions"

set temp_catchpoint_msg \
  "Temporary catchpoint $any_nb, CONSTRAINT_ERROR (\\\(.*\\\) )?at $any_addr in foo \\\(\\\).*at .*foo.adb:$any_nb"
gdb_test "continue" \
         "Continuing\.$eol$temp_catchpoint_msg$eol.*SPOT1" \
         "continuing to temporary catchpoint"

gdb_test "continue" \
         "Continuing\..*$inferior_exited_re.*" \
         "continuing to program completion"



