# Copyright 2018-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 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 {
   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"
