# 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/>.
load_lib dwarf.exp

# The function foo is encapsulated by two functions from CU
# $srcfile (main and bar), but the debug info does not describe foo, so
# foo should not be seen as part of CU $srcfile.
# Run to foo, and check that the current language is the default auto/C.
# If foo is considered part of CU $srcfile, the language will be auto/C++
# instead.

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

# The .c files use __attribute__.
if [get_compiler_info] {
    return -1
}
if !$gcc_compiled {
    verbose "Skipping $gdb_test_file_name."
    return 0
}

standard_testfile .c -dw.S

set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    global srcdir subdir srcfile srcfile2
    declare_labels ranges_label

    # Find start address and length for our functions.
    set foo_func \
	[function_range foo [list ${srcdir}/${subdir}/$srcfile]]
    set quux_func \
	[function_range quux [list ${srcdir}/${subdir}/$srcfile]]
    set bar_func \
	[function_range bar [list ${srcdir}/${subdir}/$srcfile]]

    cu {} {
	compile_unit {
	    {language @DW_LANG_C_plus_plus}
	    {name $srcfile}
	    {ranges ${ranges_label} DW_FORM_sec_offset}
	} {
	    subprogram {
		{external 1 flag}
		{name quux}
	    }
	}
    }

    ranges {is_64 [is_64_target]} {
	ranges_label: sequence {
	    base [lindex $quux_func 0]
	    range 0 [lindex $quux_func 1]
	    base [lindex $bar_func 0]
	    range 0 [lindex $bar_func 1]
	}
    }
}

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

if ![runto foo] {
    return -1
}

gdb_test "show language" \
    "The current source language is \"auto; currently c\"\."
