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

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

standard_testfile main.c .S
set executable ${testfile}

# Create the DWARF.
set asm_file [standard_output_file $srcfile2]
Dwarf::assemble $asm_file {
    cu { version 3 addr_size 4 } {
	compile_unit {
	    {producer "GNU C 4.4.3"}
	    {language @DW_LANG_C89}
	    {name 1.c}
	} {
	    declare_labels int_label struct_label pointer_label variable_label

	    int_label: base_type {
		{byte_size 4 sdata}
		{encoding @DW_ATE_signed}
		{name int}
	    }

	    struct_label: structure_type {
		{name s}
		{byte_size 4 sdata}
	    } {
		member {
		    {name f}
		    {type :$int_label}
		    {data_member_location 0 data1}
		}
	    }

	    subprogram {
		{MACRO_AT_func { main }}
		{type :$int_label}
		{external 1 flag}
	    } {
		pointer_label: pointer_type {
		    {byte_size 4 sdata}
		    {type :$struct_label}
		}

		variable_label: DW_TAG_variable {
		    {name v}
		    {location {} DW_FORM_block1}
		    {type :$struct_label}
		}

		DW_TAG_variable {
		    {name p}
		    {location {
			GNU_implicit_pointer $variable_label 0
		    } SPECIAL_expr}
		    {type :$pointer_label}
		}
	    }
	}
    }
}

if [prepare_for_testing "failed to prepare" $executable "${asm_file} ${srcfile}" {}] {
    return -1
}

# DW_OP_GNU_implicit_pointer implementation requires a valid frame.
if ![runto_main] {
    return -1
}

gdb_test "p p->f" " = <optimized out>"
