# Copyright 2014-2025 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

# Clang says it will never support variable length arrays in structures.
require {!test_compiler_info clang*}

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

if ![runto_main] {
    return -1
}

gdb_breakpoint [gdb_get_line_number "vlas_filled"]
gdb_continue_to_breakpoint "vlas_filled"

# Check the values of VLA's.
gdb_test "print vla_struct_object" \
    "\\\{something = 5, vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}"
gdb_test "print vla_union_object" \
    "\\\{vla_field = \\\{0, 2, 4, 6, 8\\\}\\\}"
gdb_test "print vla_struct_typedef_struct_member_object" \
    "\\\{something = 10, vla_object = \\\{something = 15, vla_field = \\\{0, 3, 6, 9, 12\\\}\\\}\\\}"
gdb_test "print vla_struct_typedef_union_member_object" \
    "\\\{something = 6, vla_object = \\\{something = 6, vla_field = \\\{-1, 2, 5, 8, 11\\\}\\\}\\\}"

# Check whatis of VLA's.
gdb_test "whatis vla_struct_object" "type = vla_struct_typedef"
gdb_test "whatis vla_union_object" "type = union vla_union"

# Check ptype of VLA's.
gdb_test "ptype vla_struct_object" \
    "type = struct vla_struct {\r\n\\s+int something;\r\n\\s+int vla_field\\\[5\\\];\r\n}"
gdb_test "ptype vla_union_object" \
    "type = union vla_union {\r\n\\s+int vla_field\\\[5\\\];\r\n}"

# Check the size of the VLA's.
gdb_breakpoint [gdb_get_line_number "break_end_of_vla_factory"]
gdb_continue_to_breakpoint "break_end_of_vla_factory"
gdb_test "print vla_struct_object_size == sizeof(vla_struct_object)" \
    " = 1" "size of vla_struct_object"
gdb_test "print vla_union_object_size == sizeof(vla_union_object)" \
    " = 1" "size of vla_union_object"

set a -1
gdb_test_multiple "print inner_vla_struct_object_size" "" {
    -re -wrap " = ($decimal)" {
	set a $expect_out(1,string)
    }
}
set b -1
gdb_test_multiple "print sizeof(inner_vla_struct_object)" "" {
    -re -wrap " = ($decimal)" {
	set b $expect_out(1,string)
    }
}
if { [test_compiler_info "gcc-*"] && [gcc_major_version] <= 11 } {
    # Fails due to incorrect debugging information generated by GCC.
    setup_xfail "*-*-*"
}
gdb_assert {$a == $b} "size of inner_vla_struct_object"
