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

# Check whether we can determine the size of an optimized-out vla.

standard_testfile

# The EXE_SUFFIX is a string appended to the name of the test binary
# to make it unique per variation.
# The OPTIONS is a two item list, the first item is a list of compiler
# flags used for building the test binary, and the second item is a
# pattern which matches some expected output within this proc.
proc vla_optimized_out {exe_suffix options} {
    global testfile srcfile

    lassign $options compile_flags sizeof_result

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

    if ![runto f1] {
	fail "can't run to f1"
	return
    }

    gdb_test "p a" \
	" = <optimized out>" \
	"printed optimized out vla"

    gdb_test "p sizeof (a)" \
	" = $sizeof_result" \
	"printed size of optimized out vla"

    # At lower optimisation levels, the upper bound of the array is
    # still defined, it's just the loctaion that tells GDB the array
    # is optimised out.  In that case, when we access an element that
    # is within the bounds of the array an answer of '<optimized out>'
    # is reasonable.
    #
    # At higher optimisation levels, the array bounds themselves have
    # been removed.  As such GDB can't be expected to know if the
    # array contains _any_ elements at all.  It seems reasonable in
    # that case to reply with 'no such vector element'.
    gdb_test "p a\[0\]" \
	"(= <optimized out>|no such vector element)" \
	"print out of range element of vla (0)"

    gdb_test "p a\[6\]" \
	"no such vector element" \
	"print out of range element of vla (6)"

    gdb_test "p a\[0xffffffff\]" \
	"no such vector element" \
	"print out of range element of vla (0xffffffff)"
}

foreach {test_prefix options} \
    { "o1" {{debug optimize=-O1 additional_flags=-DNOCLONE} "6"} \
      "o3" {{debug optimize=-O3} "<optimized out>|6"} \
      "o3_strict" {{debug optimize=-O3 \
			additional_flags=-gstrict-dwarf} \
		       "<optimized out>|6"}} {
    with_test_prefix $test_prefix {
	vla_optimized_out $test_prefix $options
    }
}

