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

# 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 .S

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

    cu {} {
	DW_TAG_compile_unit {
	        {DW_AT_producer "GNU C 8.1"}
                {DW_AT_language @DW_LANG_C}
                {DW_AT_name     $srcfile}
                {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 {
                {MACRO_AT_func {func}}
                {type :$void_typedef}
	    }
            DW_TAG_subprogram {
                {MACRO_AT_func {main}}
                {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"
}
