# Copyright 2005 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 uncovers a stabs bug.  We were replacing a forward reference
# type with a type of the same NAME without checking whether it's type
# slot was the same as the one we were replacing it with.  That caused an
# infinite recursion in the type hierarchy.
 
if $tracelevel then {
        strace $tracelevel
        }

#
# test running programs
#

set prms_id 0
set bug_id 0

set testfile "r4183684"
set srcfile ${testfile}.cc
set binfile ${objdir}/${subdir}/${testfile}

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

# Start with a fresh gdb
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_file_cmd "${binfile}"

send_gdb "set width 0\n"
gdb_expect -re "$gdb_prompt $"

gdb_test "break [gdb_get_line_number "good stopping point in main"]" "Breakpoint 1 at $hex: file.*, line.*\\." "Set breakpoint on line  'good stopping point in main'"
gdb_test "break [gdb_get_line_number "good stopping point in reportBase"]" "Breakpoint 2 at $hex: file.*, line.*\\." "Set breakpoint on line  'good stopping point in reportBase'"

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

gdb_test "print cont" "\\$$decimal = {<Container::Widget> = {containerVar = 200}, contVar = 100}" "print cont in main"

gdb_test "cont" "Continu.* *Breakpoint 2, reportBase.*" "continue to breakpoint in reportBase()"

gdb_test "print *input" "\\$$decimal = {containerVar = 200}" "print input in reportBase"

gdb_exit
return 0


