Use scoped_restore in varobj.c
authorTom Tromey <tromey@adacore.com>
Mon, 24 Apr 2023 18:25:53 +0000 (12:25 -0600)
committerTom Tromey <tromey@adacore.com>
Tue, 25 Apr 2023 18:01:45 +0000 (12:01 -0600)
One spot in varobj.c should use scoped_restore to save and restore
input_radix.  Note that the current code may fail to restore it on
error, so this patch fixes a latent bug.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
gdb/varobj.c

index 2c35b911badce00c821a1605ebe25714b8edae29..5a5e55c2d82684e48f671a6ee084c279683d3caa 100644 (file)
@@ -970,12 +970,12 @@ varobj_set_value (struct varobj *var, const char *expression)
      We need to first construct a legal expression for this -- ugh!  */
   /* Does this cover all the bases?  */
   struct value *value = NULL; /* Initialize to keep gcc happy.  */
-  int saved_input_radix = input_radix;
   const char *s = expression;
 
   gdb_assert (varobj_editable_p (var));
 
-  input_radix = 10;            /* ALWAYS reset to decimal temporarily.  */
+  /* ALWAYS reset to decimal temporarily.  */
+  auto save_input_radix = make_scoped_restore (&input_radix, 10);
   expression_up exp = parse_exp_1 (&s, 0, 0, 0);
   try
     {
@@ -1022,7 +1022,6 @@ varobj_set_value (struct varobj *var, const char *expression)
      'updated' flag.  There's no need to optimize that, because return value
      of -var-update should be considered an approximation.  */
   var->updated = install_new_value (var, val, false /* Compare values.  */);
-  input_radix = saved_input_radix;
   return true;
 }