# Copyright 1994-2021 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/>.

# This file was adapted from old Chill tests by Stan Shebs
# (shebs@cygnus.com).

load_lib "fortran.exp"

if { [skip_fortran_tests] } { continue }

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 (and
    # also true and false).

    gdb_test "pt .TRUE." "type = logical\\*2"
    gdb_test "pt .FALSE." "type = logical\\*2"
    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 10E20" "type = real\\*\[0-9\]+"
    gdb_test "pt 10e20" "type = real\\*\[0-9\]+"
}

# Test the the primitive Fortran types, those that GDB should always
# know, even if the program does not define them, are in fact, known.
proc test_primitive_types_known {} {
    foreach type {void character logical*1 integer*2 integer*8 \
		      logical*2 logical*8 integer logical*4 real \
		      real*8 real*16} {
	gdb_test "ptype $type" [string_to_regexp "type = $type"]
    }
}

# 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_primitive_types_known
    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
}
