#   Copyright 2004, 2007, 2008, 2009 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/>.

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@gnu.org

if $tracelevel {
    strace $tracelevel
}

# If the test directory was not created by configure then skip
# this test.
if ![file isdirectory ${objdir}/${subdir}] then {
    return 0
}

#
# test running programs
#
set prms_id 0
set bug_id 0

set testfile exclfwd
set binfile ${objdir}/${subdir}/${testfile}

foreach file {exclfwd1 exclfwd2} {
    if {[gdb_compile "${srcdir}/${subdir}/${file}.c" "${file}.o" object {debug}] != ""} {
        untested exclfwd.exp
        return -1
    }
}

if {[gdb_compile "exclfwd1.o exclfwd2.o" ${binfile} executable {debug}] != "" } {
     untested exclfwd.exp
     return -1
}

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

if ![runto_main] then {
    perror "couldn't run to breakpoint"
    continue
}

get_debug_format

set eol "\[ \t\]*\[\n\r\]+"

gdb_test "ptype v1" "type = struct a {$eol
    int x;$eol
    int y;$eol
}$eol"

if { [test_debug_format "stabs"] } then {
    setup_kfail "gdb/1602" *-*-*
}
gdb_test "ptype v2" "type = struct a {$eol
    const char .c;$eol
}$eol"

if { [test_debug_format "stabs"] } then {
    setup_kfail "gdb/1603" *-*-*
}
gdb_test "ptype v3" "type = const char ."
