# Copyright (C) 1995, 1997 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

# This file was written by Fred Fish. (fnf@cygnus.com)
#                          Martin Pottendorfer (pottendo@aut.alcatel.at)
#

if $tracelevel then {
	strace $tracelevel
}

if [skip_chill_tests] then { continue }

set testfile "misc"
set srcfile ${srcdir}/$subdir/${testfile}.ch
set binfile ${objdir}/${subdir}/${testfile}.exe
if  { [compile "${srcfile} -g -o ${binfile} ${CHILL_RT0} ${CHILL_LIB}"] != "" } {
    perror "Couldn't compile ${srcfile}"
    return -1
}

# Set the current language to chill.  This counts as a test.  If it
# fails, then we skip the other tests.

proc set_lang_chill {} {
    global gdb_prompt
    global binfile objdir subdir

    verbose "loading file '$binfile'"
    gdb_load $binfile

    send_gdb "set language chill\n"
    gdb_expect {
	-re ".*$gdb_prompt $" {}
	timeout { fail "set language chill (timeout)" ; return 0 }
    }

    return [gdb_test "show language" ".* source language is \"chill\".*" \
	"set language to \"chill\""]
}

set prms_id 0
set bug_id 0

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

gdb_test "set print sevenbit-strings" ".*"

if ![set_lang_chill] then {
    runto dummyfunc
    # check upper/lower case 
    gdb_test "ptype BOOL" " = (bool|BOOL)"
    gdb_test "ptype bool" " = (bool|BOOL)"
    gdb_test "print otto" " = 42"
    gdb_test "print OTTO" " = 42"
    gdb_test "print otTO" " = 42"
    gdb_test "print OTto" " = 42"
    gdb_test "print NULL" " = NULL" "print emptiness literal"

    # This tests PR 8496.
    gdb_test {printf "%d %d.",  3+4,2} "7 2." "printf with 2 arguments"

    # This tests GCH/924
    gdb_test {print (h'23)} { = 35} "print parantised integer literal"

    # Linux thinks this is at line 6, but is otherwise ok.
    setup_xfail "i*86-pc-linux*-gnu"
    gdb_test "info line" \
	{Line 7 of .*misc.ch.* at address H'[0-9a-fA-F]+.*}\
	"info about current line"

    # check array () type (expr)
    setup_xfail "m68*-*-hpux*"
    gdb_test "print array () ubyte (foo)" { = \[\(0:11\): 0\]}
	
    send_gdb "set var \$i := foo\n"
    gdb_expect -re ".*$gdb_prompt $"
    setup_xfail "m68*-*-hpux*"
    gdb_test "print/x array () byte (\$i)" { = \[\(0:11\): H'0\]}
}
