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

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}} {
    set typeesc [string map {{ } {\ }} $type]
    set typenospace [string map {{ } -} $type]

    set testfile "return-nodebug"
    set srcfile ${testfile}.c
    set srcfile1 ${testfile}1.c
    set binfile ${objdir}/${subdir}/${testfile}-${typenospace}

    set additional_flags "additional_flags=-DTYPE=$typeesc"

    if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}0.o" object [list debug $additional_flags]] != "" } {
	continue
    }

    # This one is compiled without debug info.
    if { [gdb_compile "${srcdir}/${subdir}/${srcfile1}" "${binfile}1.o" object [list $additional_flags]] != "" } {
	continue
    }

    if { [gdb_compile "${binfile}0.o ${binfile}1.o" "${binfile}" executable {debug}] != "" } {
	continue
    }

    gdb_exit
    gdb_start
    gdb_reinitialize_dir $srcdir/$subdir
    gdb_load ${binfile}

    do_test $type
}
