# Copyright 1997, 1998, 2004 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

# This file is part of the gdb testsuite.
# tests for exception-handling support
# Written by Satish Pai <pai@apollo.hp.com> 1997-07-23
# Rewritten by Michael Chastain <mec.gnu@mindspring.com> 2004-01-08

# This file used to have two copies of the tests with different
# compiler flags for hp-ux.  Instead, the user should set CXXOPTS
# or run runtest with --target_board unix/gdb:debug_flags="..."
# to choose the compiler flags.
#
# The interesting compiler flags are: "aCC +A -Wl,-a,-archive" .
# Static-linked executables use a different mechanism to get the
# address of the notification hook in the C++ support library.

# TODO: this file is not ready for production yet.  If you are working
# on C++ exception support for gdb, you can take out the "continue"
# statement and try your luck.  -- chastain 2004-01-09

# TODO: this file has many absolute line numbers.
# Replace them with gdb_get_line_number.

set ws	"\[\r\n\t \]+"
set nl	"\[\r\n\]+"

if $tracelevel then {
    strace $tracelevel
}

if { [skip_cplus_tests] } { continue }

set testfile "exception"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}
 
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug c++}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

# Start with a fresh gdb

set prms_id 0
set bug_id 0

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

# As I said before, this test script is not ready yet!

continue

# Set a catch catchpoint

gdb_test "catch catch" "Catchpoint \[0-9\]+ \\(catch\\)"

# Set a throw catchpoint

gdb_test "catch throw" "Catchpoint \[0-9\]+ \\(throw\\)" \
    "catch throw (static executable)"

# The catchpoints should be listed in the list of breakpoints.

set re_head	"Num${ws}Type${ws}Disp${ws}Enb${ws}Address${ws}What"
set re_1_main   "1${ws}breakpoint${ws}keep${ws}y${ws}$hex${ws}in main.*breakpoint already hit.*"
set re_2_catch	"2${ws}catch catch${ws}keep${ws}y${ws}$hex${ws}exception catch"
set re_3_catch	"3${ws}catch throw${ws}keep${ws}y${ws}$hex${ws}exception throw"
set re_2_bp	"2${ws}breakpoint${ws}keep${ws}y${ws}$hex${ws}exception catch"
set re_3_bp	"3${ws}breakpoint${ws}keep${ws}y${ws}$hex${ws}exception throw"

set name "info breakpoints"
gdb_test_multiple "info breakpoints" $name {
    -re "$re_head${ws}$re_1_main${ws}$re_2_catch${ws}$re_3_catch\r\n$gdb_prompt $" {
	pass $name
    }
    -re "$re_head${ws}$re_1_main${ws}$re_2_bp${ws}$re_3_bp\r\n$gdb_prompt $" {
	# TODO: gdb HEAD 2004-01-08 does this.  Is this okay?
	unresolved $name
    }
}

# Some targets support "info catch".
# Some do not.

set name "info catch"
gdb_test_multiple "info catch" $name {
    -re "Info catch not supported with this target/compiler combination.\r\n$gdb_prompt $" {
	unsupported $name
    }
    -re "No catches.\r\n$gdb_prompt $" {
	# TODO: gdb HEAD 2004-01-08 does this.  Is this okay?
	unresolved $name
    }
}

# Get the first exception thrown
       
set name "continue to first throw"
gdb_test_multiple "continue" $name {
    -re "Continuing.${ws}Catchpoint \[0-9\]+ \\(exception thrown\\), throw location.*${srcfile}:30, catch location .*${srcfile}:50\r\n$gdb_prompt $" {
	pass $name
    }
    -re "Continuing.${ws}Catchpoint \[0-9\]+ \\(exception thrown\\)\r\n.*\r\n$gdb_prompt $" {
	# TODO: gdb HEAD 2004-01-08 does this.  Is this okay?
	unresolved $name
    }
}

# Backtrace from the throw point.
# This should get to user code.

set name "backtrace after first throw"
gdb_test_multiple "backtrace" $name {
    -re ".*#\[0-9\]+${ws}$hex in foo \\(i=20\\) at .*${srcfile}:30\r\n#\[0-9\]+${ws}$hex in main \\((void|)\\) at .*${srcfile}:48\r\n$gdb_prompt $" {
	pass $name
    }
}

# Continue to the catch.

set name "continue to first catch"
gdb_test_multiple "continue" $name {
    -re "Continuing.${ws}Catchpoint \[0-9\]+ \\(exception caught\\), throw location.*${srcfile}:30, catch location .*${srcfile}:50\r\n$gdb_prompt $" {
	pass $name
    }
    -re "Continuing.${ws}Catchpoint \[0-9\]+ \\(exception caught\\)\r\n.*\r\n$gdb_prompt $" {
	# TODO: gdb HEAD 2004-01-08 does this.  Is this okay?
	unresolved $name
    }
}

# Backtrace from the catch point.
# This should get to user code.

set name "backtrace after first catch"
gdb_test_multiple "backtrace" $name {
    -re ".*#\[0-9\]+${ws}$hex in main \\((void|)\\) at .*$srcfile:50\r\n$gdb_prompt $" {
	pass $name
    }
}

# Continue to second throw.

set name "continue to second throw"
gdb_test_multiple "continue" $name {
    -re "Continuing.${ws}Got an except 13${ws}Catchpoint \[0-9\]+ \\(exception thrown\\), throw location.*${srcfile}:30, catch location .*${srcfile}:58\r\n$gdb_prompt $" {
	pass $name
    }
    -re "Continuing.${ws}Got an except 13${ws}Catchpoint \[0-9\]+ \\(exception thrown\\)\r\n.*\r\n$gdb_prompt $" {
	# TODO: gdb HEAD 2004-01-08 does this.  Is this okay?
	unresolved $name
    }
}

# Backtrace from the throw point.
# This should get to user code.

set name "backtrace after second throw"
gdb_test_multiple "backtrace" $name {
    -re ".*#\[0-9\]+${ws}$hex in foo \\(i=20\\) at .*${srcfile}:30\r\n#\[0-9\]+${ws}$hex in main \\((void|)\\) at .*${srcfile}:56\r\n$gdb_prompt $" {
	pass $name
    }
}

# Continue to second catch.

set name "continue to second catch"
gdb_test_multiple "continue" $name {
    -re "Continuing.${ws}Catchpoint \[0-9\]+ \\(exception caught\\), throw location.*${srcfile}:30, catch location .*${srcfile}:58\r\n$gdb_prompt $" {
	pass $name
    }
    -re "Continuing.${ws}Catchpoint \[0-9\]+ \\(exception caught\\)\r\n.*\r\n$gdb_prompt $" {
	# TODO: gdb HEAD 2004-01-08 does this.  Is this okay?
	unresolved $name
    }
}

# Backtrace from the catch point.
# This should get to user code.

set name "backtrace after second catch"
gdb_test_multiple "backtrace" $name {
    -re ".*#\[0-9\]+${ws}$hex in main \\((void|)\\) at .*$srcfile:58\r\n$gdb_prompt $" {
	pass $name
    }
}

# That is all for now.
# 
# The original code had:
#
#    continue to re-throw ; backtrace
#    continue to catch    ; backtrace
#    continue to throw out of main
#
# The problem is that "re-throw" does not show a throw; only a catch.
# I do not know if this is because of a bug, or because the generated
# code is optimized for a throw into the same function.
#
# -- chastain 2004-01-09
