# Copyright 2019-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 tests 'info types' for some Fortran types.

load_lib "fortran.exp"
load_lib "sym-info-cmds.exp"

if { [skip_fortran_tests] } { continue }

standard_testfile info-types.f90 info-types-2.f90

if { [prepare_for_testing "failed to prepare" $testfile \
	  [list $srcfile2 $srcfile] {debug f90}] } {
    return -1
}

if { ![fortran_runto_main] } {
    perror "Could not run to main."
    continue
}

set integer4 [fortran_int4]
set integer8 [fortran_int8]
set logical4 [fortran_logical4]
set character1 [fortran_character1]
set real4 [fortran_real4]

GDBInfoSymbols::run_command "info types"
GDBInfoSymbols::check_header "All defined types:"

GDBInfoSymbols::check_entry "${srcfile}" "" "${character1}"
GDBInfoSymbols::check_entry "${srcfile}" "" "${integer4}"
GDBInfoSymbols::check_entry "${srcfile}" "" "${logical4}"
GDBInfoSymbols::check_entry "${srcfile}" "$decimal" "Type m1t1;"
GDBInfoSymbols::check_entry "${srcfile}" "" "${real4}"
GDBInfoSymbols::check_entry "${srcfile}" "37" "Type s1;"

return 0

gdb_test "info types" \
    [multi_line \
	 "All defined types:" \
	 "" \
	 "File .*:" \
	 "\[\t \]+${character1}" \
	 "\[\t \]+${integer4}" \
	 "(\[\t \]+${integer8}" \
	 ")?\[\t \]+${logical4}" \
	 "(35:\[\t \]+Type __vtype_mod1_M1t1;" \
	 ")?$decimal:\[\t \]+Type m1t1;" \
	 "\[\t \]+${real4}" \
	 "37:\[\t \]+Type s1;(" \
	 ".*)?"]
