binutils-gdb/gdb/testsuite/gdb.ada/arraydim.exp

71 lines
2.5 KiB
Plaintext
Raw Normal View History

# Copyright 2013-2014 Free Software Foundation, Inc.
wrong dimension found in ada-lang.c:ada_array_bound_from_type This function has the following code: elt_type = type; for (i = n; i > 1; i--) elt_type = TYPE_TARGET_TYPE (type); For multi-dimension arrays, the code above tries to find the array type corresponding to the dimension we're trying to inspect. The problem is that, past the second dimension, the loop does nothing other than repeat the first iteration. There is a little thinko where it got the TYPE_TARGET_TYPE of TYPE instead of ELT_TYPE! To my surprise, I was unable to produce an Ada exemple that demonstrated the problem. That's because the examples I created all trigger a parallel ___XA type which we then use in place of the ELT_TYPE in order to determine the bounds - see the code that immediately follows our loop above: index_type_desc = ada_find_parallel_type (type, "___XA"); ada_fixup_array_indexes_type (index_type_desc); if (index_type_desc != NULL) [...] So, in order to avoid depending on an Ada example where the compiler can potentially decide one way or the other, I decided to use an artificial example, written in C. With ... int multi[1][2][3]; ... forcing the language to Ada, and trying to print the 'last, we get: (gdb) p multi'last(1) $1 = 0 (gdb) p multi'last(2) $2 = 1 (gdb) p multi'last(3) $3 = 1 <<<--- This should be 2! Additionally, I noticed that a couple of check_typedef's were missing. This patch adds them. And since the variable in question only gets used within an "else" block, I moved the variable declaration and use inside that block - making it clear what the scope of the variable is. gdb/ChangeLog: * ada-lang.c (ada_array_bound_from_type): Move the declaration and assignment of variable "elt_type" inside the else block where it is used. Add two missing check_typedef calls. Fix bug where we got TYPE's TYPE_TARGET_TYPE, where in fact we really wanted to get ELT_TYPE's TYPE_TARGET_TYPE. gdb/testsuite/ChangeLog: * gdb.ada/arraydim: New testcase.
2013-11-27 14:42:24 +01:00
#
# 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/>.
load_lib "ada.exp"
standard_ada_testfile foo
set cfile "${testdir}/inc"
set csrcfile ${srcdir}/${subdir}/${cfile}.c
set cobject [standard_output_file ${cfile}.o]
gdb_compile "${csrcfile}" "${cobject}" object [list debug]
if {[gdb_compile_ada "${srcfile}" "${binfile}" executable [list debug additional_flags=-largs additional_flags=${cobject} additional_flags=-margs]] != "" } {
return -1
}
clean_restart ${testfile}
set bp_location [gdb_get_line_number "STOP" ${testdir}/foo.adb]
runto "foo.adb:$bp_location"
gdb_test "ptype m" \
"array \\(1 \\.\\. 1, 2 \\.\\. 3, 4 \\.\\. 6\\) of integer"
gdb_test "print m'first" " = 1"
gdb_test "print m'last" " = 1"
gdb_test "print m'length" " = 1"
gdb_test "print m'first(1)" " = 1"
gdb_test "print m'last(1)" " = 1"
gdb_test "print m'length(1)" " = 1"
gdb_test "print m'first(2)" " = 2"
gdb_test "print m'last(2)" " = 3"
gdb_test "print m'length(2)" " = 2"
gdb_test "print m'first(3)" " = 4"
gdb_test "print m'last(3)" " = 6"
gdb_test "print m'length(3)" " = 3"
gdb_test "ptype global_3dim_for_gdb_testing" \
"array \\(0 \\.\\. 0, 0 \\.\\. 1, 0 \\.\\. 2\\) of int"
gdb_test "print global_3dim_for_gdb_testing'first" " = 0"
gdb_test "print global_3dim_for_gdb_testing'last" " = 0"
gdb_test "print global_3dim_for_gdb_testing'length" " = 1"
gdb_test "print global_3dim_for_gdb_testing'first(1)" " = 0"
gdb_test "print global_3dim_for_gdb_testing'last(1)" " = 0"
gdb_test "print global_3dim_for_gdb_testing'length(1)" " = 1"
gdb_test "print global_3dim_for_gdb_testing'first(2)" " = 0"
gdb_test "print global_3dim_for_gdb_testing'last(2)" " = 1"
gdb_test "print global_3dim_for_gdb_testing'length(2)" " = 2"
gdb_test "print global_3dim_for_gdb_testing'first(3)" " = 0"
gdb_test "print global_3dim_for_gdb_testing'last(3)" " = 2"
gdb_test "print global_3dim_for_gdb_testing'length(3)" " = 3"