# 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.  

# A <invalid type code nn> error from gdb, reported in <rdar://problem/4212652>.
# This comes up from stabs like

# 00000000 - 00 0003  LSYM event64_t:t(0,2)=(0,3)
# 00000000 - 00 0031  LSYM uint64_t:t(0,3)=(0,4)
# 00000000 - 00 0000  LSYM long long unsigned int:t(0,4)=@s64;r(0,4);0;01777777777777777777777;

# where event64_t is defined in terms of a not-yet-seen type, and uint64_t
# is defined in terms of a not-yet-seen type, and long long unsigned int is
# a range type.  gdb isn't currently fixing up the double indirect forward 
# reference to a range type, so ptype uint64_t fails.

if $tracelevel then {
        strace $tracelevel
        }

#
# test running programs
#

set prms_id 0
set bug_id 0

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

if [target_info exists darwin64] {
   verbose "This test file not applicable for x86-64, skipping."
   return
}

set additional_flags "additional_flags=-gstabs+ -feliminate-unused-debug-symbols"

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable $additional_flags ] != "" } {
     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 place to put a breakpoint"]" "Breakpoint 1 at $hex: file.*, line.*\\." "Set breakpoint on line  'good stopping point in main'"

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

gdb_test "print foo" ".*wait_event = 5.*" "print contents of foo"
gdb_test "ptype foo" "type = struct thread .*event64_t wait_event;.*" "ptype struct foo"
gdb_test "ptype event64_t" "type = .*long.*" "ptype event64_t"
gdb_test "ptype uint64_t" "type = .*long.*" "ptype uint64_t"

gdb_exit
return 0
