daily update
[deliverable/binutils-gdb.git] / gdb / eval.c
index 90ea2adcb2a72c91acf95384f3af931f3e1118e4..26947812e671f371800ed262a0a34c6607f79903 100644 (file)
@@ -2,7 +2,7 @@
 
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
    1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008,
-   2009 Free Software Foundation, Inc.
+   2009, 2010 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -43,6 +43,7 @@
 #include "gdb_obstack.h"
 #include "objfiles.h"
 #include "python/python.h"
+#include "wrapper.h"
 
 #include "gdb_assert.h"
 
@@ -162,6 +163,7 @@ struct value *
 evaluate_expression (struct expression *exp)
 {
   int pc = 0;
+
   return evaluate_subexp (NULL_TYPE, exp, &pc, EVAL_NORMAL);
 }
 
@@ -172,6 +174,7 @@ struct value *
 evaluate_type (struct expression *exp)
 {
   int pc = 0;
+
   return evaluate_subexp (NULL_TYPE, exp, &pc, EVAL_AVOID_SIDE_EFFECTS);
 }
 
@@ -184,6 +187,84 @@ evaluate_subexpression_type (struct expression *exp, int subexp)
   return evaluate_subexp (NULL_TYPE, exp, &subexp, EVAL_AVOID_SIDE_EFFECTS);
 }
 
+/* Find the current value of a watchpoint on EXP.  Return the value in
+   *VALP and *RESULTP and the chain of intermediate and final values
+   in *VAL_CHAIN.  RESULTP and VAL_CHAIN may be NULL if the caller does
+   not need them.
+
+   If a memory error occurs while evaluating the expression, *RESULTP will
+   be set to NULL.  *RESULTP may be a lazy value, if the result could
+   not be read from memory.  It is used to determine whether a value
+   is user-specified (we should watch the whole value) or intermediate
+   (we should watch only the bit used to locate the final value).
+
+   If the final value, or any intermediate value, could not be read
+   from memory, *VALP will be set to NULL.  *VAL_CHAIN will still be
+   set to any referenced values.  *VALP will never be a lazy value.
+   This is the value which we store in struct breakpoint.
+
+   If VAL_CHAIN is non-NULL, *VAL_CHAIN will be released from the
+   value chain.  The caller must free the values individually.  If
+   VAL_CHAIN is NULL, all generated values will be left on the value
+   chain.  */
+
+void
+fetch_subexp_value (struct expression *exp, int *pc, struct value **valp,
+                   struct value **resultp, struct value **val_chain)
+{
+  struct value *mark, *new_mark, *result;
+  volatile struct gdb_exception ex;
+
+  *valp = NULL;
+  if (resultp)
+    *resultp = NULL;
+  if (val_chain)
+    *val_chain = NULL;
+
+  /* Evaluate the expression.  */
+  mark = value_mark ();
+  result = NULL;
+
+  TRY_CATCH (ex, RETURN_MASK_ALL)
+    {
+      result = evaluate_subexp (NULL_TYPE, exp, pc, EVAL_NORMAL);
+    }
+  if (ex.reason < 0)
+    {
+      /* Ignore memory errors, we want watchpoints pointing at
+        inaccessible memory to still be created; otherwise, throw the
+        error to some higher catcher.  */
+      switch (ex.error)
+       {
+       case MEMORY_ERROR:
+         break;
+       default:
+         throw_exception (ex);
+         break;
+       }
+    }
+
+  new_mark = value_mark ();
+  if (mark == new_mark)
+    return;
+  if (resultp)
+    *resultp = result;
+
+  /* Make sure it's not lazy, so that after the target stops again we
+     have a non-lazy previous value to compare with.  */
+  if (result != NULL
+      && (!value_lazy (result) || gdb_value_fetch_lazy (result)))
+    *valp = result;
+
+  if (val_chain)
+    {
+      /* Return the chain of intermediate values.  We use this to
+        decide which addresses to watch.  */
+      *val_chain = new_mark;
+      value_release_to_mark (mark);
+    }
+}
+
 /* Extract a field operation from an expression.  If the subexpression
    of EXP starting at *SUBEXP is not a structure dereference
    operation, return NULL.  Otherwise, return the name of the
@@ -196,6 +277,7 @@ extract_field_op (struct expression *exp, int *subexp)
 {
   int tem;
   char *result;
+
   if (exp->elts[*subexp].opcode != STRUCTOP_STRUCT
       && exp->elts[*subexp].opcode != STRUCTOP_PTR)
     return NULL;
@@ -216,6 +298,7 @@ get_label (struct expression *exp, int *pos)
       int pc = (*pos)++;
       char *name = &exp->elts[pc + 2].string;
       int tem = longest_to_int (exp->elts[pc + 1].longconst);
+
       (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
       return name;
     }
@@ -237,6 +320,7 @@ evaluate_struct_tuple (struct value *struct_val,
   int fieldno = -1;
   int variantno = -1;
   int subfieldno = -1;
+
   while (--nargs >= 0)
     {
       int pc = *pos;
@@ -252,12 +336,14 @@ evaluate_struct_tuple (struct value *struct_val,
       do
        {
          char *label = get_label (exp, &pc);
+
          if (label)
            {
              for (fieldno = 0; fieldno < TYPE_NFIELDS (struct_type);
                   fieldno++)
                {
                  char *field_name = TYPE_FIELD_NAME (struct_type, fieldno);
+
                  if (field_name != NULL && strcmp (field_name, label) == 0)
                    {
                      variantno = -1;
@@ -270,6 +356,7 @@ evaluate_struct_tuple (struct value *struct_val,
                   fieldno++)
                {
                  char *field_name = TYPE_FIELD_NAME (struct_type, fieldno);
+
                  field_type = TYPE_FIELD_TYPE (struct_type, fieldno);
                  if ((field_name == 0 || *field_name == '\0')
                      && TYPE_CODE (field_type) == TYPE_CODE_UNION)
@@ -381,6 +468,7 @@ init_array_element (struct value *array, struct value *element,
 {
   LONGEST index;
   int element_size = TYPE_LENGTH (value_type (element));
+
   if (exp->elts[*pos].opcode == BINOP_COMMA)
     {
       (*pos)++;
@@ -392,6 +480,7 @@ init_array_element (struct value *array, struct value *element,
   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));
@@ -464,6 +553,7 @@ unop_promote (const struct language_defn *language, struct gdbarch *gdbarch,
             it needs to modify this function.  */
          {
            struct type *builtin_int = builtin_type (gdbarch)->builtin_int;
+
            if (TYPE_LENGTH (type1) < TYPE_LENGTH (builtin_int))
              *arg1 = value_cast (builtin_int, *arg1);
          }
