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

# Test to reproduce the crash described in PR 26693.  The following DWARF was
# crashing GDB while loading partial symbols: a DW_TAG_subprogram with a
# DW_AT_specification (pointing to another subprogram), without a DW_AT_name
# and with a template parameter (DW_TAG_template_type_parameter).  More
# precisely, the crash was happening when trying to compute the full name of the
# subprogram.

load_lib dwarf.exp

if {![dwarf2_support]} {
    return 0
}

standard_testfile main.c .S

lassign [function_range main ${srcdir}/${subdir}/${srcfile}] \
    main_start main_length

set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    global main_start main_length

    cu { label cu_start } {
	DW_TAG_compile_unit {
	    {DW_AT_language @DW_LANG_C_plus_plus}
        } {
	    declare_labels templated_subprogram int

	    int: DW_TAG_base_type {
		{DW_AT_name "int"}
		{DW_AT_byte_size 4 DW_FORM_data1}
		{DW_AT_encoding @DW_ATE_signed}
	    }

	    # The templated subprogram.
	    templated_subprogram: DW_TAG_subprogram {
		{DW_AT_name "apply"}
	    }

	    # The template specialization.
	    #
	    # The low and high PC are phony: we just need an address range that
	    # is valid in the program, so we use the main function's range.
	    DW_TAG_subprogram {
		{DW_AT_specification :$templated_subprogram}
		{MACRO_AT_range main}
	    } {
		DW_TAG_template_type_param {
		  {DW_AT_name "T"}
		  {DW_AT_type :$int DW_FORM_ref4}
		}
	    }
	}
    }

    aranges {} cu_start {
	arange {} "$main_start" "$main_length"
    }
}

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

if ![runto_main] {
    return -1
}

# Just a sanity check to make sure GDB slurped the symbols correctly.
gdb_test "print apply<int>" " = {void \\(void\\)} $hex <apply<int>\\(\\)>"
