This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

RFC: fix PR 15364


My earlier fix for PR 9197 introduced a regression.
You can see it clearly here:

(gdb) p s2
$1 = (struct s *) 0x0
(gdb) p s2 && s2->x == 0
Cannot access memory at address 0x0

The exception in this case is thrown by binop_promote, but I think that
a lot of code expects EVAL_AVOID_SIDE_EFFECTS to return a not_lval
value, so I fixed the problem by changing the various spots I touched
for 9197 to do this.

Built and regtested on x86-64 Fedora 18.
New test case included.

Tom

2013-04-12  Tom Tromey  <tromey@redhat.com>

	PR exp/15364:
	* eval.c (evaluate_subexp_standard) <STRUCTOP_STRUCT,
	STRUCTOP_PTR>: Return a not_lval value for
	EVAL_AVOID_SIDE_EFFECTS.
	* opencl-lang.c (evaluate_subexp_opencl): Return a not_lval value
	for EVAL_AVOID_SIDE_EFFECTS.

2013-04-12  Tom Tromey  <tromey@redhat.com>

	* gdb.base/exprs.exp (test_expr): Add regression test.
	* gdb.base/exprs.c (null_t_struct): New global.

diff --git a/gdb/eval.c b/gdb/eval.c
index a91ba22..eee457e 100644
--- a/gdb/eval.c
+++ b/gdb/eval.c
@@ -1847,9 +1847,11 @@ evaluate_subexp_standard (struct type *expect_type,
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
 	goto nosideret;
-      /* Also handle EVAL_AVOID_SIDE_EFFECTS.  */
-      return value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string,
+      arg3 = value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string,
 			       NULL, "structure");
+      if (noside == EVAL_AVOID_SIDE_EFFECTS)
+	arg3 = value_zero (value_type (arg3), not_lval);
+      return arg3;
 
     case STRUCTOP_PTR:
       tem = longest_to_int (exp->elts[pc + 1].longconst);
@@ -1899,9 +1901,11 @@ evaluate_subexp_standard (struct type *expect_type,
           }
       }
 
-      /* Also handle EVAL_AVOID_SIDE_EFFECTS.  */
-      return value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string,
+      arg3 = value_struct_elt (&arg1, NULL, &exp->elts[pc + 2].string,
 			       NULL, "structure pointer");
+      if (noside == EVAL_AVOID_SIDE_EFFECTS)
+	arg3 = value_zero (value_type (arg3), not_lval);
+      return arg3;
 
     case STRUCTOP_MEMBER:
     case STRUCTOP_MPTR:
diff --git a/gdb/opencl-lang.c b/gdb/opencl-lang.c
index d7e66c4..4720e2b 100644
--- a/gdb/opencl-lang.c
+++ b/gdb/opencl-lang.c
@@ -1035,10 +1035,13 @@ Cannot perform conditional operation on vectors with different sizes"));
 	  }
 	else
 	  {
-	    /* Also handle EVAL_AVOID_SIDE_EFFECTS.  */
-	    return value_struct_elt (&arg1, NULL,
-				     &exp->elts[pc + 2].string, NULL,
-				     "structure");
+	    struct value *v = value_struct_elt (&arg1, NULL,
+						&exp->elts[pc + 2].string, NULL,
+						"structure");
+
+	    if (noside == EVAL_AVOID_SIDE_EFFECTS)
+	      v = value_zero (value_type (v), not_lval);
+	    return v;
 	  }
       }
     default:
diff --git a/gdb/testsuite/gdb.base/exprs.c b/gdb/testsuite/gdb.base/exprs.c
index 90c0f25..e1ad182 100644
--- a/gdb/testsuite/gdb.base/exprs.c
+++ b/gdb/testsuite/gdb.base/exprs.c
@@ -185,6 +185,7 @@ union tu_link {
 enum colors {red, green, blue} color;
 enum cars {chevy, ford, porsche} clunker;
 
+struct t_struct *null_t_struct;
 
 void dummy()
 {
diff --git a/gdb/testsuite/gdb.base/exprs.exp b/gdb/testsuite/gdb.base/exprs.exp
index fa3cdb4..d2e23c9 100644
--- a/gdb/testsuite/gdb.base/exprs.exp
+++ b/gdb/testsuite/gdb.base/exprs.exp
@@ -273,3 +273,7 @@ gdb_test "print {short} v_short_array" "$decimal = 42"
 # Regression tests for cast to void.
 gdb_test "print (void) v_int_pointer" " = void"
 gdb_test "print & (void) v_char" "value not located in memory."
+
+# Regression test for "&&".
+gdb_test "print null_t_struct && null_t_struct->v_int_member == 0" \
+    " = 0"


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]