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

# Copyright 2010-2025 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 {gfortran-4-[012]-*} f90]} {
	return "int4"
    } elseif {[test_compiler_info {gfortran-*} f90]} {
	return "integer\\(kind=4\\)"
    } elseif {[test_compiler_info {flang-*} f90]
	      || [test_compiler_info {nvfortran-*} f90]} {
	return "integer"
    } elseif {[test_compiler_info {ifort-*} f90]} {
	return "INTEGER\\(4\\)"
    } elseif {[test_compiler_info {ifx-*} f90]} {
	return "INTEGER\\*4"
    } else {
	return "unknown"
    }
}

proc fortran_int8 {} {
    if {[test_compiler_info {gfortran-4-[012]-*} f90]} {
	return "int8"
    } elseif {[test_compiler_info {gfortran-*} f90]} {
	return "integer\\(kind=8\\)"
    } elseif {[test_compiler_info {flang-*} f90]
	      || [test_compiler_info {nvfortran-*} f90]} {
	return "integer\\*8"
    } elseif {[test_compiler_info {ifort-*} f90]} {
	return "INTEGER\\(8\\)"
    } elseif {[test_compiler_info {ifx-*} f90]} {
	return "INTEGER\\*8"
    } else {
	return "unknown"
    }
}

proc fortran_real4 {} {
    if {[test_compiler_info {gfortran-4-[012]-*} f90]} {
	return "real4"
    } elseif {[test_compiler_info {gfortran-*} f90]} {
	return "real\\(kind=4\\)"
    } elseif {[test_compiler_info {flang-*} f90]
	      || [test_compiler_info {nvfortran-*} f90]} {
	return "real"
    } elseif {[test_compiler_info {ifort-*} f90]} {
	return "REAL\\(4\\)"
    } elseif {[test_compiler_info {ifx-*} f90]} {
	return "REAL\\*4"
    } else {
	return "unknown"
    }
}

proc fortran_real8 {} {
    if {[test_compiler_info {gfortran-4-[012]-*} f90]} {
	return "real8"
    } elseif {[test_compiler_info {gfortran-*} f90]} {
	return "real\\(kind=8\\)"
    } elseif {[test_compiler_info {flang-*} f90]
	      || [test_compiler_info {nvfortran-*} f90]} {
	return "double precision"
    } elseif {[test_compiler_info {ifort-*} f90]} {
	return "REAL\\(8\\)"
    } elseif {[test_compiler_info {ifx-*} f90]} {
	return "REAL\\*8"
    } else {
	return "unknown"
    }
}

proc fortran_complex4 {} {
    if {[test_compiler_info {gfortran-4-[012]-*} f90]} {
	return "complex4"
    } elseif {[test_compiler_info {gfortran-*} f90]} {
	return "complex\\(kind=4\\)"
    } elseif {[test_compiler_info {flang-*} f90]
	      || [test_compiler_info {nvfortran-*} f90]} {
	return "complex"
    } elseif {[test_compiler_info {ifort-*} f90]} {
	return "COMPLEX\\(4\\)"
    } elseif {[test_compiler_info {ifx-*} f90]} {
	return "COMPLEX\\*8"
    } else {
	return "unknown"
    }
}

proc fortran_complex8 {} {
    if {[test_compiler_info {gfortran-4-[012]-*} f90]} {
	return "complex8"
    } elseif {[test_compiler_info {gfortran-*} f90]} {
	return "complex\\(kind=8\\)"
    } elseif {[test_compiler_info {flang-*} f90]
	      || [test_compiler_info {nvfortran-*} f90]} {
	return "double complex"
    } elseif {[test_compiler_info {ifort-*} f90]} {
	return "COMPLEX\\(8\\)"
    } elseif {[test_compiler_info {ifx-*} f90]} {
	return "COMPLEX\\*16"
    } else {
	return "unknown"
    }
}

proc fortran_complex16 {} {
    if {[test_compiler_info {gfortran-4-[012]-*} f90]} {
	return "complex16"
    } elseif {[test_compiler_info {gfortran-*} f90]} {
	return "complex\\(kind=16\\)"
    } elseif {[test_compiler_info {flang-*} f90]} {
	return "quad complex"
    } elseif {[test_compiler_info {ifort-*} f90]} {
	return "COMPLEX\\(16\\)"
    } elseif {[test_compiler_info {ifx-*} f90]} {
	return "COMPLEX\\*32"
    } else {
	return "unknown"
    }
}

proc fortran_logical4 {} {
    if {[test_compiler_info {gfortran-4-[012]-*} f90]} {
	return "logical4"
    } elseif {[test_compiler_info {gfortran-*} f90]} {
	return "logical\\(kind=4\\)"
    } elseif {[test_compiler_info {flang-*} f90]
	      || [test_compiler_info {nvfortran-*} f90]} {
	return "logical"
    } elseif {[test_compiler_info {ifort-*} f90]} {
	return "LOGICAL\\(4\\)"
    } elseif {[test_compiler_info {ifx-*} f90]} {
	return "LOGICAL\\*4"
    } else {
	return "unknown"
    }
}

proc fortran_character1 {} {
    if {[test_compiler_info {gfortran-4-[012]-*} f90]} {
	return "character1"
    } elseif {[test_compiler_info {gfortran-*} f90]} {
	return "character\\(kind=1\\)"
    } elseif {[test_compiler_info {flang-*} f90]} {
	return "character"
    } elseif {[test_compiler_info {nvfortran-*} f90]} {
	return "character\\*1"
    } elseif {[test_compiler_info {ifort-*} f90]} {
	return "CHARACTER\\(1\\)"
    } elseif {[test_compiler_info {ifx-*} f90]} {
	return "CHARACTER\\*1"
    } else {
	return "unknown"
    }
}

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

proc fortran_main {} {
    if {[test_compiler_info {gfortran-*} f90]
	|| [test_compiler_info {ifort-*} f90]
	|| [test_compiler_info {ifx-*} f90]
	|| [test_compiler_info {flang-llvm-*} f90]} {
	return "MAIN__"
    } elseif {[test_compiler_info {flang-classic-*} f90]
	      || [test_compiler_info {nvfortran-*} f90]} {
	return "MAIN_"
    } else {
	return "unknown"
    }
}

# Fortran version of runto_main.

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