# This test code is part of GDB, the GNU debugger.

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

# Auxiliary function to set the language to fortran.
# The result is 1 (true) for success, 0 (false) for failure.

proc set_lang_fortran {} {
    if [gdb_test_no_output "set language fortran"] {
	return 0
    }
    if [gdb_test "show language" ".* source language is \"fortran\"." \
	   "set language to \"fortran\""] {
	return 0
    }
    return 1
}

proc fortran_int4 {} {
    if {[test_compiler_info {gcc-4-[012]-*}]} {
	return "int4"
    } elseif {[test_compiler_info {gcc-*}]} {
	return "integer\\(kind=4\\)"
    } elseif {[test_compiler_info {clang-*}]} {
	return "integer"
    } elseif {[test_compiler_info {icc-*}]} {
	return "INTEGER\\(4\\)"
    } else {
	return "unknown"
    }
}

proc fortran_int8 {} {
    if {[test_compiler_info {gcc-4-[012]-*}]} {
	return "int8"
    } elseif {[test_compiler_info {gcc-*}]} {
	return "integer\\(kind=8\\)"
    } elseif {[test_compiler_info {clang-*}]} {
	return "integer\\*8"
    } elseif {[test_compiler_info {icc-*}]} {
	return "INTEGER\\(8\\)"
    } else {
	return "unknown"
    }
}

proc fortran_real4 {} {
    if {[test_compiler_info {gcc-4-[012]-*}]} {
	return "real4"
    } elseif {[test_compiler_info {gcc-*}]} {
	return "real\\(kind=4\\)"
    } elseif {[test_compiler_info {clang-*}]} {
	return "real"
    } elseif {[test_compiler_info {icc-*}]} {
	return "REAL\\(4\\)"
    } else {
	return "unknown"
    }
}

proc fortran_real8 {} {
    if {[test_compiler_info {gcc-4-[012]-*}]} {
	return "real8"
    } elseif {[test_compiler_info {gcc-*}]} {
	return "real\\(kind=8\\)"
    } elseif {[test_compiler_info {clang-*}]} {
	return "double precision"
    } elseif {[test_compiler_info {icc-*}]} {
	return "REAL\\(8\\)"
    } else {
	return "unknown"
    }
}

proc fortran_complex4 {} {
    if {[test_compiler_info {gcc-4-[012]-*}]} {
	return "complex4"
    } elseif {[test_compiler_info {gcc-*}]} {
	return "complex\\(kind=4\\)"
    } elseif {[test_compiler_info {clang-*}]} {
	return "complex"
    } elseif {[test_compiler_info {icc-*}]} {
	return "COMPLEX\\(4\\)"
    } else {
	return "unknown"
    }
}

proc fortran_complex8 {} {
    if {[test_compiler_info {gcc-4-[012]-*}]} {
	return "complex8"
    } elseif {[test_compiler_info {gcc-*}]} {
	return "complex\\(kind=8\\)"
    } elseif {[test_compiler_info {clang-*}]} {
	return "double complex"
    } elseif {[test_compiler_info {icc-*}]} {
	return "COMPLEX\\(8\\)"
    } else {
	return "unknown"
    }
}

proc fortran_complex16 {} {
    if {[test_compiler_info {gcc-4-[012]-*}]} {
	return "complex16"
    } elseif {[test_compiler_info {gcc-*}]} {
	return "complex\\(kind=16\\)"
    } elseif {[test_compiler_info {clang-*}]} {
	return "quad complex"
    } elseif {[test_compiler_info {icc-*}]} {
	return "COMPLEX\\(16\\)"
    } else {
	return "unknown"
    }
}

proc fortran_logical4 {} {
    if {[test_compiler_info {gcc-4-[012]-*}]} {
	return "logical4"
    } elseif {[test_compiler_info {gcc-*}]} {
	return "logical\\(kind=4\\)"
    } elseif {[test_compiler_info {clang-*}]} {
	return "logical"
    } elseif {[test_compiler_info {icc-*}]} {
	return "LOGICAL\\(4\\)"
    } else {
	return "unknown"
    }
}

proc fortran_character1 {} {
    if {[test_compiler_info {gcc-4-[012]-*}]} {
	return "character1"
    } elseif {[test_compiler_info {gcc-*}]} {
	return "character\\(kind=1\\)"
    } elseif {[test_compiler_info {clang-*}]} {
	return "character"
    } elseif {[test_compiler_info {icc-*}]} {
	return "CHARACTER\\(1\\)"
    } else {
	return "unknown"
    }
}

# Return name of the main procedure based on the compiler version.

proc fortran_main {} {
    if {[test_compiler_info {gcc-4-[012]-*}]
         || [test_compiler_info {gcc-*}]
         || [test_compiler_info {icc-*}]} {
	return "MAIN__"
    } elseif {[test_compiler_info {clang-*}]} {
	return "MAIN_"
    } else {
	return "unknown"
    }
}

# Fortran version of runto_main.

proc fortran_runto_main { } {
    return [runto [fortran_main]]
}
