aboutsummaryrefslogtreecommitdiff
path: root/gdb/testsuite/gdb.base/vla-optimized-out.exp
blob: 82c21eb47e16cf3fb5e9fdebd697914464a53838 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# Copyright 2018-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/>.

# 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
    }
}