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

standard_testfile
set using_clang [test_compiler_info clang*]

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

if ![runto_main] {
    return -1
}

set sizeof_int [get_sizeof "int" 4]

# Check that VLA passed to function (pointer) points to the first element.
gdb_breakpoint [gdb_get_line_number "foo_bp"]
gdb_continue_to_breakpoint "foo_bp"
gdb_test "print vla_ptr" "\\\(int \\\*\\\) $hex" "print vla_ptr (foo)"
gdb_test "print *vla_ptr" " = 2" "print *vla_ptr (foo)"

gdb_breakpoint [gdb_get_line_number "bar_bp"]
gdb_continue_to_breakpoint "bar_bp"
gdb_test "print vla_ptr" "\\\(int \\\*\\\) $hex" "print vla_ptr (bar)"
gdb_test "print *vla_ptr" " = 2" "print *vla_ptr (bar)"

gdb_breakpoint [gdb_get_line_number "vla_func_bp"]
gdb_continue_to_breakpoint "vla_func_bp"

gdb_test_multiple "print td_vla" "" {
    -re -wrap " = \\\{4, 5, 6, 7, 8\\\}" {
	pass $gdb_test_name
    }
    -re -wrap " = $hex" {
	if { $using_clang } {
	    # Clang 10.0.1 fails to generate complete type info, filed as
	    # llvm PR48247 - "vla var with typedef'd type has incomplete
	    # debug info".  See note below.
	    xfail $gdb_test_name
	    # Verify that despite the incomplete type info, the variable is
	    # there and has the right value.
	    gdb_test "p *td_vla@5" " = \\\{4, 5, 6, 7, 8\\\}"
	} else {
	    fail $gdb_test_name
	}
    }
}

# Clang 10.0.1 generates this DWARF for td_vla:
#
# A variable DIE:
# <2><19f>: Abbrev Number: 6 (DW_TAG_variable)
#    <1a0>   DW_AT_location    : 0x39 (location list)
#    <1a4>   DW_AT_name        : td_vla
#    <1aa>   DW_AT_type        : <0x1ae>
# with type:
# <2><1ae>: Abbrev Number: 7 (DW_TAG_typedef)
#    <1af>   DW_AT_type        : <0x1fc>
#    <1b3>   DW_AT_name        : typedef_vla
# pointing to:
# <1><1fc>: Abbrev Number: 11 (DW_TAG_array_type)
#    <1fd>   DW_AT_type        : <0x1d3>
# <2><201>: Abbrev Number: 14 (DW_TAG_subrange_type)
#    <202>   DW_AT_type        : <0x1f5>
#
# The subrange type is missing the count attribute.
