# Copyright 2011-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

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

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>"
