# Copyright 2019-2020 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/>.

# PR gdb/21855 concerns a crash in "finish" where the function's
# return type is a typedef of void.

load_lib dwarf.exp
load_lib gdb-python.exp

# This test can only be run on targets which support DWARF-2 and use gas.
if {![dwarf2_support]} {
    return 0
}

standard_testfile void-type.c typedef-void-finish.S

# Make some DWARF for the test.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    global srcdir subdir srcfile

    set func_result [function_range func ${srcdir}/${subdir}/${srcfile}]
    set func_start [lindex $func_result 0]
    set func_length [lindex $func_result 1]

    set main_result [function_range main ${srcdir}/${subdir}/${srcfile}]
    set main_start [lindex $main_result 0]
    set main_length [lindex $main_result 1]

    cu {} {
	DW_TAG_compile_unit {
	        {DW_AT_producer "GNU C 8.1"}
                {DW_AT_language @DW_LANG_C}
                {DW_AT_name     void-type.c}
                {DW_AT_comp_dir /tmp}
        } {
	    declare_labels main_type void_typedef

	    main_type: DW_TAG_base_type {
		{DW_AT_byte_size 4 DW_FORM_sdata}
		{DW_AT_encoding  @DW_ATE_signed}
	    }

	    void_typedef: DW_TAG_typedef {
		{name foo}
	    }

            DW_TAG_subprogram {
                {name func}
                {low_pc $func_start addr}
                {high_pc "$func_start + $func_length" addr}
                {type :$void_typedef}
	    }
            DW_TAG_subprogram {
                {name main}
                {low_pc $main_start addr}
                {high_pc "$main_start + $main_length" addr}
                {type :$main_type}
	    }
	}
    }
}

if { [prepare_for_testing "failed to prepare" ${testfile} \
	  [list $srcfile $asm_file] {nodebug}] } {
    return -1
}

if {![runto_main]} {
    return -1
}

gdb_test "break func" "Breakpoint .*" \
    "set breakpoint in func"
gdb_continue_to_breakpoint "continue to func"

set skip_python [skip_python_tests]
if {!$skip_python} {
    gdb_test "python finishbp = gdb.FinishBreakpoint()" \
	"Temporary breakpoint.*" "set FinishBreakpoint"
}

gdb_test "finish" [multi_line \
		       "Run till exit from #0  $hex in func \\\(\\\)" \
		       ".*$hex in main \\\(\\\)"]

if {!$skip_python} {
    gdb_test "python print (finishbp.return_value)" "None" \
	"check that return_value is None"
}
