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

# Setup a main without line number info, and verify that attempting to
# set a breakpoint on a line number doesn't crash gdb.

load_lib dwarf.exp

# This test can only be run on targets which support DWARF-2 and use gas.
require dwarf2_support

# The .c files use __attribute__.
require is_c_compiler_gcc

standard_testfile main.c -dw.S

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

    cu {} {
	compile_unit {
	    {language @DW_LANG_C}
	    {name $srcfile}
	} {
	    subprogram {
		{external 1 flag}
		{MACRO_AT_func {main}}
	    }
	}
    }
}

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

if ![runto_main] {
    return -1
}

set breakpoint_at_missing_lineno_set [gdb_breakpoint "1" no-message]
gdb_assert { !$breakpoint_at_missing_lineno_set  }
