# Copyright 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.  
#
# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

if $tracelevel then {
    strace $tracelevel
}

set testfile "sep"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

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

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

# Try to display the source code inside a file which is included by
# another source file.  The purpose of this test is to verify that
# this operation works, even before we have loaded full symbols for
# that file (by doing a "break say_hello" for instance).
#
# We just check that the command succeeds, so no need to match the
# complete exact output.  Simply verifying that we get procedure
# say_hello is good enough, and avoid unnecessary failures is someone
# decides later to reformat sep-proc.c.

gdb_test "list sep-proc.c:23" \
         "void.*say_hello.*" \
         "list using location inside included file"

# Try the same, but this time with a breakpoint.  We need to exit
# GDB to make sure that we havn't loaded the full symbols yet when
# we test the breakpoint insertion.
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

set test "breakpoint inside included file"
gdb_test_multiple "break sep-proc.c:25" "$test" {
    -re "Breakpoint.*at.* file .*sep-proc.c, line .*" {
        pass "$test"
    }
    -re "No source file named sep-proc.c.*" {
        fail "$test"
    }
}

