# Copyright 2003 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 was written by Caroline Tice <ctice@apple.com>

# This test case tests that gcc's linetable information for
# "blocks" is correct..

if $tracelevel then {
        strace $tracelevel
        }

set prms_id 0
set bug_id 0

if { [skip_cplus_tests] } { continue }

set testfile "cp-blocks-linetables"
set srcfile ${testfile}.cc
set objfile ${objdir}/${subdir}/${testfile}.o
set binfile ${objdir}/${subdir}/${testfile}

if [get_compiler_info ${binfile} c++] {
    return -1;
}

set additional_flags "additional_flags= -g -c -mmacosx-version-min=10.6"
if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${objfile}" object [list {debug c++} $additional_flags]] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

if  { [gdb_compile "${objfile}" "${binfile}" executable {debug c++} ] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}

if {$debug_default_format_is_dwarf == 0 } then {
        return;
}

# Start with a fresh gdb

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

# runto_main

# set bp_at_first_block_function   [gdb_get_line_number "Breakpoint for first Blo\
ck function."]
# set bp_at_second_block_function  [gdb_get_line_number "Breakpoint for second Bl\
ock function."]

# gdb_breakpoint $bp_at_first_block_function #  This is breakpoint 2
# gdb_breakpoint $bp_at_second_block_function # This is breakpoint 3

# gdb_test "break __main_block_invoke_1" "Breakpoint 1 at .*" "Set breakpoint at __helper_1"
# gdb_test "break __main_block_invoke_2" "Breakpoint 2 at .*" "Set breakpoint at __helper_2"

gdb_breakpoint 26
gdb_breakpoint 34

gdb_test "run" "Starting program: $binfile *\r\n\Reading symbols for shared libraries \(\[.+\]\)+ done.*Breakpoint 1.*" "continue to breakpoint at first Block function"

# Verifying linear stepping through first block function

gdb_test "next" {.*(\{ enum numbers|\{ __block enum numbers ).*} "First next"
gdb_test "next" {.*(\{ __block enum numbers |y ).*} "Second next"
gdb_test "next" {.*(y |if ).*} "Third next"
gdb_test "next"
gdb_test "next" {.*(\}|Breakpoint 2, ).*} "Fifth next"
gdb_test "next" {.*(Breakpoint 2, |if).*} "Sixth next"
# gdb_test "next" {.*if.*} "Seventh next"
gdb_test "next" {.*(if|x).*} "Eighth next"
gdb_test "next" {.*(x|if).*} "Ninth next"
# gdb_test "next" {.*if.*} "Tenth next"
# gdb_test "next" {.*(if|return).*} "Eleventh next"
# gdb_test "next" {.*(return |\}).*} "Twelfth next"
# gdb_test "next" {.*(\}|test).*} "Thirteenth next"
# gdb_test "next" {.*(test ).*} "Fourteenth next"

gdb_test "delete 1 2" ".*" "Delete all breakpoints"

gdb_test "break main" "Breakpoint 3 at .*" "Set breakpoint at main"

send_gdb "run\n"
gdb_expect {
    -re ".*Start it from the beginning.*y or n. $"\
	{send_gdb "y\n"
	    gdb_expect {
               -re ".*Breakpoint 3, main .*$gdb_prompt $"\
		   {pass "Break at main"}
               -re "$gdb_prompt $"\
		   {fail "Break at main"}
		timeout {fail "(timeout) Break at main"}
	    }
	}
    -re "$gdb_prompt $"\
	{fail "rerun for stepping through main"}
    timeout {fail "(timeout) rerun for stepping through main"}
}

gdb_test "next" {.*(__block enum numbers x |__block enum numbers y).*} "First next"
gdb_test "next" {.*(__block enum numbers y |\};).*} "Second next"
gdb_test "next" {.*(\};|enum numbers res).*} "Third next"
gdb_test "next" {.*(enum numbers res |if ).*} "Fourth next"
gdb_test "next" {.*(if |return ).*} "Fifth next"
gdb_test "next" {.*(return |\}).*} "Sixth next"

# gdb_test "continue" ".*Program exited normally.*" "Finish program"

gdb_exit
return 0
