# Copyright 1997-2013 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/>.

# 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 has many absolute line numbers.
# Replace them with gdb_get_line_number.

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

if { [skip_stl_tests] } { continue }

# On SPU this test fails because the executable exceeds local storage size.
if { [istarget "spu*-*-*"] } {
        return 0
}

standard_testfile .cc
 
if {[prepare_for_testing $testfile.exp $testfile $srcfile {debug c++}]} {
    return -1
}

# Set a catch catchpoint

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

# Set a throw catchpoint

gdb_test "catch throw" "Catchpoint \[0-9\]+ \\(throw\\)" \
    "catch throw (before inferior run)"

# Set a rethrow catchpoint

gdb_test "catch rethrow" "Catchpoint \[0-9\]+ \\(rethrow\\)" \
    "catch rethrow (before inferior run)"


# The catchpoints should be listed in the list of breakpoints.
# In case of a statically linked test, we won't have a pending breakpoint.
# Hence we allow for both an address or "<PENDING>". If we ever become able
# to tell whether the target is linked statically or not, we can be more
# precise and require exact output.
set addr "\(<PENDING>|$hex\)"
set re_head	"Num${ws}Type${ws}Disp${ws}Enb${ws}Address${ws}What"
set re_2_bp	"1${ws}breakpoint${ws}keep${ws}y${ws}$addr${ws}exception catch"
set re_3_bp	"2${ws}breakpoint${ws}keep${ws}y${ws}$addr${ws}exception throw"
set re_4_bp   "3${ws}breakpoint${ws}keep${ws}y${ws}$addr${ws}exception rethrow"

set name "info breakpoints (before inferior run)"
gdb_test_multiple "info breakpoints" $name {
    -re "$re_head${ws}$re_2_bp${ws}$re_3_bp${ws}$re_4_bp\r\n$gdb_prompt $" {
	pass $name
    }
    -re ".*$gdb_prompt $"
      {
	fail $name
      }
}

gdb_test "tbreak main" "Temporary breakpoint 4.*" \
    "Set temporary breakpoint at main"

set ok 0
gdb_run_cmd
gdb_test_multiple "" "Run to main" {
    -re "Temporary breakpoint 4,.*$gdb_prompt $" {
	pass "Run to main"
	set ok 1
    }
}

if { !$ok } {
    continue
}

set addr "$hex"
set re_head	"Num${ws}Type${ws}Disp${ws}Enb${ws}Address${ws}What"
set re_2_bp	"1${ws}breakpoint${ws}keep${ws}y${ws}$addr${ws}exception catch"
set re_3_bp	"2${ws}breakpoint${ws}keep${ws}y${ws}$addr${ws}exception throw"
set re_4_bp   "3${ws}breakpoint${ws}keep${ws}y${ws}$addr${ws}exception rethrow"

set name "info breakpoints (after inferior run)"
gdb_test_multiple "info breakpoints" $name {
    -re "$re_head${ws}$re_2_bp${ws}$re_3_bp${ws}$re_4_bp\r\n$gdb_prompt $" {
	pass $name
    }
    -re ".*$gdb_prompt $"
      {
	send_user "\n---\n$expect_out(buffer)\n---\n"
	fail $name
      }
}

gdb_test "break catcher" "Breakpoint \[0-9\]+ at.*"

# 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$gdb_prompt $" {
	pass $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\]+.*\[\[:<:\]\]__cxa_throw\[\[:>:\]\].*#\[0-9\]+${ws}$hex in foo \\(i=20\\) at .*${srcfile}:\[0-9\]+\r\n#\[0-9\]+${ws}$hex in main \\(.*\\) at .*${srcfile}:\[0-9\]+\r\n$gdb_prompt $" {
	# Either __cxxabiv1::__cxa_throw or __cxa_throw can be printed
	# depending on debug info presence.
	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$gdb_prompt $" {
	pass $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\]+.*\[\[:<:\]\]__cxa_begin_catch\[\[:>:\]\].*#\[0-9\]+${ws}$hex in main \\(.*\\) at .*$srcfile:\[0-9\]+\r\n$gdb_prompt $" {
	pass $name
    }
}

# Continue to breakpoint on catcher.
gdb_test "continue" ".*catcher \\(x=13\\).*" "continue to catcher for the first time"

# Continue to second throw.

set name "continue to second throw"
gdb_test_multiple "continue" $name {
    -re "Continuing.${ws}Catchpoint \[0-9\]+ \\(exception thrown\\), throw location.*${srcfile}:30, catch location .*${srcfile}:58\r\n$gdb_prompt $" {
	pass $name
    }
    -re "Continuing.${ws}Catchpoint \[0-9\]+ \\(exception thrown\\).*\r\n$gdb_prompt $" {
	pass $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\]+.*\[\[:<:\]\]__cxa_throw\[\[:>:\]\].*#\[0-9\]+${ws}$hex in foo \\(i=20\\) at .*${srcfile}:\[0-9\]+\r\n#\[0-9\]+${ws}$hex in main \\(.*\\) at .*${srcfile}:\[0-9\]+\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$gdb_prompt $" {
	pass $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\]+.*\[\[:<:\]\]__cxa_begin_catch\[\[:>:\]\].*#\[0-9\]+${ws}$hex in main \\(.*\\) at .*$srcfile:\[0-9\]+\r\n$gdb_prompt $" {
	pass $name
    }
}

# Continue to breakpoint on catcher.
gdb_test "continue" ".*catcher \\(x=13\\).*" "continue to catcher for the second time"


# Continue to the re-throw.

gdb_test "continue" "Catchpoint \[0-9\]+.*exception rethrown.*" \
    "continue to rethrow"
