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

if { [skip_fortran_tests] } { continue }

standard_testfile type.f90
load_lib "fortran.exp"

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

if ![fortran_runto_main] {
    fail "run to main"
    return
}

# Depending on the compiler being used, the type names can be printed differently.
set int [fortran_int4]
set real [fortran_real4]

gdb_breakpoint [gdb_get_line_number "bp1"]
gdb_continue_to_breakpoint "bp1"

set t1_i "$int :: t1_i"
set t1_r "$real :: t1_r"

gdb_test "whatis t1" "type = Type t1"
gdb_test "whatis t1v" "type = Type t1"
gdb_test "whatis t2" "type = Type t2"
gdb_test "whatis t2v" "type = Type t2"
gdb_test "whatis t3" "type = Type t3"
gdb_test "whatis t3v" "type = Type t3"
gdb_test "whatis t3p" "type = PTR TO -> \\( Type t3 \\)"

gdb_test "ptype t1" \
  [multi_line "type = Type t1" \
	          "    $t1_i" \
	          "    $t1_r" \
	          "End Type t1"]
gdb_test "ptype t1v" \
  [multi_line "type = Type t1" \
	          "    $t1_i" \
	          "    $t1_r" \
	          "End Type t1"]

gdb_test "ptype t2v" \
  [multi_line "type = Type t2" \
              "    $int :: t2_i" \
              "    Type t1 :: t1_n" \
              "End Type t2"]

gdb_test "ptype t3v" \
  [multi_line "type = Type t3" \
              "    $int :: t3_i" \
              "    Type t2 :: t2_n" \
              "End Type t3"]

gdb_test "ptype t3p" \
  [multi_line "type = PTR TO -> \\( Type t3" \
              "    $int :: t3_i" \
              "    Type t2 :: t2_n" \
              "End Type t3 \\)"]
