# Copyright 2018-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 eol "\[\r\n\]+"
set sp "\[ \t\]*"

set when "when"
set catchpoint_constraint_error_msg \
  "Catchpoint $decimal, exception at $hex in foo \\\(\\\).*at .*foo.adb:$decimal$eol$decimal$sp$when Constraint_Error =>"

set catchpoint_program_error_msg \
  "Catchpoint $decimal, exception at $hex in foo \\\(\\\).*at .*foo.adb:$decimal$eol$decimal$sp$when Program_Error =>"

set catchpoint_storage_error_msg \
  "Catchpoint $decimal, exception at $hex in foo \\\(\\\).*at .*foo.adb:$decimal$eol$decimal$sp$when Storage_Error =>"

############################################
# Check that runtime supports catchpoint.  #
############################################

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

set msg "insert catchpoint on all Ada exceptions handlers"
gdb_test_multiple "catch handlers" $msg {
    -re "Catchpoint $decimal: all Ada exceptions handlers$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 handlers
	# catchpoints.
	unsupported $msg
	return -1
    }
}

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

# Continue.  The program should stop at first exception handling.

gdb_test "continue" \
         "Continuing\.$eol$catchpoint_constraint_error_msg$eol.*" \
         "continuing to first Constraint_Error exception handlers"

# Resume the program's exception.
#
# The program will first go through a block of code which has an
# exception handler, but since no exception is raised, we should
# not stop there.  Instead, we expect to stop in the handler of
# the next exception being raised.

gdb_test "continue" \
         "Continuing\.$eol$catchpoint_storage_error_msg$eol.*" \
         "continuing and stopping in Storage_Error exception handlers"

gdb_test_no_output "delete 2" \
                   "delete catchpoint on all Ada exceptions handlers"

##################################################
# 2. Try catching some named exception handlers. #
##################################################

# Insert a catchpoint on Program_Error Ada exception handlers.

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

# Continue, we should not stop at ABORT_SIGNAL but at Program_Error one.

gdb_test "continue" \
         "Continuing\.$eol$catchpoint_program_error_msg$eol.*" \
         "continuing without stopping to Program_Error exception handlers"

gdb_test_no_output \
    "delete 3" \
    "delete catchpoint on all Program_Error Ada exception handlers"

# Insert a catchpoint on Storage_Error Ada exception handlers.

gdb_test "catch handlers Storage_Error" \
         "Catchpoint $decimal: `Storage_Error' Ada exception handlers" \
         "insert catchpoint on Storage_Error Ada exception handlers"

# Continue, we should stop at Storage_Error handlers.

gdb_test "continue" \
         "Continuing\.$eol$catchpoint_storage_error_msg$eol.*" \
         "continuing without stopping to Storage_Error exception handlers"

gdb_test_no_output \
    "delete 4" \
    "delete catchpoint on all Storage_Error Ada exception handlers"

########################################################################
# 3. Try catching with condition and without named exception handlers. #
########################################################################

# Insert a catchpoint on all Ada exceptions handlers with condition.

gdb_test "catch handlers if Global_Var = 2" \
         "Catchpoint $decimal: all Ada exceptions handlers" \
         "insert catchpoint on all Ada exception handlers with condition"

# Check that condition is stored and properly displayed.

gdb_test "info breakpoint" "stop only if Global_Var = 2" \
         "Check catch handlers with condition"

# Continue, we should not stop at ABORT_SIGNAL but at Program_Error one.

gdb_test "continue" \
         "Continuing\.$eol$catchpoint_constraint_error_msg$eol.*" \
         "continuing to second Constraint_Error exception handlers"

gdb_test_no_output \
    "delete 5" \
    "delete catchpoint on all all Ada exceptions handlers with condition"

################################################################
# 4. Try catching with condition and named exception handlers. #
################################################################

# Insert a catchpoint on Program_Error Ada exception handlers with
# condition.

gdb_test "catch handlers Program_Error if Global_Var = 4" \
    "Catchpoint $decimal: `Program_Error' Ada exception handlers" \
    "insert catchpoint on Program_Error Ada exception handlers with condition"

# Continue, we should not stop at first Program_Error handlers but at
# the second one.

gdb_test "continue" \
         "Continuing\.$eol$catchpoint_program_error_msg$eol.*" \
         "continuing to Program_Error exception handlers"

# Continue, the program should exit properly.

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