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

    global pf_prefix
    set old_prefix $pf_prefix
    lappend pf_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"
    }

    set pf_prefix $old_prefix
}

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
}
