Stop assuming no-debug-info functions return int
[deliverable/binutils-gdb.git] / gdb / eval.c
index 14bf6f7bae020f023f9c899b1052e25e6baeea1f..1ec67513af262d77383bc73bd9fe2c95c31b79d1 100644 (file)
@@ -1,6 +1,6 @@
 /* Evaluate expressions for GDB.
 
-   Copyright (C) 1986-2014 Free Software Foundation, Inc.
+   Copyright (C) 1986-2017 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
-#include <string.h>
 #include "symtab.h"
 #include "gdbtypes.h"
 #include "value.h"
 #include "expression.h"
 #include "target.h"
 #include "frame.h"
+#include "gdbthread.h"
 #include "language.h"          /* For CAST_IS_CONVERSION.  */
 #include "f-lang.h"            /* For array bound stuff.  */
 #include "cp-abi.h"
 #include "parser-defs.h"
 #include "cp-support.h"
 #include "ui-out.h"
-#include "exceptions.h"
 #include "regcache.h"
 #include "user-regs.h"
 #include "valprint.h"
 #include "gdb_obstack.h"
 #include "objfiles.h"
-
-#include "gdb_assert.h"
-
 #include <ctype.h>
 
 /* This is defined in valops.c */
@@ -68,8 +64,29 @@ struct value *
 evaluate_subexp (struct type *expect_type, struct expression *exp,
                 int *pos, enum noside noside)
 {
-  return (*exp->language_defn->la_exp_desc->evaluate_exp) 
+  struct cleanup *cleanups;
+  struct value *retval;
+  int cleanup_temps = 0;
+
+  if (*pos == 0 && target_has_execution
+      && exp->language_defn->la_language == language_cplus
+      && !thread_stack_temporaries_enabled_p (inferior_ptid))
+    {
+      cleanups = enable_thread_stack_temporaries (inferior_ptid);
+      cleanup_temps = 1;
+    }
+
+  retval = (*exp->language_defn->la_exp_desc->evaluate_exp)
     (expect_type, exp, pos, noside);
+
+  if (cleanup_temps)
+    {
+      if (value_in_thread_stack_temporaries (retval, inferior_ptid))
+       retval = value_non_lval (retval);
+      do_cleanups (cleanups);
+    }
+
+  return retval;
 }
 \f
 /* Parse the string EXP as a C expression, evaluate it,
@@ -78,14 +95,9 @@ evaluate_subexp (struct type *expect_type, struct expression *exp,
 CORE_ADDR
 parse_and_eval_address (const char *exp)
 {
-  struct expression *expr = parse_expression (exp);
-  CORE_ADDR addr;
-  struct cleanup *old_chain =
-    make_cleanup (free_current_contents, &expr);
-
-  addr = value_as_address (evaluate_expression (expr));
-  do_cleanups (old_chain);
-  return addr;
+  expression_up expr = parse_expression (exp);
+
+  return value_as_address (evaluate_expression (expr.get ()));
 }
 
 /* Like parse_and_eval_address, but treats the value of the expression
@@ -93,27 +105,17 @@ parse_and_eval_address (const char *exp)
 LONGEST
 parse_and_eval_long (const char *exp)
 {
-  struct expression *expr = parse_expression (exp);
-  LONGEST retval;
-  struct cleanup *old_chain =
-    make_cleanup (free_current_contents, &expr);
-
-  retval = value_as_long (evaluate_expression (expr));
-  do_cleanups (old_chain);
-  return (retval);
+  expression_up expr = parse_expression (exp);
+
+  return value_as_long (evaluate_expression (expr.get ()));
 }
 
 struct value *
 parse_and_eval (const char *exp)
 {
-  struct expression *expr = parse_expression (exp);
-  struct value *val;
-  struct cleanup *old_chain =
-    make_cleanup (free_current_contents, &expr);
+  expression_up expr = parse_expression (exp);
 
-  val = evaluate_expression (expr);
-  do_cleanups (old_chain);
-  return val;
+  return evaluate_expression (expr.get ());
 }
 
 /* Parse up to a comma (or to a closeparen)
@@ -123,14 +125,9 @@ parse_and_eval (const char *exp)
 struct value *
 parse_to_comma_and_eval (const char **expp)
 {
-  struct expression *expr = parse_exp_1 (expp, 0, (struct block *) 0, 1);
-  struct value *val;
-  struct cleanup *old_chain =
-    make_cleanup (free_current_contents, &expr);
+  expression_up expr = parse_exp_1 (expp, 0, (struct block *) 0, 1);
 
-  val = evaluate_expression (expr);
-  do_cleanups (old_chain);
-  return val;
+  return evaluate_expression (expr.get ());
 }
 \f
 /* Evaluate an expression in internal prefix form
@@ -195,7 +192,6 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp,
                    int preserve_errors)
 {
   struct value *mark, *new_mark, *result;
-  volatile struct gdb_exception ex;
 
   *valp = NULL;
   if (resultp)
@@ -207,11 +203,11 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp,
   mark = value_mark ();
   result = NULL;
 
-  TRY_CATCH (ex, RETURN_MASK_ALL)
+  TRY
     {
       result = evaluate_subexp (NULL_TYPE, exp, pc, EVAL_NORMAL);
     }
-  if (ex.reason < 0)
+  CATCH (ex, RETURN_MASK_ALL)
     {
       /* Ignore memory errors if we want watchpoints pointing at
         inaccessible memory to still be created; otherwise, throw the
@@ -226,6 +222,7 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp,
          break;
        }
     }
+  END_CATCH
 
   new_mark = value_mark ();
   if (mark == new_mark)
@@ -241,13 +238,16 @@ fetch_subexp_value (struct expression *exp, int *pc, struct value **valp,
        *valp = result;
       else
        {
-         volatile struct gdb_exception except;
 
-         TRY_CATCH (except, RETURN_MASK_ERROR)
+         TRY
            {
              value_fetch_lazy (result);
              *valp = result;
            }
+         CATCH (except, RETURN_MASK_ERROR)
+           {
+           }
+         END_CATCH
        }
     }
 
@@ -346,12 +346,11 @@ evaluate_struct_tuple (struct value *struct_val,
   return struct_val;
 }
 
-/* Recursive helper function for setting elements of array tuples for
-   (the deleted) Chill.  The target is ARRAY (which has bounds
-   LOW_BOUND to HIGH_BOUND); the element value is ELEMENT; EXP, POS
-   and NOSIDE are as usual.  Evaluates index expresions and sets the
-   specified element(s) of ARRAY to ELEMENT.  Returns last index
-   value.  */
+/* Recursive helper function for setting elements of array tuples.
+   The target is ARRAY (which has bounds LOW_BOUND to HIGH_BOUND); the
+   element value is ELEMENT; EXP, POS and NOSIDE are as usual.
+   Evaluates index expresions and sets the specified element(s) of
+   ARRAY to ELEMENT.  Returns last index value.  */
 
 static LONGEST
 init_array_element (struct value *array, struct value *element,
@@ -369,22 +368,6 @@ init_array_element (struct value *array, struct value *element,
       return init_array_element (array, element,
                                 exp, pos, noside, low_bound, high_bound);
     }
-  else if (exp->elts[*pos].opcode == BINOP_RANGE)
-    {
-      LONGEST low, high;
-
-      (*pos)++;
-      low = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
-      high = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
-      if (low < low_bound || high > high_bound)
-       error (_("tuple range index out of range"));
-      for (index = low; index <= high; index++)
-       {
-         memcpy (value_contents_raw (array)
-                 + (index - low_bound) * element_size,
-                 value_contents (element), element_size);
-       }
-    }
   else
     {
       index = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
@@ -403,7 +386,8 @@ value_f90_subarray (struct value *array,
   int pc = (*pos) + 1;
   LONGEST low_bound, high_bound;
   struct type *range = check_typedef (TYPE_INDEX_TYPE (value_type (array)));
-  enum f90_range_type range_type = longest_to_int (exp->elts[pc].longconst);
+  enum range_type range_type
+    = (enum range_type) longest_to_int (exp->elts[pc].longconst);
  
   *pos += 3;
 
@@ -636,7 +620,7 @@ static int
 ptrmath_type_p (const struct language_defn *lang, struct type *type)
 {
   type = check_typedef (type);
-  if (TYPE_CODE (type) == TYPE_CODE_REF)
+  if (TYPE_IS_REFERENCE (type))
     type = TYPE_TARGET_TYPE (type);
 
   switch (TYPE_CODE (type))
@@ -664,7 +648,6 @@ make_params (int num_types, struct type **param_types)
   TYPE_MAIN_TYPE (type) = XCNEW (struct main_type);
   TYPE_LENGTH (type) = 1;
   TYPE_CODE (type) = TYPE_CODE_METHOD;
-  TYPE_VPTR_FIELDNO (type) = -1;
   TYPE_CHAIN (type) = type;
   if (num_types > 0)
     {
@@ -763,16 +746,15 @@ evaluate_subexp_standard (struct type *expect_type,
         or reference to a base class and print object is on.  */
 
       {
-       volatile struct gdb_exception except;
        struct value *ret = NULL;
 
-       TRY_CATCH (except, RETURN_MASK_ERROR)
+       TRY
          {
            ret = value_of_variable (exp->elts[pc + 2].symbol,
                                     exp->elts[pc + 1].block);
          }
 
-       if (except.reason < 0)
+       CATCH (except, RETURN_MASK_ERROR)
          {
            if (noside == EVAL_AVOID_SIDE_EFFECTS)
              ret = value_zero (SYMBOL_TYPE (exp->elts[pc + 2].symbol),
@@ -780,6 +762,7 @@ evaluate_subexp_standard (struct type *expect_type,
            else
              throw_exception (except);
          }
+       END_CATCH
 
        return ret;
       }
@@ -903,11 +886,6 @@ evaluate_subexp_standard (struct type *expect_type,
              struct value *element;
              int index_pc = 0;
 
-             if (exp->elts[*pos].opcode == BINOP_RANGE)
-               {
-                 index_pc = ++(*pos);
-                 evaluate_subexp (NULL_TYPE, exp, pos, EVAL_SKIP);
-               }
              element = evaluate_subexp (element_type, exp, pos, noside);
              if (value_type (element) != element_type)
                element = value_cast (element_type, element);
@@ -958,22 +936,10 @@ evaluate_subexp_standard (struct type *expect_type,
              struct type *range_low_type, *range_high_type;
              struct value *elem_val;
 
-             if (exp->elts[*pos].opcode == BINOP_RANGE)
-               {
-                 (*pos)++;
-                 elem_val = evaluate_subexp (element_type, exp, pos, noside);
-                 range_low_type = value_type (elem_val);
-                 range_low = value_as_long (elem_val);
-                 elem_val = evaluate_subexp (element_type, exp, pos, noside);
-                 range_high_type = value_type (elem_val);
-                 range_high = value_as_long (elem_val);
-               }
-             else
-               {
-                 elem_val = evaluate_subexp (element_type, exp, pos, noside);
-                 range_low_type = range_high_type = value_type (elem_val);
-                 range_low = range_high = value_as_long (elem_val);
-               }
+             elem_val = evaluate_subexp (element_type, exp, pos, noside);
+             range_low_type = range_high_type = value_type (elem_val);
+             range_low = range_high = value_as_long (elem_val);
+
              /* Check types of elements to avoid mixture of elements from
                 different types. Also check if type of element is "compatible"
                 with element type of powerset.  */
@@ -1012,7 +978,7 @@ evaluate_subexp_standard (struct type *expect_type,
          return set;
        }
 
-      argvec = (struct value **) alloca (sizeof (struct value *) * nargs);
+      argvec = XALLOCAVEC (struct value *, nargs);
       for (tem = 0; tem < nargs; tem++)
        {
          /* Ensure that array expressions are coerced into pointer
@@ -1078,7 +1044,7 @@ evaluate_subexp_standard (struct type *expect_type,
        CORE_ADDR selector = 0;
 
        int struct_return = 0;
-       int sub_no_side = 0;
+       enum noside sub_no_side = EVAL_NORMAL;
 
        struct value *msg_send = NULL;
        struct value *msg_send_stret = NULL;
@@ -1096,8 +1062,7 @@ evaluate_subexp_standard (struct type *expect_type,
 
        selector = exp->elts[pc + 1].longconst;
        nargs = exp->elts[pc + 2].longconst;
-       argvec = (struct value **) alloca (sizeof (struct value *) 
-                                          * (nargs + 5));
+       argvec = XALLOCAVEC (struct value *, nargs + 5);
 
        (*pos) += 3;
 
@@ -1182,12 +1147,12 @@ evaluate_subexp_standard (struct type *expect_type,
        argvec[3] = value_from_longest (long_type, selector);
        argvec[4] = 0;
 
-       ret = call_function_by_hand (argvec[0], 3, argvec + 1);
+       ret = call_function_by_hand (argvec[0], NULL, 3, argvec + 1);
        if (gnu_runtime)
          {
            /* Function objc_msg_lookup returns a pointer.  */
            argvec[0] = ret;
-           ret = call_function_by_hand (argvec[0], 3, argvec + 1);
+           ret = call_function_by_hand (argvec[0], NULL, 3, argvec + 1);
          }
        if (value_as_long (ret) == 0)
          error (_("Target does not respond to this message selector."));
@@ -1204,11 +1169,11 @@ evaluate_subexp_standard (struct type *expect_type,
        argvec[3] = value_from_longest (long_type, selector);
        argvec[4] = 0;
 
-       ret = call_function_by_hand (argvec[0], 3, argvec + 1);
+       ret = call_function_by_hand (argvec[0], NULL, 3, argvec + 1);
        if (gnu_runtime)
          {
            argvec[0] = ret;
-           ret = call_function_by_hand (argvec[0], 3, argvec + 1);
+           ret = call_function_by_hand (argvec[0], NULL, 3, argvec + 1);
          }
 
        /* ret should now be the selector.  */
@@ -1241,7 +1206,7 @@ evaluate_subexp_standard (struct type *expect_type,
 
            block_for_pc (funaddr);
 
-           CHECK_TYPEDEF (val_type);
+           val_type = check_typedef (val_type);
          
            if ((val_type == NULL) 
                || (TYPE_CODE(val_type) == TYPE_CODE_ERROR))
@@ -1350,10 +1315,10 @@ evaluate_subexp_standard (struct type *expect_type,
            deprecated_set_value_type (argvec[0],
                                       lookup_pointer_type (lookup_function_type (value_type (argvec[0]))));
            argvec[0]
-             = call_function_by_hand (argvec[0], nargs + 2, argvec + 1);
+             = call_function_by_hand (argvec[0], NULL, nargs + 2, argvec + 1);
          }
 
-       ret = call_function_by_hand (argvec[0], nargs + 2, argvec + 1);
+       ret = call_function_by_hand (argvec[0], NULL, nargs + 2, argvec + 1);
        return ret;
       }
       break;
@@ -1371,9 +1336,6 @@ evaluate_subexp_standard (struct type *expect_type,
          /* First, evaluate the structure into arg2.  */
          pc2 = (*pos)++;
 
-         if (noside == EVAL_SKIP)
-           goto nosideret;
-
          if (op == STRUCTOP_MEMBER)
            {
              arg2 = evaluate_subexp_for_address (exp, pos, noside);
@@ -1392,7 +1354,10 @@ evaluate_subexp_standard (struct type *expect_type,
          arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
 
          type = check_typedef (value_type (arg1));
-         if (TYPE_CODE (type) == TYPE_CODE_METHODPTR)
+         if (noside == EVAL_SKIP)
+           tem = 1;  /* Set it to the right arg index so that all arguments
+                        can also be skipped.  */
+         else if (TYPE_CODE (type) == TYPE_CODE_METHODPTR)
            {
              if (noside == EVAL_AVOID_SIDE_EFFECTS)
                arg1 = value_zero (TYPE_TARGET_TYPE (type), not_lval);
@@ -1407,7 +1372,7 @@ evaluate_subexp_standard (struct type *expect_type,
          else if (TYPE_CODE (type) == TYPE_CODE_MEMBERPTR)
            {
              struct type *type_ptr
-               = lookup_pointer_type (TYPE_DOMAIN_TYPE (type));
+               = lookup_pointer_type (TYPE_SELF_TYPE (type));
              struct type *target_type_ptr
                = lookup_pointer_type (TYPE_TARGET_TYPE (type));
 
@@ -1435,8 +1400,6 @@ evaluate_subexp_standard (struct type *expect_type,
          pc2 = (*pos)++;
          tem2 = longest_to_int (exp->elts[pc2 + 1].longconst);
          *pos += 3 + BYTES_TO_EXP_ELEM (tem2 + 1);
-         if (noside == EVAL_SKIP)
-           goto nosideret;
 
          if (op == STRUCTOP_STRUCT)
            {
@@ -1466,20 +1429,21 @@ evaluate_subexp_standard (struct type *expect_type,
                 operator and continue evaluation.  */
              while (unop_user_defined_p (op, arg2))
                {
-                 volatile struct gdb_exception except;
                  struct value *value = NULL;
-                 TRY_CATCH (except, RETURN_MASK_ERROR)
+                 TRY
                    {
                      value = value_x_unop (arg2, op, noside);
                    }
 
-                 if (except.reason < 0)
+                 CATCH (except, RETURN_MASK_ERROR)
                    {
                      if (except.error == NOT_FOUND_ERROR)
                        break;
                      else
                        throw_exception (except);
                    }
+                 END_CATCH
+
                  arg2 = value;
                }
            }
@@ -1508,7 +1472,7 @@ evaluate_subexp_standard (struct type *expect_type,
              function = cp_lookup_symbol_namespace (TYPE_TAG_NAME (type),
                                                     name,
                                                     get_selected_block (0),
-                                                    VAR_DOMAIN);
+                                                    VAR_DOMAIN).symbol;
              if (function == NULL)
                error (_("No symbol \"%s\" in namespace \"%s\"."), 
                       name, TYPE_TAG_NAME (type));
@@ -1585,6 +1549,9 @@ evaluate_subexp_standard (struct type *expect_type,
       /* Signal end of arglist.  */
       argvec[tem] = 0;
 
+      if (noside == EVAL_SKIP)
+       goto nosideret;
+
       if (op == OP_ADL_FUNC)
         {
           struct symbol *symp;
@@ -1601,7 +1568,7 @@ evaluate_subexp_standard (struct type *expect_type,
                                NON_METHOD, /* not method */
                                NULL, NULL, /* pass NULL symbol since
                                              symbol is unknown */
-                               NULL, &symp, NULL, 0);
+                               NULL, &symp, NULL, 0, noside);
 
           /* Now fix the expression being evaluated.  */
           exp->elts[save_pos1 + 2].symbol = symp;
@@ -1637,7 +1604,7 @@ evaluate_subexp_standard (struct type *expect_type,
                                          METHOD, /* method */
                                          &arg2,  /* the object */
                                          NULL, &valp, NULL,
-                                         &static_memfuncp, 0);
+                                         &static_memfuncp, 0, noside);
 
              if (op == OP_SCOPE && !static_memfuncp)
                {
@@ -1708,7 +1675,7 @@ evaluate_subexp_standard (struct type *expect_type,
                                          NULL,        /* no need for name */
                                          NON_METHOD,  /* not method */
                                          NULL, function, /* the function */
-                                         NULL, &symp, NULL, no_adl);
+                                         NULL, &symp, NULL, no_adl, noside);
 
              if (op == OP_VAR_VALUE)
                {
@@ -1734,18 +1701,13 @@ evaluate_subexp_standard (struct type *expect_type,
 
     do_call_it:
 
-      if (noside == EVAL_SKIP)
-       goto nosideret;
       if (argvec[0] == NULL)
        error (_("Cannot evaluate function -- may be inlined"));
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
-         /* If the return type doesn't look like a function type, call an
-            error.  This can happen if somebody tries to turn a variable into
-            a function call.  This is here because people often want to
-            call, eg, strcmp, which gdb doesn't know is a function.  If
-            gdb isn't asked for it's opinion (ie. through "whatis"),
-            it won't offer it.  */
+         /* If the return type doesn't look like a function type,
+            call an error.  This can happen if somebody tries to turn
+            a variable into a function call.  */
 
          struct type *ftype = value_type (argvec[0]);
 
@@ -1757,19 +1719,43 @@ evaluate_subexp_standard (struct type *expect_type,
              return value_zero (builtin_type (exp->gdbarch)->builtin_int,
                                 not_lval);
            }
-         else if (TYPE_GNU_IFUNC (ftype))
-           return allocate_value (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (ftype)));
-         else if (TYPE_TARGET_TYPE (ftype))
-           return allocate_value (TYPE_TARGET_TYPE (ftype));
+         else if (TYPE_CODE (ftype) == TYPE_CODE_XMETHOD)
+           {
+             struct type *return_type
+               = result_type_of_xmethod (argvec[0], nargs, argvec + 1);
+
+             if (return_type == NULL)
+               error (_("Xmethod is missing return type."));
+             return value_zero (return_type, not_lval);
+           }
+         else if (TYPE_CODE (ftype) == TYPE_CODE_FUNC
+                  || TYPE_CODE (ftype) == TYPE_CODE_METHOD)
+           {
+             struct type *return_type = TYPE_TARGET_TYPE (ftype);
+
+             if (return_type == NULL)
+               return_type = expect_type;
+
+             if (return_type == NULL)
+               error_call_unknown_return_type (NULL);
+
+             return allocate_value (return_type);
+           }
          else
            error (_("Expression of type other than "
                     "\"Function returning ...\" used as function"));
        }
-      if (TYPE_CODE (value_type (argvec[0])) == TYPE_CODE_INTERNAL_FUNCTION)
-       return call_internal_function (exp->gdbarch, exp->language_defn,
-                                      argvec[0], nargs, argvec + 1);
-
-      return call_function_by_hand (argvec[0], nargs, argvec + 1);
+      switch (TYPE_CODE (value_type (argvec[0])))
+       {
+       case TYPE_CODE_INTERNAL_FUNCTION:
+         return call_internal_function (exp->gdbarch, exp->language_defn,
+                                        argvec[0], nargs, argvec + 1);
+       case TYPE_CODE_XMETHOD:
+         return call_xmethod (argvec[0], nargs, argvec + 1);
+       default:
+         return call_function_by_hand (argvec[0],
+                                       expect_type, nargs, argvec + 1);
+       }
       /* pai: FIXME save value from call_function_by_hand, then adjust
         pc by adjust_fn_pc if +ve.  */
 
@@ -1811,13 +1797,13 @@ evaluate_subexp_standard (struct type *expect_type,
       switch (code)
        {
        case TYPE_CODE_ARRAY:
-         if (exp->elts[*pos].opcode == OP_F90_RANGE)
+         if (exp->elts[*pos].opcode == OP_RANGE)
            return value_f90_subarray (arg1, exp, pos, noside);
          else
            goto multi_f77_subscript;
 
        case TYPE_CODE_STRING:
-         if (exp->elts[*pos].opcode == OP_F90_RANGE)
+         if (exp->elts[*pos].opcode == OP_RANGE)
            return value_f90_subarray (arg1, exp, pos, noside);
          else
            {
@@ -1837,6 +1823,8 @@ evaluate_subexp_standard (struct type *expect_type,
          for (; tem <= nargs; tem++)
            argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside);
          argvec[tem] = 0;      /* signal end of arglist */
+         if (noside == EVAL_SKIP)
+           goto nosideret;
          goto do_call_it;
 
        default:
@@ -1861,7 +1849,7 @@ evaluate_subexp_standard (struct type *expect_type,
       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);
+       arg3 = value_zero (value_type (arg3), VALUE_LVAL (arg3));
       return arg3;
 
     case STRUCTOP_PTR:
@@ -1875,20 +1863,21 @@ evaluate_subexp_standard (struct type *expect_type,
          arg1 with the value returned by evaluating operator->().  */
       while (unop_user_defined_p (op, arg1))
        {
-         volatile struct gdb_exception except;
          struct value *value = NULL;
-         TRY_CATCH (except, RETURN_MASK_ERROR)
+         TRY
            {
              value = value_x_unop (arg1, op, noside);
            }
 
-         if (except.reason < 0)
+         CATCH (except, RETURN_MASK_ERROR)
            {
              if (except.error == NOT_FOUND_ERROR)
                break;
              else
                throw_exception (except);
            }
+         END_CATCH
+
          arg1 = value;
        }
 
@@ -1898,12 +1887,13 @@ evaluate_subexp_standard (struct type *expect_type,
       {
         struct type *type = value_type (arg1);
         struct type *real_type;
-        int full, top, using_enc;
+        int full, using_enc;
+        LONGEST top;
        struct value_print_options opts;
 
        get_user_print_options (&opts);
         if (opts.objectprint && TYPE_TARGET_TYPE(type)
-            && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS))
+            && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_STRUCT))
           {
             real_type = value_rtti_indirect_type (arg1, &full, &top,
                                                  &using_enc);
@@ -1915,7 +1905,7 @@ evaluate_subexp_standard (struct type *expect_type,
       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);
+       arg3 = value_zero (value_type (arg3), VALUE_LVAL (arg3));
       return arg3;
 
     case STRUCTOP_MEMBER:
@@ -1945,7 +1935,7 @@ evaluate_subexp_standard (struct type *expect_type,
 
        case TYPE_CODE_MEMBERPTR:
          /* Now, convert these values to an address.  */
-         arg1 = value_cast_pointers (lookup_pointer_type (TYPE_DOMAIN_TYPE (type)),
+         arg1 = value_cast_pointers (lookup_pointer_type (TYPE_SELF_TYPE (type)),
                                      arg1, 1);
 
          mem_offset = value_as_long (arg2);
@@ -2122,13 +2112,6 @@ evaluate_subexp_standard (struct type *expect_type,
            }
        }
 
-    case BINOP_RANGE:
-      evaluate_subexp (NULL_TYPE, exp, pos, noside);
-      evaluate_subexp (NULL_TYPE, exp, pos, noside);
-      if (noside == EVAL_SKIP)
-       goto nosideret;
-      error (_("':' operator used in invalid context"));
-
     case BINOP_SUBSCRIPT:
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
@@ -2159,15 +2142,6 @@ evaluate_subexp_standard (struct type *expect_type,
          else
            return value_subscript (arg1, value_as_long (arg2));
        }
-
-    case BINOP_IN:
-      arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
-      arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
-      if (noside == EVAL_SKIP)
-       goto nosideret;
-      type = language_bool_type (exp->language_defn, exp->gdbarch);
-      return value_from_longest (type, (LONGEST) value_in (arg1, arg2));
-
     case MULTI_SUBSCRIPT:
       (*pos) += 2;
       nargs = longest_to_int (exp->elts[pc + 1].longconst);
@@ -2441,7 +2415,8 @@ evaluate_subexp_standard (struct type *expect_type,
       if (noside == EVAL_SKIP)
        goto nosideret;
       type = check_typedef (value_type (arg2));
-      if (TYPE_CODE (type) != TYPE_CODE_INT)
+      if (TYPE_CODE (type) != TYPE_CODE_INT
+          && TYPE_CODE (type) != TYPE_CODE_ENUM)
        error (_("Non-integral right operand for \"@\" operator."));
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
@@ -2523,7 +2498,7 @@ evaluate_subexp_standard (struct type *expect_type,
        {
          type = check_typedef (value_type (arg1));
          if (TYPE_CODE (type) == TYPE_CODE_PTR
-             || TYPE_CODE (type) == TYPE_CODE_REF
+             || TYPE_IS_REFERENCE (type)
          /* In C you can dereference an array to get the 1st elt.  */
              || TYPE_CODE (type) == TYPE_CODE_ARRAY
            )
@@ -2759,18 +2734,7 @@ evaluate_subexp_standard (struct type *expect_type,
       if (noside == EVAL_SKIP)
         goto nosideret;
       else if (noside == EVAL_AVOID_SIDE_EFFECTS)
-       {
-         struct type *type = exp->elts[pc + 1].type;
-
-         /* If this is a typedef, then find its immediate target.  We
-            use check_typedef to resolve stubs, but we ignore its
-            result because we do not want to dig past all
-            typedefs.  */
-         check_typedef (type);
-         if (TYPE_CODE (type) == TYPE_CODE_TYPEDEF)
-           type = TYPE_TARGET_TYPE (type);
-         return allocate_value (type);
-       }
+       return allocate_value (exp->elts[pc + 1].type);
       else
         error (_("Attempt to use a type name as an expression"));
 
@@ -2801,9 +2765,9 @@ evaluate_subexp_standard (struct type *expect_type,
            {
              struct type *type = value_type (result);
 
-             if (TYPE_CODE (check_typedef (type)) != TYPE_CODE_REF)
+             if (!TYPE_IS_REFERENCE (type))
                {
-                 type = lookup_reference_type (type);
+                 type = lookup_lvalue_reference_type (type);
                  result = allocate_value (type);
                }
            }
@@ -2904,7 +2868,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
 
       /* C++: The "address" of a reference should yield the address
        * of the object pointed to.  Let value_addr() deal with it.  */
-      if (TYPE_CODE (SYMBOL_TYPE (var)) == TYPE_CODE_REF)
+      if (TYPE_IS_REFERENCE (SYMBOL_TYPE (var)))
        goto default_case;
 
       (*pos) += 4;
@@ -2943,7 +2907,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
        {
          struct type *type = check_typedef (value_type (x));
 
-         if (TYPE_CODE (type) == TYPE_CODE_REF)
+         if (TYPE_IS_REFERENCE (type))
            return value_zero (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
                               not_lval);
          else if (VALUE_LVAL (x) == lval_memory || value_must_coerce_to_target (x))
@@ -3033,7 +2997,7 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos,
       val = evaluate_subexp (NULL_TYPE, exp, pos, EVAL_AVOID_SIDE_EFFECTS);
       type = check_typedef (value_type (val));
       if (TYPE_CODE (type) != TYPE_CODE_PTR
-         && TYPE_CODE (type) != TYPE_CODE_REF
+         && !TYPE_IS_REFERENCE (type)
          && TYPE_CODE (type) != TYPE_CODE_ARRAY)
        error (_("Attempt to take contents of a non-pointer value."));
       type = TYPE_TARGET_TYPE (type);
@@ -3103,9 +3067,9 @@ evaluate_subexp_for_sizeof (struct expression *exp, int *pos,
   /* $5.3.3/2 of the C++ Standard (n3290 draft) says of sizeof:
      "When applied to a reference or a reference type, the result is
      the size of the referenced type."  */
-  CHECK_TYPEDEF (type);
+  type = check_typedef (type);
   if (exp->language_defn->la_language == language_cplus
-      && TYPE_CODE (type) == TYPE_CODE_REF)
+      && (TYPE_IS_REFERENCE (type)))
     type = check_typedef (TYPE_TARGET_TYPE (type));
   return value_from_longest (size_type, (LONGEST) TYPE_LENGTH (type));
 }
@@ -3116,14 +3080,13 @@ struct type *
 parse_and_eval_type (char *p, int length)
 {
   char *tmp = (char *) alloca (length + 4);
-  struct expression *expr;
 
   tmp[0] = '(';
   memcpy (tmp + 1, p, length);
   tmp[length + 1] = ')';
   tmp[length + 2] = '0';
   tmp[length + 3] = '\0';
-  expr = parse_expression (tmp);
+  expression_up expr = parse_expression (tmp);
   if (expr->elts[0].opcode != UNOP_CAST)
     error (_("Internal error in eval_type."));
   return expr->elts[1].type;
This page took 0.045011 seconds and 4 git commands to generate.