From f411722cbc18820e5266ec4c2aadd2269eb15447 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Wed, 5 Jun 2019 10:53:16 -0600 Subject: [PATCH] Allow re-assigning to convenience variables In Ada mode, re-assigning an array of a different size to a convenience variable will cause an error: (gdb) set lang ada (gdb) set $v := "abc" (gdb) set $v := "abcd" cannot assign arrays of different length However, this does not really make sense -- instead, it should always be possible to overwrite a convenience variable. This patch fixes this bug. This was reviewed off-list by Joel. I'm checking it in. gdb/ChangeLog 2019-06-14 Tom Tromey * ada-lang.c (ada_evaluate_subexp) : Always allow assignment to an internalvar. gdb/testsuite/ChangeLog 2019-06-14 Tom Tromey * gdb.ada/set_wstr.exp: Add reassignment test. --- gdb/ChangeLog | 5 +++++ gdb/ada-lang.c | 6 +++++- gdb/testsuite/ChangeLog | 4 ++++ gdb/testsuite/gdb.ada/set_wstr.exp | 5 +++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9fbfcfa9b7..ee3377c56b 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2019-06-14 Tom Tromey + + * ada-lang.c (ada_evaluate_subexp) : Always + allow assignment to an internalvar. + 2019-06-14 Tom Tromey * ada-lex.l: Allow "_" in attribute names. diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c index 1f0ada3590..1b5f18316f 100644 --- a/gdb/ada-lang.c +++ b/gdb/ada-lang.c @@ -10486,7 +10486,11 @@ ada_evaluate_subexp (struct type *expect_type, struct expression *exp, arg2 = evaluate_subexp (type, exp, pos, noside); if (noside == EVAL_SKIP || noside == EVAL_AVOID_SIDE_EFFECTS) return arg1; - if (ada_is_fixed_point_type (value_type (arg1))) + if (VALUE_LVAL (arg1) == lval_internalvar) + { + /* Nothing. */ + } + else if (ada_is_fixed_point_type (value_type (arg1))) arg2 = cast_to_fixed (value_type (arg1), arg2); else if (ada_is_fixed_point_type (value_type (arg2))) error diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 9bfd570f48..8219486242 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2019-06-14 Tom Tromey + + * gdb.ada/set_wstr.exp: Add reassignment test. + 2019-06-14 Tom Tromey * gdb.ada/formatted_ref.exp (test_p_x_addr): Check diff --git a/gdb/testsuite/gdb.ada/set_wstr.exp b/gdb/testsuite/gdb.ada/set_wstr.exp index 0c5c42c17d..ac7098515d 100644 --- a/gdb/testsuite/gdb.ada/set_wstr.exp +++ b/gdb/testsuite/gdb.ada/set_wstr.exp @@ -72,3 +72,8 @@ gdb_test "print rws" \ gdb_test "set variable www := \"1#2#3#4#5#\"" \ "cannot assign arrays of different length" + +# However, reassigning an array of a different length should work when +# the LHS is a convenience variable. +gdb_test_no_output "set variable \$str := \"1234\"" +gdb_test_no_output "set variable \$str := \"12345\"" -- 2.34.1