diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6e4bd7595d..2af71e3707 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2013-12-13 Joel Brobecker + + * 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. + 2013-12-13 Joel Brobecker * ada-lang.c (ada_array_bound_from_type): Remove unwanted space diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 19ddf5d31b..a0d67152b1 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -2790,7 +2790,7 @@ ada_index_type (struct type *type, int n, const char *name) static LONGEST ada_array_bound_from_type (struct type *arr_type, int n, int which) { - struct type *type, *elt_type, *index_type_desc, *index_type; + struct type *type, *index_type_desc, *index_type; int i; gdb_assert (which == 0 || which == 1); @@ -2806,17 +2806,20 @@ ada_array_bound_from_type (struct type *arr_type, int n, int which) else type = arr_type; - elt_type = type; - for (i = n; i > 1; i--) - elt_type = TYPE_TARGET_TYPE (type); - index_type_desc = ada_find_parallel_type (type, "___XA"); ada_fixup_array_indexes_type (index_type_desc); if (index_type_desc != NULL) index_type = to_fixed_range_type (TYPE_FIELD_TYPE (index_type_desc, n - 1), NULL); else - index_type = TYPE_INDEX_TYPE (elt_type); + { + struct type *elt_type = check_typedef (type); + + for (i = 1; i < n; i++) + elt_type = check_typedef (TYPE_TARGET_TYPE (elt_type)); + + index_type = TYPE_INDEX_TYPE (elt_type); + } return (LONGEST) (which == 0 diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 61f31d9b2a..dbdc00001a 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-12-13 Joel Brobecker + + * gdb.ada/arraydim: New testcase. + 2013-12-12 Siva Chandra Reddy PR python/16113 diff --git a/gdb/testsuite/gdb.ada/arraydim.exp b/gdb/testsuite/gdb.ada/arraydim.exp new file mode 100644 index 0000000000..8cd5722d0c --- /dev/null +++ b/gdb/testsuite/gdb.ada/arraydim.exp @@ -0,0 +1,70 @@ +# Copyright 2013 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 . + +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" diff --git a/gdb/testsuite/gdb.ada/arraydim/foo.adb b/gdb/testsuite/gdb.ada/arraydim/foo.adb new file mode 100644 index 0000000000..c9e74fa240 --- /dev/null +++ b/gdb/testsuite/gdb.ada/arraydim/foo.adb @@ -0,0 +1,30 @@ +-- Copyright 2013 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 . + +with Pck; use Pck; +procedure Foo is + type Multi is array (1 .. 1, 2 .. 3, 4 .. 6) of Integer; + M : Multi := (others => (others => (others => 0))); + + -- Use a fake type for importing our C multi-dimensional array. + -- It's only to make sure the C unit gets linked in, regardless + -- of possible optimizations. + type Void_Star is access integer; + E : Void_Star; + pragma Import (C, E, "global_3dim_for_gdb_testing"); +begin + Do_Nothing (M'Address); -- STOP + Do_Nothing (E'Address); +end Foo; diff --git a/gdb/testsuite/gdb.ada/arraydim/inc.c b/gdb/testsuite/gdb.ada/arraydim/inc.c new file mode 100644 index 0000000000..e1ec547b45 --- /dev/null +++ b/gdb/testsuite/gdb.ada/arraydim/inc.c @@ -0,0 +1,18 @@ +/* Copyright 2013 Free Software Foundation, Inc. + + This file is part of GDB. + + 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 . */ + +int global_3dim_for_gdb_testing[1][2][3]; diff --git a/gdb/testsuite/gdb.ada/arraydim/pck.adb b/gdb/testsuite/gdb.ada/arraydim/pck.adb new file mode 100644 index 0000000000..776ccbddb6 --- /dev/null +++ b/gdb/testsuite/gdb.ada/arraydim/pck.adb @@ -0,0 +1,22 @@ +-- Copyright 2013 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 . + +package body Pck is + procedure Do_Nothing (A : System.Address) is + begin + null; + end Do_Nothing; +end Pck; + diff --git a/gdb/testsuite/gdb.ada/arraydim/pck.ads b/gdb/testsuite/gdb.ada/arraydim/pck.ads new file mode 100644 index 0000000000..aafa0a288e --- /dev/null +++ b/gdb/testsuite/gdb.ada/arraydim/pck.ads @@ -0,0 +1,20 @@ +-- Copyright 2013 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 . + +with System; +package Pck is + procedure Do_Nothing (A : System.Address); +end Pck; +