aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannes Domani <ssbssa@yahoo.de>2020-03-31 14:49:06 +0200
committerHannes Domani <ssbssa@yahoo.de>2020-04-01 19:15:03 +0200
commit60e22c1eacb0df32aeeeb78c53cfd46c53a3770f (patch)
treee9870fa9aee3159d44e48cffce61f0d85abf8318
parent77bf7b5317195e092a9f18fef993c412e2e05f53 (diff)
downloadfsf-binutils-gdb-60e22c1eacb0df32aeeeb78c53cfd46c53a3770f.zip
fsf-binutils-gdb-60e22c1eacb0df32aeeeb78c53cfd46c53a3770f.tar.gz
fsf-binutils-gdb-60e22c1eacb0df32aeeeb78c53cfd46c53a3770f.tar.bz2
Allow pointer arithmetic with integer references
Considering these variables: int i = 3; int &iref = i; It's not possible to do any pointer arithmetic with iref: (gdb) p &i+iref Argument to arithmetic operation not a number or boolean. So this adds checks for references to integers in pointer arithmetic. gdb/ChangeLog: 2020-04-01 Hannes Domani <ssbssa@yahoo.de> PR gdb/24789 * eval.c (is_integral_or_integral_reference): New function. (evaluate_subexp_standard): Allow integer references in pointer arithmetic. gdb/testsuite/ChangeLog: 2020-04-01 Hannes Domani <ssbssa@yahoo.de> PR gdb/24789 * gdb.cp/misc.cc: Add integer reference variable. * gdb.cp/misc.exp: Add test.
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/eval.c20
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.cp/misc.cc3
-rw-r--r--gdb/testsuite/gdb.cp/misc.exp8
5 files changed, 41 insertions, 3 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index f8b95c9..65225a2 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2020-04-01 Hannes Domani <ssbssa@yahoo.de>
+
+ PR gdb/24789
+ * eval.c (is_integral_or_integral_reference): New function.
+ (evaluate_subexp_standard): Allow integer references in
+ pointer arithmetic.
+
2020-04-01 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* remote.c (remote_target::remote_parse_stop_reply): Remove the
diff --git a/gdb/eval.c b/gdb/eval.c
index 17af1b5..3b1f494 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1248,6 +1248,20 @@ skip_undetermined_arglist (int nargs, struct expression *exp, int *pos,
evaluate_subexp (NULL_TYPE, exp, pos, noside);
}
+/* Return true if type is integral or reference to integral */
+
+static bool
+is_integral_or_integral_reference (struct type *type)
+{
+ if (is_integral_type (type))
+ return true;
+
+ type = check_typedef (type);
+ return (type != nullptr
+ && TYPE_IS_REFERENCE (type)
+ && is_integral_type (TYPE_TARGET_TYPE (type)));
+}
+
struct value *
evaluate_subexp_standard (struct type *expect_type,
struct expression *exp, int *pos,
@@ -2208,10 +2222,10 @@ evaluate_subexp_standard (struct type *expect_type,
if (binop_user_defined_p (op, arg1, arg2))
return value_x_binop (arg1, arg2, op, OP_NULL, noside);
else if (ptrmath_type_p (exp->language_defn, value_type (arg1))
- && is_integral_type (value_type (arg2)))
+ && is_integral_or_integral_reference (value_type (arg2)))
return value_ptradd (arg1, value_as_long (arg2));
else if (ptrmath_type_p (exp->language_defn, value_type (arg2))
- && is_integral_type (value_type (arg1)))
+ && is_integral_or_integral_reference (value_type (arg1)))
return value_ptradd (arg2, value_as_long (arg1));
else
{
@@ -2234,7 +2248,7 @@ evaluate_subexp_standard (struct type *expect_type,
return value_from_longest (type, value_ptrdiff (arg1, arg2));
}
else if (ptrmath_type_p (exp->language_defn, value_type (arg1))
- && is_integral_type (value_type (arg2)))
+ && is_integral_or_integral_reference (value_type (arg2)))
return value_ptradd (arg1, - value_as_long (arg2));
else
{
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index cc2335e..58271cf 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2020-04-01 Hannes Domani <ssbssa@yahoo.de>
+
+ PR gdb/24789
+ * gdb.cp/misc.cc: Add integer reference variable.
+ * gdb.cp/misc.exp: Add test.
+
2020-04-01 Tankut Baris Aktemur <tankut.baris.aktemur@intel.com>
* gdb.server/stop-reply-no-thread.exp: Enhance the test
diff --git a/gdb/testsuite/gdb.cp/misc.cc b/gdb/testsuite/gdb.cp/misc.cc
index d461d6d..41fb9d2 100644
--- a/gdb/testsuite/gdb.cp/misc.cc
+++ b/gdb/testsuite/gdb.cp/misc.cc
@@ -24,6 +24,9 @@ bool v_bool_array[2];
typedef struct fleep fleep;
struct fleep { int a; } s;
+int number;
+int &number_ref = number;
+
// ====================== simple class structures =======================
struct default_public_struct {
diff --git a/gdb/testsuite/gdb.cp/misc.exp b/gdb/testsuite/gdb.cp/misc.exp
index bceb73e..cd6f0f7 100644
--- a/gdb/testsuite/gdb.cp/misc.exp
+++ b/gdb/testsuite/gdb.cp/misc.exp
@@ -110,3 +110,11 @@ gdb_test "print (int)false" "\\$\[0-9\]* = 0" "(int)false"
gdb_test "print 'misc.cc'::v_bool" " = true" \
"expression using block qualifier"
+
+# pointer arithmetic
+gdb_test "print *(v_bool_array + number_ref)" "\\$\[0-9\]* = false" \
+ "pointer addition with integer reference"
+gdb_test "print *(number_ref + v_bool_array)" "\\$\[0-9\]* = false" \
+ "pointer addition with integer reference"
+gdb_test "print *(v_bool_array - number_ref)" "\\$\[0-9\]* = false" \
+ "pointer subtraction with integer reference"