diff options
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/ada-lang.c | 34 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/length_cond.exp | 44 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/length_cond/length_cond.adb | 37 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/length_cond/pck.adb | 21 | ||||
-rw-r--r-- | gdb/testsuite/gdb.ada/length_cond/pck.ads | 18 |
7 files changed, 159 insertions, 7 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 5565097..c40b7d4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2019-06-19 Tom Tromey <tromey@adacore.com> + * ada-lang.c (ada_evaluate_subexp) <case OP_ATR_FIRST>: Handle + EVAL_AVOID_SIDE_EFFECTS specially. + +2019-06-19 Tom Tromey <tromey@adacore.com> + * source-cache.c (highlighter): New global. (source_cache::get_source_lines): Create a highlighter on demand. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index bf17c67..1e99655 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -11055,8 +11055,34 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, if (noside == EVAL_SKIP) goto nosideret; + else if (noside == EVAL_AVOID_SIDE_EFFECTS) + { + if (type_arg == NULL) + type_arg = value_type (arg1); + + if (ada_is_constrained_packed_array_type (type_arg)) + type_arg = decode_constrained_packed_array_type (type_arg); - if (type_arg == NULL) + if (!discrete_type_p (type_arg)) + { + switch (op) + { + default: /* Should never happen. */ + error (_("unexpected attribute encountered")); + case OP_ATR_FIRST: + case OP_ATR_LAST: + type_arg = ada_index_type (type_arg, tem, + ada_attribute_name (op)); + break; + case OP_ATR_LENGTH: + type_arg = builtin_type (exp->gdbarch)->builtin_int; + break; + } + } + + return value_zero (type_arg, not_lval); + } + else if (type_arg == NULL) { arg1 = ada_coerce_ref (arg1); @@ -11073,9 +11099,6 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, type = builtin_type (exp->gdbarch)->builtin_int; } - if (noside == EVAL_AVOID_SIDE_EFFECTS) - return allocate_value (type); - switch (op) { default: /* Should never happen. */ @@ -11133,9 +11156,6 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, type = builtin_type (exp->gdbarch)->builtin_int; } - if (noside == EVAL_AVOID_SIDE_EFFECTS) - return allocate_value (type); - switch (op) { default: diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 71ac0ce..8454b00 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2019-06-19 Tom Tromey <tromey@adacore.com> + + * gdb.ada/length_cond.exp: New file. + * gdb.ada/length_cond/length_cond.adb: New file. + * gdb.ada/length_cond/pck.adb: New file. + * gdb.ada/length_cond/pck.ads: New file. + 2019-06-18 Tom de Vries <tdevries@suse.de> * boards/fission.exp (debug_flags): Add "-fuse-ld=gold". diff --git a/gdb/testsuite/gdb.ada/length_cond.exp b/gdb/testsuite/gdb.ada/length_cond.exp new file mode 100644 index 0000000..53e9187 --- /dev/null +++ b/gdb/testsuite/gdb.ada/length_cond.exp @@ -0,0 +1,44 @@ +# Copyright 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 <http://www.gnu.org/licenses/>. + +load_lib "ada.exp" + +standard_ada_testfile length_cond + +if {[gdb_compile_ada "${srcfile}" "${binfile}" executable debug] != "" } { + return -1 +} + +clean_restart ${testfile} + +set bp_location [gdb_get_line_number "BREAKPOINT" ${testdir}/length_cond.adb] +gdb_breakpoint length_cond.adb:$bp_location message + +# Resolving the conditional expression would cause a crash, so it's +# enough to just set the conditions. + +foreach var {loc enum_val int_val} { + foreach attr {first last} { + gdb_test_no_output "cond 1 $var'$attr > 15" + } +} + +gdb_test_no_output "cond 1 loc'length > 15" + +foreach attr {first last length} { + foreach val {1 2} { + gdb_test_no_output "cond 1 my_array'${attr}($val) > 15" + } +} diff --git a/gdb/testsuite/gdb.ada/length_cond/length_cond.adb b/gdb/testsuite/gdb.ada/length_cond/length_cond.adb new file mode 100644 index 0000000..7b563c3 --- /dev/null +++ b/gdb/testsuite/gdb.ada/length_cond/length_cond.adb @@ -0,0 +1,37 @@ +-- Copyright 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 <http://www.gnu.org/licenses/>. + +with Pck; + +procedure Length_Cond is + type Enum is (One, Two, Three); + Enum_Val : Enum := Three; + + type My_Int is range -23 .. 23; + Int_Val : My_Int := 0; + + type My_Array is array (0..1, 0..1) of Boolean; + Array_Val : My_Array := ((True, False), (False, True)); + + procedure p (s : String) is + loc : String := s & "."; + begin + Pck.Do_Nothing (loc); -- BREAKPOINT + end p; +begin + for I in 1 .. 25 loop + p ((1 .. I => 'X')); + end loop; +end Length_Cond; diff --git a/gdb/testsuite/gdb.ada/length_cond/pck.adb b/gdb/testsuite/gdb.ada/length_cond/pck.adb new file mode 100644 index 0000000..79bbe59 --- /dev/null +++ b/gdb/testsuite/gdb.ada/length_cond/pck.adb @@ -0,0 +1,21 @@ +-- Copyright 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 <http://www.gnu.org/licenses/>. + +package body Pck is + procedure Do_Nothing (A : String) is + begin + null; + end Do_Nothing; +end Pck; diff --git a/gdb/testsuite/gdb.ada/length_cond/pck.ads b/gdb/testsuite/gdb.ada/length_cond/pck.ads new file mode 100644 index 0000000..433b389 --- /dev/null +++ b/gdb/testsuite/gdb.ada/length_cond/pck.ads @@ -0,0 +1,18 @@ +-- Copyright 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 <http://www.gnu.org/licenses/>. + +package Pck is + procedure Do_Nothing (A : String); +end Pck; |