# Copyright 2018-2019 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 . # 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" \ " = " \ "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 '' # 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\]" \ "(= |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} "|6"} \ "o3_strict" {{debug optimize=-O3 \ additional_flags=-gstrict-dwarf} \ "|6"}} { with_test_prefix $test_prefix { vla_optimized_out $test_prefix $options } }