aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2021-03-15 06:23:12 -0600
committerTom Tromey <tromey@adacore.com>2021-03-15 06:23:13 -0600
commit3b5c4de0cf93667ffc98f112db7dcbea92292e32 (patch)
tree887c389e6ceb1d9f844f723e77a5e8a7728f52b9 /gdb
parentc04da66c264162e6efc37686c0e4ee46c5b048ab (diff)
downloadgdb-3b5c4de0cf93667ffc98f112db7dcbea92292e32.zip
gdb-3b5c4de0cf93667ffc98f112db7dcbea92292e32.tar.gz
gdb-3b5c4de0cf93667ffc98f112db7dcbea92292e32.tar.bz2
Call ada_ensure_varsize_limit in indirection
Internal testing revealed yet another Ada regression from the expression rewrite. In this case, indirection did not use the Ada varsize limit. The old code relied on the expression resolution process to evaluate this subexpression with EVAL_AVOID_SIDE_EFFECTS in order to get this error. However, this isn't always done in the new approach; so this patch introduces another call to ada_ensure_varsize_limit in the appropriate spot. As with the earlier patches, this path was not tested in-tree, so this patch also updates a test. gdb/ChangeLog 2021-03-15 Tom Tromey <tromey@adacore.com> * ada-lang.c (ada_unop_ind_operation::evaluate): Call ada_ensure_varsize_limit. gdb/testsuite/ChangeLog 2021-03-15 Tom Tromey <tromey@adacore.com> * gdb.ada/varsize_limit.exp: Add new test. * gdb.ada/varsize_limit/vsizelim.adb: Update.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog5
-rw-r--r--gdb/ada-lang.c5
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.ada/varsize_limit.exp2
-rw-r--r--gdb/testsuite/gdb.ada/varsize_limit/vsizelim.adb14
5 files changed, 30 insertions, 1 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index a5580fd..d7f237e 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,10 @@
2021-03-15 Tom Tromey <tromey@adacore.com>
+ * ada-lang.c (ada_unop_ind_operation::evaluate): Call
+ ada_ensure_varsize_limit.
+
+2021-03-15 Tom Tromey <tromey@adacore.com>
+
* ada-lang.c (numeric_type_p, integer_type_p): Return true for
fixed-point.
* ada-exp.y (maybe_overload): New function.
diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index a74f540..1fc303a 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -10480,6 +10480,11 @@ ada_unop_ind_operation::evaluate (struct type *expect_type,
(CORE_ADDR) value_as_address (arg1));
}
+ struct type *target_type = (to_static_fixed_type
+ (ada_aligned_type
+ (ada_check_typedef (TYPE_TARGET_TYPE (type)))));
+ ada_ensure_varsize_limit (target_type);
+
if (ada_is_array_descriptor_type (type))
/* GDB allows dereferencing GNAT array descriptors. */
return ada_coerce_to_simple_array (arg1);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 728405e..aa6cacb 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2021-03-15 Tom Tromey <tromey@adacore.com>
+ * gdb.ada/varsize_limit.exp: Add new test.
+ * gdb.ada/varsize_limit/vsizelim.adb: Update.
+
+2021-03-15 Tom Tromey <tromey@adacore.com>
+
* gdb.ada/operator_call/twovecs.ads: New file.
* gdb.ada/operator_call/twovecs.adb: New file.
* gdb.ada/operator_call/opcall.adb: New file.
diff --git a/gdb/testsuite/gdb.ada/varsize_limit.exp b/gdb/testsuite/gdb.ada/varsize_limit.exp
index eebb5d0..aca926a 100644
--- a/gdb/testsuite/gdb.ada/varsize_limit.exp
+++ b/gdb/testsuite/gdb.ada/varsize_limit.exp
@@ -37,4 +37,4 @@ gdb_test "print small" " = \"1234567890\""
gdb_test "print larger" "object size is larger than varsize-limit.*"
-
+gdb_test "print name.all" "object size is larger than varsize-limit.*"
diff --git a/gdb/testsuite/gdb.ada/varsize_limit/vsizelim.adb b/gdb/testsuite/gdb.ada/varsize_limit/vsizelim.adb
index 058994c..3b19e72 100644
--- a/gdb/testsuite/gdb.ada/varsize_limit/vsizelim.adb
+++ b/gdb/testsuite/gdb.ada/varsize_limit/vsizelim.adb
@@ -14,10 +14,24 @@
-- along with this program. If not, see <http://www.gnu.org/licenses/>.
with Pck; use Pck;
+with System;
+with Unchecked_Conversion;
+
procedure VsizeLim is
Small : String := Ident ("1234567890");
Larger : String := Ident ("1234567890|1234567890|1234567890");
+
+ type String_Ptr is access all String;
+ type Big_String_Ptr is access all String (Positive);
+
+ function To_Ptr is
+ new Unchecked_Conversion (System.Address, Big_String_Ptr);
+
+ Name_Str : String_Ptr := new String'(Larger);
+ Name : Big_String_Ptr := To_Ptr (Name_Str.all'Address);
+
begin
Do_Nothing (Small'Address); -- STOP
Do_Nothing (Larger'Address);
+ Do_Nothing (Name'Address);
end VsizeLim;