# 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}} {
    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
}
