From: Tom Tromey Date: Mon, 15 Mar 2021 12:23:12 +0000 (-0600) Subject: Call ada_ensure_varsize_limit in indirection X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=3b5c4de0cf93667ffc98f112db7dcbea92292e32;p=binutils-gdb.git 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 * ada-lang.c (ada_unop_ind_operation::evaluate): Call ada_ensure_varsize_limit. gdb/testsuite/ChangeLog 2021-03-15 Tom Tromey * gdb.ada/varsize_limit.exp: Add new test. * gdb.ada/varsize_limit/vsizelim.adb: Update. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a5580fde4d6..d7f237edc07 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2021-03-15 Tom Tromey + + * ada-lang.c (ada_unop_ind_operation::evaluate): Call + ada_ensure_varsize_limit. + 2021-03-15 Tom Tromey * ada-lang.c (numeric_type_p, integer_type_p): Return true for diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index a74f5408484..1fc303a5c09 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 728405e9606..aa6cacb6ada 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2021-03-15 Tom Tromey + + * gdb.ada/varsize_limit.exp: Add new test. + * gdb.ada/varsize_limit/vsizelim.adb: Update. + 2021-03-15 Tom Tromey * gdb.ada/operator_call/twovecs.ads: New file. diff --git a/gdb/testsuite/gdb.ada/varsize_limit.exp b/gdb/testsuite/gdb.ada/varsize_limit.exp index eebb5d05def..aca926a79ab 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 058994ce88a..3b19e722eb2 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 . 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;