# Copyright 1995, 1996, 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 Wilfried Moser (moser@aut.alcatel.at)
#

if $tracelevel then {
        strace $tracelevel
}

if [skip_chill_tests] then { continue }

set testfile "gch1272"
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 brrr

    # check foo
    gdb_test {print foo} { = \[\(0:99\): 222\]}
    gdb_test "set var foo := m_array\[\(\*\):44\]" ".*"
    gdb_test {print foo} { = \[\(0:99\): 44\]}

    # check bar
    gdb_test {print bar} { = \[\(-10:20\): \[.i: 0, .b: FALSE\]\]}
    gdb_test "set var bar := m_bar\[\(\*\): \[42, TRUE\]\]" ".*"
    gdb_test {print bar} { = \[\(-10:20\): \[.i: 42, .b: TRUE\]\]}

    # some failues
    gdb_test "set var foo := \[\(\*\):44\]" {\(\*\) only possible with modename in front of tuple \(mode\[\.\.\]\)}
    gdb_test "set var foo := m_xxx\[\(\*\):44\]" {Invalid cast\.}
    gdb_test "set var foo := m_struct\[\(\*\):44\]" {\(\*\) in invalid context}
    gdb_test "set var foo := m_ps\[\(\*\):44\]" {\(\*\) in invalid context}
}
