# Copyright (C) 2009-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/>.

set skip_float_test [gdb_skip_float_test]

proc do_test {type} {
    set typenospace [string map {{ } -} $type]

    with_test_prefix "$typenospace" {
	if {[runto "func"]} {
	    # Verify that we do not crash when using "return" from a
	    # function with no debugging info.  Such function has no
	    # `struct symbol'.  It may still have an associated
	    # `struct minimal_symbol'.

	    gdb_test "return -1" \
		"Return value type not available for selected stack frame\\.\r\nPlease use an explicit cast of the value to return\\." \
		"return from function with no debug info without a cast"

	    # Cast of the result to the proper width must be done explicitely.
	    gdb_test "return ($type) -1" "#0 .* main \\(.*" \
		"return from function with no debug info with a cast" \
		"Make selected stack frame return now\\? \\(y or n\\) " "y"

	    gdb_test "advance marker" "marker \\(.*" \
		"advance to marker"

	    # And if it returned the full width of the result.
	    gdb_test "print /d t" " = -1" "full width of the returned result"
	}
    }
}

foreach type {{signed char} {short} {int} {long} {long long} {float} {double}} {
    if { $skip_float_test && ($type == "float" || $type == "double") } {
	continue
    }
    set typeesc [string map {{ } {\ }} $type]
    set typenospace [string map {{ } -} $type]

    standard_testfile .c return-nodebug1.c

    set additional_flags "additional_flags=-DTYPE=$typeesc"

    if {[prepare_for_testing_full "failed to prepare" \
	     [list ${testfile}-${typenospace} debug \
		  $srcfile [list debug $additional_flags] \
		  $srcfile2 [list $additional_flags]]]} {
	continue
    }

    do_test $type
}
