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

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