@@ -633,7 +723,7 @@ binop_promote (const struct language_defn *language, struct gdbarch *gdbarch,
 }
 
 static int
-ptrmath_type_p (struct type *type)
+ptrmath_type_p (const struct language_defn *lang, struct type *type)
 {
   type = check_typedef (type);
   if (TYPE_CODE (type) == TYPE_CODE_REF)
@@ -646,7 +736,7 @@ ptrmath_type_p (struct type *type)
       return 1;
 
     case TYPE_CODE_ARRAY:
-      return current_language->c_style_arrays;
+      return lang->c_style_arrays;
 
     default:
       return 0;
@@ -690,12 +780,14 @@ evaluate_subexp_standard (struct type *expect_type,
   struct type *type;
   int nargs;
   struct value **argvec;
-  int upper, lower, retcode;
+  int upper, lower;
   int code;
   int ix;
   long mem_offset;
   struct type **arg_types;
   int save_pos1;
+  struct symbol *function = NULL;
+  char *function_name = NULL;
 
   pc = (*pos)++;
   op = exp->elts[pc].opcode;
@@ -729,6 +821,7 @@ evaluate_subexp_standard (struct type *expect_type,
       return value_from_decfloat (exp->elts[pc + 1].type,
                                  exp->elts[pc + 2].decfloatconst);
 
+    case OP_ADL_FUNC:
     case OP_VAR_VALUE:
       (*pos) += 3;
       if (noside == EVAL_SKIP)
@@ -845,6 +938,7 @@ evaluate_subexp_standard (struct type *expect_type,
          && TYPE_CODE (type) == TYPE_CODE_STRUCT)
        {
          struct value *rec = allocate_value (expect_type);
+
          memset (value_contents_raw (rec), '\0', TYPE_LENGTH (type));
          return evaluate_struct_tuple (rec, exp, pos, noside, nargs);
        }
@@ -857,6 +951,7 @@ evaluate_subexp_standard (struct type *expect_type,
          struct value *array = allocate_value (expect_type);
          int element_size = TYPE_LENGTH (check_typedef (element_type));
          LONGEST low_bound, high_bound, index;
+
          if (get_discrete_bounds (range_type, &low_bound, &high_bound) < 0)
            {
              low_bound = 0;
@@ -868,6 +963,7 @@ evaluate_subexp_standard (struct type *expect_type,
            {
              struct value *element;
              int index_pc = 0;
+
              if (exp->elts[*pos].opcode == BINOP_RANGE)
                {
                  index_pc = ++(*pos);
@@ -879,6 +975,7 @@ evaluate_subexp_standard (struct type *expect_type,
              if (index_pc)
                {
                  int continue_pc = *pos;
+
                  *pos = index_pc;
                  index = init_array_element (array, element, exp, pos, noside,
                                              low_bound, high_bound);
@@ -921,6 +1018,7 @@ evaluate_subexp_standard (struct type *expect_type,
              LONGEST range_low, range_high;
              struct type *range_low_type, *range_high_type;
              struct value *elem_val;
+
              if (exp->elts[*pos].opcode == BINOP_RANGE)
                {
                  (*pos)++;
@@ -965,6 +1063,7 @@ evaluate_subexp_standard (struct type *expect_type,
              for (; range_low <= range_high; range_low++)
                {
                  int bit_index = (unsigned) range_low % TARGET_CHAR_BIT;
+
                  if (gdbarch_bits_big_endian (exp->gdbarch))
                    bit_index = TARGET_CHAR_BIT - 1 - bit_index;
                  valaddr[(unsigned) range_low / TARGET_CHAR_BIT]
@@ -988,9 +1087,10 @@ evaluate_subexp_standard (struct type *expect_type,
       {
        struct value *array = evaluate_subexp (NULL_TYPE, exp, pos, noside);
        int lowbound
-       = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
+         = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
        int upper
-       = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
+         = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
+
        if (noside == EVAL_SKIP)
          goto nosideret;
        return value_slice (array, lowbound, upper - lowbound + 1);
@@ -1000,9 +1100,10 @@ evaluate_subexp_standard (struct type *expect_type,
       {
        struct value *array = evaluate_subexp (NULL_TYPE, exp, pos, noside);
        int lowbound
-       = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
+         = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
        int length
-       = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
+         = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
+
        return value_slice (array, lowbound, length);
       }
 
@@ -1098,6 +1199,7 @@ evaluate_subexp_standard (struct type *expect_type,
        if (gnu_runtime)
          {
            struct type *type = selector_type;
+
            type = lookup_function_type (type);
            type = lookup_pointer_type (type);
            type = lookup_function_type (type);
@@ -1283,6 +1385,7 @@ evaluate_subexp_standard (struct type *expect_type,
               it. */
 
            struct type *type = value_type (called_method);
+
            if (type && TYPE_CODE (type) == TYPE_CODE_PTR)
              type = TYPE_TARGET_TYPE (type);
            type = TYPE_TARGET_TYPE (type);
@@ -1364,6 +1467,7 @@ evaluate_subexp_standard (struct type *expect_type,
          if (noside == EVAL_AVOID_SIDE_EFFECTS)
            {
              struct type *method_type = check_typedef (value_type (arg1));
+
              arg1 = value_zero (method_type, not_lval);
            }
          else
@@ -1410,23 +1514,85 @@ evaluate_subexp_standard (struct type *expect_type,
          /* Now, say which argument to start evaluating from */
          tem = 2;
        }
+      else if (op == OP_SCOPE
+              && overload_resolution
+              && (exp->language_defn->la_language == language_cplus))
+       {
+         /* Unpack it locally so we can properly handle overload
+            resolution.  */
+         char *name;
+         int local_tem;
+
+         pc2 = (*pos)++;
+         local_tem = longest_to_int (exp->elts[pc2 + 2].longconst);
+         (*pos) += 4 + BYTES_TO_EXP_ELEM (local_tem + 1);
+         type = exp->elts[pc2 + 1].type;
+         name = &exp->elts[pc2 + 3].string;
+
+         function = NULL;
+         function_name = NULL;
+         if (TYPE_CODE (type) == TYPE_CODE_NAMESPACE)
+           {
+             function = cp_lookup_symbol_namespace (TYPE_TAG_NAME (type),
+                                                    name,
+                                                    get_selected_block (0),
+                                                    VAR_DOMAIN);
+             if (function == NULL)
+               error (_("No symbol \"%s\" in namespace \"%s\"."), 
+                      name, TYPE_TAG_NAME (type));
+
+             tem = 1;
+           }
+         else
+           {
+             gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT
+                         || TYPE_CODE (type) == TYPE_CODE_UNION);
+             function_name = name;
+
+             arg2 = value_zero (type, lval_memory);
+             ++nargs;
+             tem = 2;
+           }
+       }
+      else if (op == OP_ADL_FUNC)
+        {
+          /* Save the function position and move pos so that the arguments
+             can be evaluated.  */
+          int func_name_len;
+
+          save_pos1 = *pos;
+          tem = 1;
+
+          func_name_len = longest_to_int (exp->elts[save_pos1 + 3].longconst);
+          (*pos) += 6 + BYTES_TO_EXP_ELEM (func_name_len + 1);
+        }
       else
        {
          /* Non-method function call */
          save_pos1 = *pos;
-         argvec[0] = evaluate_subexp_with_coercion (exp, pos, noside);
          tem = 1;
-         type = value_type (argvec[0]);
-         if (type && TYPE_CODE (type) == TYPE_CODE_PTR)
-           type = TYPE_TARGET_TYPE (type);
-         if (type && TYPE_CODE (type) == TYPE_CODE_FUNC)
+
+         /* If this is a C++ function wait until overload resolution.  */
+         if (op == OP_VAR_VALUE
+             && overload_resolution
+             && (exp->language_defn->la_language == language_cplus))
+           {
+             (*pos) += 4; /* Skip the evaluation of the symbol.  */
+             argvec[0] = NULL;
+           }
+         else
            {
-             for (; tem <= nargs && tem <= TYPE_NFIELDS (type); tem++)
+             argvec[0] = evaluate_subexp_with_coercion (exp, pos, noside);
+             type = value_type (argvec[0]);
+             if (type && TYPE_CODE (type) == TYPE_CODE_PTR)
+               type = TYPE_TARGET_TYPE (type);
+             if (type && TYPE_CODE (type) == TYPE_CODE_FUNC)
                {
-                 /* pai: FIXME This seems to be coercing arguments before
-                  * overload resolution has been done! */
-                 argvec[tem] = evaluate_subexp (TYPE_FIELD_TYPE (type, tem - 1),
-                                                exp, pos, noside);
+                 for (; tem <= nargs && tem <= TYPE_NFIELDS (type); tem++)
+                   {
+                     argvec[tem] = evaluate_subexp (TYPE_FIELD_TYPE (type, tem - 1),
+                                                    exp, pos, noside);
+                   }
                }
            }
        }
@@ -1440,16 +1606,49 @@ evaluate_subexp_standard (struct type *expect_type,
 
       /* signal end of arglist */
       argvec[tem] = 0;
-
-      if (op == STRUCTOP_STRUCT || op == STRUCTOP_PTR)
+      if (op == OP_ADL_FUNC)
+        {
+          struct symbol *symp;
+          char *func_name;
+          int  name_len;
+          int string_pc = save_pos1 + 3;
+
+          /* Extract the function name.  */
+          name_len = longest_to_int (exp->elts[string_pc].longconst);
+          func_name = (char *) alloca (name_len + 1);
+          strcpy (func_name, &exp->elts[string_pc + 1].string);
+
+          /* Prepare list of argument types for overload resolution */
+          arg_types = (struct type **) alloca (nargs * (sizeof (struct type *)));
+          for (ix = 1; ix <= nargs; ix++)
+            arg_types[ix - 1] = value_type (argvec[ix]);
+
+          find_overload_match (arg_types, nargs, func_name,
+                               NON_METHOD /* not method */ , 0 /* strict match */ ,
+                               NULL, NULL /* pass NULL symbol since symbol is unknown */ ,
+                               NULL, &symp, NULL, 0);
+
+          /* Now fix the expression being evaluated.  */
+          exp->elts[save_pos1 + 2].symbol = symp;
+          argvec[0] = evaluate_subexp_with_coercion (exp, &save_pos1, noside);
+        }
+
+      if (op == STRUCTOP_STRUCT || op == STRUCTOP_PTR
+         || (op == OP_SCOPE && function_name != NULL))
        {
          int static_memfuncp;
-         char tstr[256];
+         char *tstr;
 
          /* Method invocation : stuff "this" as first parameter */
          argvec[1] = arg2;
-         /* Name of method from expression */
-         strcpy (tstr, &exp->elts[pc2 + 2].string);
+
+         if (op != OP_SCOPE)
+           {
+             /* Name of method from expression */
+             tstr = &exp->elts[pc2 + 2].string;
+           }
+         else
+           tstr = function_name;
 
          if (overload_resolution && (exp->language_defn->la_language == language_cplus))
            {
@@ -1462,11 +1661,17 @@ evaluate_subexp_standard (struct type *expect_type,
                arg_types[ix - 1] = value_type (argvec[ix]);
 
              (void) find_overload_match (arg_types, nargs, tstr,
-                                    1 /* method */ , 0 /* strict match */ ,
+                                         METHOD /* method */ , 0 /* strict match */ ,
                                          &arg2 /* the object */ , NULL,
-                                         &valp, NULL, &static_memfuncp);
-
+                                         &valp, NULL, &static_memfuncp, 0);
 
+             if (op == OP_SCOPE && !static_memfuncp)
+               {
+                 /* For the time being, we don't handle this.  */
+                 error (_("Call to overloaded function %s requires "
+                          "`this' pointer"),
+                        function_name);
+               }
              argvec[1] = arg2; /* the ``this'' pointer */
              argvec[0] = valp; /* use the method found after overload resolution */
            }
@@ -1474,6 +1679,7 @@ evaluate_subexp_standard (struct type *expect_type,
            /* Non-C++ case -- or no overload resolution */
            {
              struct value *temp = arg2;
+
              argvec[0] = value_struct_elt (&temp, argvec + 1, tstr,
                                            &static_memfuncp,
                                            op == STRUCTOP_STRUCT
@@ -1499,7 +1705,7 @@ evaluate_subexp_standard (struct type *expect_type,
          argvec[1] = arg2;
          argvec[0] = arg1;
        }
-      else if (op == OP_VAR_VALUE)
+      else if (op == OP_VAR_VALUE || (op == OP_SCOPE && function != NULL))
        {
          /* Non-member function being called */
           /* fn: This can only be done for C++ functions.  A C-style function
@@ -1510,6 +1716,14 @@ evaluate_subexp_standard (struct type *expect_type,
            {
              /* Language is C++, do some overload resolution before evaluation */
              struct symbol *symp;
+             int no_adl = 0;
+
+             /* If a scope has been specified disable ADL.  */
+             if (op == OP_SCOPE)
+               no_adl = 1;
+
+             if (op == OP_VAR_VALUE)
+               function = exp->elts[save_pos1+2].symbol;
 
              /* Prepare list of argument types for overload resolution */
              arg_types = (struct type **) alloca (nargs * (sizeof (struct type *)));
@@ -1517,13 +1731,19 @@ evaluate_subexp_standard (struct type *expect_type,
                arg_types[ix - 1] = value_type (argvec[ix]);
 
              (void) find_overload_match (arg_types, nargs, NULL /* no need for name */ ,
-                                0 /* not method */ , 0 /* strict match */ ,
-                     NULL, exp->elts[save_pos1+2].symbol /* the function */ ,
-                                         NULL, &symp, NULL);
+                                         NON_METHOD /* not method */ , 0 /* strict match */ ,
+                                         NULL, function /* the function */ ,
+                                         NULL, &symp, NULL, no_adl);
 
-             /* Now fix the expression being evaluated */
-             exp->elts[save_pos1+2].symbol = symp;
-             argvec[0] = evaluate_subexp_with_coercion (exp, &save_pos1, noside);
+             if (op == OP_VAR_VALUE)
+               {
+                 /* Now fix the expression being evaluated */
+                 exp->elts[save_pos1+2].symbol = symp;
+                 argvec[0] = evaluate_subexp_with_coercion (exp, &save_pos1,
+                                                            noside);
+               }
+             else
+               argvec[0] = value_of_variable (symp, get_selected_block (0));
            }
          else
            {
@@ -1666,6 +1886,7 @@ evaluate_subexp_standard (struct type *expect_type,
       else
        {
          struct value *temp = arg1;
+
          return value_struct_elt (&temp, NULL, &exp->elts[pc + 2].string,
                                   NULL, "structure");
        }
@@ -1711,6 +1932,7 @@ evaluate_subexp_standard (struct type *expect_type,
       else
        {
          struct value *temp = arg1;
+
          return value_struct_elt (&temp, NULL, &exp->elts[pc + 2].string,
                                   NULL, "structure pointer");
        }
@@ -1799,10 +2021,12 @@ evaluate_subexp_standard (struct type *expect_type,
       op = exp->elts[pc + 1].opcode;
       if (binop_user_defined_p (op, arg1, arg2))
        return value_x_binop (arg1, arg2, BINOP_ASSIGN_MODIFY, op, noside);
-      else if (op == BINOP_ADD && ptrmath_type_p (value_type (arg1))
+      else if (op == BINOP_ADD && ptrmath_type_p (exp->language_defn,
+                                                 value_type (arg1))
               && is_integral_type (value_type (arg2)))
        arg2 = value_ptradd (arg1, value_as_long (arg2));
-      else if (op == BINOP_SUB && ptrmath_type_p (value_type (arg1))
+      else if (op == BINOP_SUB && ptrmath_type_p (exp->language_defn,
+                                                 value_type (arg1))
               && is_integral_type (value_type (arg2)))
        arg2 = value_ptradd (arg1, - value_as_long (arg2));
       else
@@ -1828,10 +2052,10 @@ evaluate_subexp_standard (struct type *expect_type,
        goto nosideret;
       if (binop_user_defined_p (op, arg1, arg2))
        return value_x_binop (arg1, arg2, op, OP_NULL, noside);
-      else if (ptrmath_type_p (value_type (arg1))
+      else if (ptrmath_type_p (exp->language_defn, value_type (arg1))
               && is_integral_type (value_type (arg2)))
        return value_ptradd (arg1, value_as_long (arg2));
-      else if (ptrmath_type_p (value_type (arg2))
+      else if (ptrmath_type_p (exp->language_defn, value_type (arg2))
               && is_integral_type (value_type (arg1)))
        return value_ptradd (arg2, value_as_long (arg1));
       else
@@ -1847,14 +2071,14 @@ evaluate_subexp_standard (struct type *expect_type,
        goto nosideret;
       if (binop_user_defined_p (op, arg1, arg2))
        return value_x_binop (arg1, arg2, op, OP_NULL, noside);
-      else if (ptrmath_type_p (value_type (arg1))
-              && ptrmath_type_p (value_type (arg2)))
+      else if (ptrmath_type_p (exp->language_defn, value_type (arg1))
+              && ptrmath_type_p (exp->language_defn, value_type (arg2)))
        {
          /* FIXME -- should be ptrdiff_t */
          type = builtin_type (exp->gdbarch)->builtin_long;
          return value_from_longest (type, value_ptrdiff (arg1, arg2));
        }
-      else if (ptrmath_type_p (value_type (arg1))
+      else if (ptrmath_type_p (exp->language_defn, value_type (arg1))
               && is_integral_type (value_type (arg2)))
        return value_ptradd (arg1, - value_as_long (arg2));
       else
@@ -1924,8 +2148,8 @@ evaluate_subexp_standard (struct type *expect_type,
       error (_("':' operator used in invalid context"));
 
     case BINOP_SUBSCRIPT:
-      arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
-      arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
+      arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
+      arg2 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
        goto nosideret;
       if (binop_user_defined_p (op, arg1, arg2))
@@ -2392,6 +2616,7 @@ evaluate_subexp_standard (struct type *expect_type,
       else
        {
          struct value *retvalp = evaluate_subexp_for_address (exp, pos, noside);
+
          return retvalp;
        }
 
@@ -2413,6 +2638,22 @@ evaluate_subexp_standard (struct type *expect_type,
        arg1 = value_cast (type, arg1);
       return arg1;
 
+    case UNOP_DYNAMIC_CAST:
+      (*pos) += 2;
+      type = exp->elts[pc + 1].type;
+      arg1 = evaluate_subexp (type, exp, pos, noside);
+      if (noside == EVAL_SKIP)
+       goto nosideret;
+      return value_dynamic_cast (type, arg1);
+
+    case UNOP_REINTERPRET_CAST:
+      (*pos) += 2;
+      type = exp->elts[pc + 1].type;
+      arg1 = evaluate_subexp (type, exp, pos, noside);
+      if (noside == EVAL_SKIP)
+       goto nosideret;
+      return value_reinterpret_cast (type, arg1);
+
     case UNOP_MEMVAL:
       (*pos) += 2;
       arg1 = evaluate_subexp (expect_type, exp, pos, noside);
@@ -2434,6 +2675,7 @@ evaluate_subexp_standard (struct type *expect_type,
       else
        {
          CORE_ADDR tls_addr;
+
          tls_addr = target_translate_tls_address (exp->elts[pc + 1].objfile,
                                                   value_as_address (arg1));
          return value_at_lazy (exp->elts[pc + 2].type, tls_addr);
@@ -2449,11 +2691,12 @@ evaluate_subexp_standard (struct type *expect_type,
        }
       else
        {
-         if (ptrmath_type_p (value_type (arg1)))
+         if (ptrmath_type_p (exp->language_defn, value_type (arg1)))
            arg2 = value_ptradd (arg1, 1);
          else
            {
              struct value *tmp = arg1;
+
              arg2 = value_one (value_type (arg1), not_lval);
              binop_promote (exp->language_defn, exp->gdbarch, &tmp, &arg2);
              arg2 = value_binop (tmp, arg2, BINOP_ADD);
@@ -2472,11 +2715,12 @@ evaluate_subexp_standard (struct type *expect_type,
        }
       else
        {
-         if (ptrmath_type_p (value_type (arg1)))
+         if (ptrmath_type_p (exp->language_defn, value_type (arg1)))
            arg2 = value_ptradd (arg1, -1);
          else
            {
              struct value *tmp = arg1;
+
              arg2 = value_one (value_type (arg1), not_lval);
              binop_promote (exp->language_defn, exp->gdbarch, &tmp, &arg2);
              arg2 = value_binop (tmp, arg2, BINOP_SUB);
@@ -2495,11 +2739,12 @@ evaluate_subexp_standard (struct type *expect_type,
        }
       else
        {
-         if (ptrmath_type_p (value_type (arg1)))
+         if (ptrmath_type_p (exp->language_defn, value_type (arg1)))
            arg2 = value_ptradd (arg1, 1);
          else
            {
              struct value *tmp = arg1;
+
              arg2 = value_one (value_type (arg1), not_lval);
              binop_promote (exp->language_defn, exp->gdbarch, &tmp, &arg2);
              arg2 = value_binop (tmp, arg2, BINOP_ADD);
@@ -2519,11 +2764,12 @@ evaluate_subexp_standard (struct type *expect_type,
        }
       else
        {
-         if (ptrmath_type_p (value_type (arg1)))
+         if (ptrmath_type_p (exp->language_defn, value_type (arg1)))
            arg2 = value_ptradd (arg1, -1);
          else
            {
              struct value *tmp = arg1;
+
              arg2 = value_one (value_type (arg1), not_lval);
              binop_promote (exp->language_defn, exp->gdbarch, &tmp, &arg2);
              arg2 = value_binop (tmp, arg2, BINOP_SUB);
@@ -2550,6 +2796,7 @@ evaluate_subexp_standard (struct type *expect_type,
       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
@@ -2613,7 +2860,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
          goto default_case_after_eval;
        }
 
-      return x;
+      return coerce_array (x);
 
     case UNOP_MEMVAL:
       (*pos) += 3;
@@ -2632,7 +2879,7 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
        {
          struct type *type =
-         lookup_pointer_type (SYMBOL_TYPE (var));
+           lookup_pointer_type (SYMBOL_TYPE (var));
          enum address_class sym_class = SYMBOL_CLASS (var);
 
          if (sym_class == LOC_CONST
@@ -2709,7 +2956,7 @@ evaluate_subexp_with_coercion (struct expression *exp,
       var = exp->elts[pc + 2].symbol;
       type = check_typedef (SYMBOL_TYPE (var));
       if (TYPE_CODE (type) == TYPE_CODE_ARRAY
-         && CAST_IS_CONVERSION)
+         && CAST_IS_CONVERSION (exp->language_defn))
        {
          (*pos) += 4;
          val = address_of_variable (var, exp->elts[pc + 1].block);
@@ -2782,6 +3029,7 @@ 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] = ')';
This page took 0.033001 seconds and 4 git commands to generate.