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