# Copyright 1994, 1995, 1997, 1998 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 adapted from (OBSOLETE) Chill tests by Stan Shebs (shebs@cygnus.com).

if $tracelevel then {
	strace $tracelevel
}

set prms_id 0
set bug_id 0

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

proc set_lang_fortran {} {
    global gdb_prompt
    
    if [gdb_test "set language fortran" ""] {
	return 0;
    }

    if ![gdb_test "show language" ".* source language is \"fortran\".*"] {
	return 1;
    } else {
	return 0;
    }
}

proc test_integer_literal_types_accepted {} {
    global gdb_prompt

    # Test various decimal values.
    # Should be integer*4 probably.
    gdb_test "pt 123" "type = int" 
}

proc test_character_literal_types_accepted {} {
    global gdb_prompt

    # Test various character values.

    gdb_test "pt 'a'" "type = character\\*1"
}

proc test_integer_literal_types_rejected {} {
    global gdb_prompt

    test_print_reject "pt _"
}

proc test_logical_literal_types_accepted {} {
    global gdb_prompt

    # Test the only possible values for a logical, TRUE and FALSE.

    gdb_test "pt .TRUE." "type = logical\\*2"
    gdb_test "pt .FALSE." "type = logical\\*2"
}

proc test_float_literal_types_accepted {} {
    global gdb_prompt

    # Test various floating point formats

    # this used to guess whether to look for "real*4" or
    # "real*8" based on a target config variable, but noone
    # maintained it properly.

    gdb_test "pt .44" "type = real\\*\[0-9\]+"
    gdb_test "pt 44.0" "type = real\\*\[0-9\]+"
    gdb_test "pt 10D20" "type = real\\*\[0-9\]+"
    gdb_test "pt 10D20" "type = real\\*\[0-9\]+"
    gdb_test "pt 10d20" "type = real\\*\[0-9\]+"
    gdb_test "pt 10d20" "type = real\\*\[0-9\]+"
    gdb_test "pt 10E20" "type = real\\*\[0-9\]+"
    gdb_test "pt 10E20" "type = real\\*\[0-9\]+"
    gdb_test "pt 10e20" "type = real\\*\[0-9\]+"
    gdb_test "pt 10e20" "type = real\\*\[0-9\]+"
}

# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

gdb_test "set print sevenbit-strings" ""

if [set_lang_fortran] then {
    test_integer_literal_types_accepted
    test_integer_literal_types_rejected
    test_logical_literal_types_accepted
    test_character_literal_types_accepted
    test_float_literal_types_accepted
} else {
    warning "$test_name tests suppressed." 0
}
