From: Hannes Domani Date: Fri, 9 Feb 2024 19:25:29 +0000 (+0100) Subject: Allow value repeat operator on references X-Git-Tag: gdb-15-branchpoint~1002 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6b991efe7b8c687ab0af64ca6124dbd4a69a6724;p=thirdparty%2Fbinutils-gdb.git Allow value repeat operator on references Currently it's not possible to use the value repeat operator on references: ``` print ((int &) v_int_array_init[0])@2 Only values in memory can be extended with '@'. ``` This seems like an unnecessary restriction, since it also prevents its use on iterators (which was the original reported problem): ``` (gdb) p *it@2 Only values in memory can be extended with '@'. ``` So this converts any references to the referenced value in value_repeat, making this possible: ``` print ((int &) v_int_array_init[0])@2 $1 = {10, 20} (gdb) p *it@2 $2 = {1, 2} ``` Approved-by: Kevin Buettner --- diff --git a/gdb/testsuite/gdb.base/exprs.exp b/gdb/testsuite/gdb.base/exprs.exp index 239cdce8dc2..0f8c53bc716 100644 --- a/gdb/testsuite/gdb.base/exprs.exp +++ b/gdb/testsuite/gdb.base/exprs.exp @@ -259,6 +259,7 @@ gdb_test {print *v_int_array_init@2} { = \{10, 20\}} gdb_test {print v_int_array_init[0]@1} { = \{10\}} gdb_test {print v_int_array_init[0]@2} { = \{10, 20\}} gdb_test {print v_int_array_init[1]@1} { = \{20\}} +gdb_test {print ((int &) v_int_array_init[0])@2} { = \{10, 20\}} # gdb's {} extension gdb_test_no_output "set variable v_short_array\[0\] = 42" diff --git a/gdb/valops.c b/gdb/valops.c index e2694f0c32b..399d0f109e1 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -1349,6 +1349,8 @@ value_repeat (struct value *arg1, int count) { struct value *val; + arg1 = coerce_ref (arg1); + if (arg1->lval () != lval_memory) error (_("Only values in memory can be extended with '@'.")); if (count < 1)