* read.c (cons_worker): Detect and reject unexpected string argument.
[deliverable/binutils-gdb.git] / gdb / eval.c
index cfc42c1b0944265660643ee86b08c38459f0d9d4..fd132ea1443645e47b2a58494f5a5df5131e3285 100644 (file)
@@ -1,8 +1,8 @@
 /* Evaluate expressions for GDB.
 
    Copyright (C) 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
-   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008
-   Free Software Foundation, Inc.
+   1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2005, 2006, 2007, 2008,
+   2009, 2010 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "regcache.h"
 #include "user-regs.h"
 #include "valprint.h"
+#include "gdb_obstack.h"
+#include "objfiles.h"
+#include "python/python.h"
 
 #include "gdb_assert.h"
 
+#include <ctype.h>
+
 /* This is defined in valops.c */
 extern int overload_resolution;
 
@@ -53,9 +58,6 @@ static struct value *evaluate_subexp_for_sizeof (struct expression *, int *);
 static struct value *evaluate_subexp_for_address (struct expression *,
                                                  int *, enum noside);
 
-static struct value *evaluate_subexp (struct type *, struct expression *,
-                                     int *, enum noside);
-
 static char *get_label (struct expression *, int *);
 
 static struct value *evaluate_struct_tuple (struct value *,
@@ -66,7 +68,7 @@ static LONGEST init_array_element (struct value *, struct value *,
                                   struct expression *, int *, enum noside,
                                   LONGEST, LONGEST);
 
-static struct value *
+struct value *
 evaluate_subexp (struct type *expect_type, struct expression *exp,
                 int *pos, enum noside noside)
 {
@@ -354,8 +356,8 @@ evaluate_struct_tuple (struct value *struct_val,
            bitpos += TYPE_FIELD_BITPOS (substruct_type, subfieldno);
          addr = value_contents_writeable (struct_val) + bitpos / 8;
          if (bitsize)
-           modify_field (addr, value_as_long (val),
-                         bitpos % 8, bitsize);
+           modify_field (struct_type, addr,
+                         value_as_long (val), bitpos % 8, bitsize);
          else
            memcpy (addr, value_contents (val),
                    TYPE_LENGTH (value_type (val)));
@@ -413,7 +415,7 @@ init_array_element (struct value *array, struct value *element,
   return index;
 }
 
-struct value *
+static struct value *
 value_f90_subarray (struct value *array,
                    struct expression *exp, int *pos, enum noside noside)
 {
@@ -651,6 +653,29 @@ ptrmath_type_p (struct type *type)
     }
 }
 
+/* Constructs a fake method with the given parameter types.
+   This function is used by the parser to construct an "expected"
+   type for method overload resolution.  */
+
+static struct type *
+make_params (int num_types, struct type **param_types)
+{
+  struct type *type = XZALLOC (struct type);
+  TYPE_MAIN_TYPE (type) = XZALLOC (struct main_type);
+  TYPE_LENGTH (type) = 1;
+  TYPE_CODE (type) = TYPE_CODE_METHOD;
+  TYPE_VPTR_FIELDNO (type) = -1;
+  TYPE_CHAIN (type) = type;
+  TYPE_NFIELDS (type) = num_types;
+  TYPE_FIELDS (type) = (struct field *)
+    TYPE_ZALLOC (type, sizeof (struct field) * num_types);
+
+  while (num_types-- > 0)
+    TYPE_FIELD_TYPE (type, num_types) = param_types[num_types];
+
+  return type;
+}
+
 struct value *
 evaluate_subexp_standard (struct type *expect_type,
                          struct expression *exp, int *pos,
@@ -671,6 +696,8 @@ evaluate_subexp_standard (struct type *expect_type,
   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;
@@ -684,7 +711,7 @@ evaluate_subexp_standard (struct type *expect_type,
        goto nosideret;
       arg1 = value_aggregate_elt (exp->elts[pc + 1].type,
                                  &exp->elts[pc + 3].string,
-                                 0, noside);
+                                 expect_type, 0, noside);
       if (arg1 == NULL)
        error (_("There is no field named %s"), &exp->elts[pc + 3].string);
       return arg1;
@@ -751,7 +778,7 @@ evaluate_subexp_standard (struct type *expect_type,
        struct value *val;
 
        (*pos) += 3 + BYTES_TO_EXP_ELEM (exp->elts[pc + 1].longconst + 1);
-       regno = user_reg_map_name_to_regnum (current_gdbarch,
+       regno = user_reg_map_name_to_regnum (exp->gdbarch,
                                             name, strlen (name));
        if (regno == -1)
          error (_("Register $%s not available."), name);
@@ -762,9 +789,9 @@ evaluate_subexp_standard (struct type *expect_type,
            So for these registers, we fetch the register value regardless
            of the evaluation mode.  */
        if (noside == EVAL_AVOID_SIDE_EFFECTS
-           && regno < gdbarch_num_regs (current_gdbarch)
-              + gdbarch_num_pseudo_regs (current_gdbarch))
-         val = value_zero (register_type (current_gdbarch, regno), not_lval);
+           && regno < gdbarch_num_regs (exp->gdbarch)
+                       + gdbarch_num_pseudo_regs (exp->gdbarch))
+         val = value_zero (register_type (exp->gdbarch, regno), not_lval);
        else
          val = value_of_register (regno, get_selected_frame (NULL));
        if (val == NULL)
@@ -779,14 +806,16 @@ evaluate_subexp_standard (struct type *expect_type,
 
     case OP_INTERNALVAR:
       (*pos) += 2;
-      return value_of_internalvar (exp->elts[pc + 1].internalvar);
+      return value_of_internalvar (exp->gdbarch,
+                                  exp->elts[pc + 1].internalvar);
 
     case OP_STRING:
       tem = longest_to_int (exp->elts[pc + 1].longconst);
       (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
       if (noside == EVAL_SKIP)
        goto nosideret;
-      return value_string (&exp->elts[pc + 2].string, tem);
+      type = language_string_char_type (exp->language_defn, exp->gdbarch);
+      return value_string (&exp->elts[pc + 2].string, tem, type);
 
     case OP_OBJC_NSSTRING:             /* Objective C Foundation Class NSString constant.  */
       tem = longest_to_int (exp->elts[pc + 1].longconst);
@@ -795,7 +824,7 @@ evaluate_subexp_standard (struct type *expect_type,
        {
          goto nosideret;
        }
-      return (struct value *) value_nsstring (&exp->elts[pc + 2].string, tem + 1);
+      return value_nsstring (exp->gdbarch, &exp->elts[pc + 2].string, tem + 1);
 
     case OP_BITSTRING:
       tem = longest_to_int (exp->elts[pc + 1].longconst);
@@ -803,7 +832,8 @@ evaluate_subexp_standard (struct type *expect_type,
        += 3 + BYTES_TO_EXP_ELEM ((tem + HOST_CHAR_BIT - 1) / HOST_CHAR_BIT);
       if (noside == EVAL_SKIP)
        goto nosideret;
-      return value_bitstring (&exp->elts[pc + 2].string, tem);
+      return value_bitstring (&exp->elts[pc + 2].string, tem,
+                             builtin_type (exp->gdbarch)->builtin_int);
       break;
 
     case OP_ARRAY:
@@ -881,8 +911,8 @@ evaluate_subexp_standard (struct type *expect_type,
          LONGEST low_bound, high_bound;
 
          /* get targettype of elementtype */
-         while (TYPE_CODE (check_type) == TYPE_CODE_RANGE ||
-                TYPE_CODE (check_type) == TYPE_CODE_TYPEDEF)
+         while (TYPE_CODE (check_type) == TYPE_CODE_RANGE
+                || TYPE_CODE (check_type) == TYPE_CODE_TYPEDEF)
            check_type = TYPE_TARGET_TYPE (check_type);
 
          if (get_discrete_bounds (element_type, &low_bound, &high_bound) < 0)
@@ -916,14 +946,14 @@ evaluate_subexp_standard (struct type *expect_type,
                range_low_type = TYPE_TARGET_TYPE (range_low_type);
              if (TYPE_CODE (range_high_type) == TYPE_CODE_RANGE)
                range_high_type = TYPE_TARGET_TYPE (range_high_type);
-             if ((TYPE_CODE (range_low_type) != TYPE_CODE (range_high_type)) ||
-                 (TYPE_CODE (range_low_type) == TYPE_CODE_ENUM &&
-                  (range_low_type != range_high_type)))
+             if ((TYPE_CODE (range_low_type) != TYPE_CODE (range_high_type))
+                 || (TYPE_CODE (range_low_type) == TYPE_CODE_ENUM
+                     && (range_low_type != range_high_type)))
                /* different element modes */
                error (_("POWERSET tuple elements of different mode"));
-             if ((TYPE_CODE (check_type) != TYPE_CODE (range_low_type)) ||
-                 (TYPE_CODE (check_type) == TYPE_CODE_ENUM &&
-                  range_low_type != check_type))
+             if ((TYPE_CODE (check_type) != TYPE_CODE (range_low_type))
+                 || (TYPE_CODE (check_type) == TYPE_CODE_ENUM
+                     && range_low_type != check_type))
                error (_("incompatible POWERSET tuple elements"));
              if (range_low > range_high)
                {
@@ -937,7 +967,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 (current_gdbarch))
+                 if (gdbarch_bits_big_endian (exp->gdbarch))
                    bit_index = TARGET_CHAR_BIT - 1 - bit_index;
                  valaddr[(unsigned) range_low / TARGET_CHAR_BIT]
                    |= 1 << bit_index;
@@ -1007,23 +1037,24 @@ evaluate_subexp_standard (struct type *expect_type,
          sel[len] = 0;         /* Make sure it's terminated.  */
 
        selector_type = builtin_type (exp->gdbarch)->builtin_data_ptr;
-       return value_from_longest (selector_type, lookup_child_selector (sel));
+       return value_from_longest (selector_type,
+                                  lookup_child_selector (exp->gdbarch, sel));
       }
 
     case OP_OBJC_MSGCALL:
       {                                /* Objective C message (method) call.  */
 
-       static CORE_ADDR responds_selector = 0;
-       static CORE_ADDR method_selector = 0;
+       CORE_ADDR responds_selector = 0;
+       CORE_ADDR method_selector = 0;
 
        CORE_ADDR selector = 0;
 
        int struct_return = 0;
        int sub_no_side = 0;
 
-       static struct value *msg_send = NULL;
-       static struct value *msg_send_stret = NULL;
-       static int gnu_runtime = 0;
+       struct value *msg_send = NULL;
+       struct value *msg_send_stret = NULL;
+       int gnu_runtime = 0;
 
        struct value *target = NULL;
        struct value *method = NULL;
@@ -1095,16 +1126,20 @@ evaluate_subexp_standard (struct type *expect_type,
           the verification method than the non-standard, but more
           often used, 'NSObject' class. Make sure we check for both. */
 
-       responds_selector = lookup_child_selector ("respondsToSelector:");
+       responds_selector
+         = lookup_child_selector (exp->gdbarch, "respondsToSelector:");
        if (responds_selector == 0)
-         responds_selector = lookup_child_selector ("respondsTo:");
+         responds_selector
+           = lookup_child_selector (exp->gdbarch, "respondsTo:");
        
        if (responds_selector == 0)
          error (_("no 'respondsTo:' or 'respondsToSelector:' method"));
        
-       method_selector = lookup_child_selector ("methodForSelector:");
+       method_selector
+         = lookup_child_selector (exp->gdbarch, "methodForSelector:");
        if (method_selector == 0)
-         method_selector = lookup_child_selector ("methodFor:");
+         method_selector
+           = lookup_child_selector (exp->gdbarch, "methodFor:");
        
        if (method_selector == 0)
          error (_("no 'methodFor:' or 'methodForSelector:' method"));
@@ -1153,8 +1188,13 @@ evaluate_subexp_standard (struct type *expect_type,
        if (addr)
          {
            struct symbol *sym = NULL;
-           /* Is it a high_level symbol?  */
 
+           /* The address might point to a function descriptor;
+              resolve it to the actual code address instead.  */
+           addr = gdbarch_convert_from_func_ptr_addr (exp->gdbarch, addr,
+                                                      &current_target);
+
+           /* Is it a high_level symbol?  */
            sym = find_pc_function (addr);
            if (sym != NULL) 
              method = value_of_variable (sym, 0);
@@ -1182,11 +1222,12 @@ evaluate_subexp_standard (struct type *expect_type,
                  val_type = expect_type;
              }
 
-           struct_return = using_struct_return (value_type (method), val_type);
+           struct_return = using_struct_return (exp->gdbarch,
+                                                value_type (method), val_type);
          }
        else if (expect_type != NULL)
          {
-           struct_return = using_struct_return (NULL,
+           struct_return = using_struct_return (exp->gdbarch, NULL,
                                                 check_typedef (expect_type));
          }
        
@@ -1207,11 +1248,20 @@ evaluate_subexp_standard (struct type *expect_type,
          {
            if (TYPE_CODE (value_type (method)) != TYPE_CODE_FUNC)
              error (_("method address has symbol information with non-function type; skipping"));
+
+           /* Create a function pointer of the appropriate type, and replace
+              its value with the value of msg_send or msg_send_stret.  We must
+              use a pointer here, as msg_send and msg_send_stret are of pointer
+              type, and the representation may be different on systems that use
+              function descriptors.  */
            if (struct_return)
-             VALUE_ADDRESS (method) = value_as_address (msg_send_stret);
+             called_method
+               = value_from_pointer (lookup_pointer_type (value_type (method)),
+                                     value_as_address (msg_send_stret));
            else
-             VALUE_ADDRESS (method) = value_as_address (msg_send);
-           called_method = method;
+             called_method
+               = value_from_pointer (lookup_pointer_type (value_type (method)),
+                                     value_as_address (msg_send));
          }
        else
          {
@@ -1266,7 +1316,7 @@ evaluate_subexp_standard (struct type *expect_type,
          {
            /* Function objc_msg_lookup returns a pointer.  */
            deprecated_set_value_type (argvec[0],
-                                      lookup_function_type (lookup_pointer_type (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);
          }
 
@@ -1362,6 +1412,47 @@ 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.  */
+         struct type *qual_type;
+         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
        {
          /* Non-method function call */
@@ -1393,15 +1484,22 @@ evaluate_subexp_standard (struct type *expect_type,
       /* signal end of arglist */
       argvec[tem] = 0;
 
-      if (op == STRUCTOP_STRUCT || op == STRUCTOP_PTR)
+      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))
            {
@@ -1418,7 +1516,13 @@ evaluate_subexp_standard (struct type *expect_type,
                                          &arg2 /* the object */ , NULL,
                                          &valp, NULL, &static_memfuncp);
 
-
+             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 */
            }
@@ -1434,7 +1538,7 @@ evaluate_subexp_standard (struct type *expect_type,
                 of the ``this'' pointer if necessary, so modify argvec[1] to
                 reflect any ``this'' changes.  */
              arg2 = value_from_longest (lookup_pointer_type(value_type (temp)),
-                                        VALUE_ADDRESS (temp) + value_offset (temp)
+                                        value_address (temp)
                                         + value_embedded_offset (temp));
              argvec[1] = arg2; /* the ``this'' pointer */
            }
@@ -1451,7 +1555,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
@@ -1463,6 +1567,9 @@ evaluate_subexp_standard (struct type *expect_type,
              /* Language is C++, do some overload resolution before evaluation */
              struct symbol *symp;
 
+             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 *)));
              for (ix = 1; ix <= nargs; ix++)
@@ -1470,12 +1577,18 @@ evaluate_subexp_standard (struct type *expect_type,
 
              (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, function /* the function */ ,
                                          NULL, &symp, NULL);
 
-             /* 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
            {
@@ -1504,14 +1617,25 @@ evaluate_subexp_standard (struct type *expect_type,
             gdb isn't asked for it's opinion (ie. through "whatis"),
             it won't offer it. */
 
-         struct type *ftype =
-         TYPE_TARGET_TYPE (value_type (argvec[0]));
+         struct type *ftype = value_type (argvec[0]);
 
-         if (ftype)
-           return allocate_value (TYPE_TARGET_TYPE (value_type (argvec[0])));
+         if (TYPE_CODE (ftype) == TYPE_CODE_INTERNAL_FUNCTION)
+           {
+             /* We don't know anything about what the internal
+                function might return, but we have to return
+                something.  */
+             return value_zero (builtin_type (exp->gdbarch)->builtin_int,
+                                not_lval);
+           }
+         else if (TYPE_TARGET_TYPE (ftype))
+           return allocate_value (TYPE_TARGET_TYPE (ftype));
          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);
       /* pai: FIXME save value from call_function_by_hand, then adjust pc by adjust_fn_pc if +ve  */
 
@@ -1564,7 +1688,7 @@ evaluate_subexp_standard (struct type *expect_type,
          else
            {
              arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
-             return value_subscript (arg1, arg2);
+             return value_subscript (arg1, value_as_long (arg2));
            }
 
        case TYPE_CODE_PTR:
@@ -1628,8 +1752,8 @@ evaluate_subexp_standard (struct type *expect_type,
        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))
+        if (opts.objectprint && TYPE_TARGET_TYPE(type)
+            && (TYPE_CODE (TYPE_TARGET_TYPE (type)) == TYPE_CODE_CLASS))
           {
             real_type = value_rtti_target_type (arg1, &full, &top, &using_enc);
             if (real_type)
@@ -1696,6 +1820,20 @@ evaluate_subexp_standard (struct type *expect_type,
          error (_("non-pointer-to-member value used in pointer-to-member construct"));
        }
 
+    case TYPE_INSTANCE:
+      nargs = longest_to_int (exp->elts[pc + 1].longconst);
+      arg_types = (struct type **) alloca (nargs * sizeof (struct type *));
+      for (ix = 0; ix < nargs; ++ix)
+       arg_types[ix] = exp->elts[pc + 1 + ix + 1].type;
+
+      expect_type = make_params (nargs, arg_types);
+      *(pos) += 3 + nargs;
+      arg1 = evaluate_subexp_standard (expect_type, exp, pos, noside);
+      xfree (TYPE_FIELDS (expect_type));
+      xfree (TYPE_MAIN_TYPE (expect_type));
+      xfree (expect_type);
+      return arg1;
+
     case BINOP_CONCAT:
       arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
       arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
@@ -1726,10 +1864,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)))
-       arg2 = value_ptradd (arg1, arg2);
-      else if (op == BINOP_SUB && ptrmath_type_p (value_type (arg1)))
-       arg2 = value_ptrsub (arg1, arg2);
+      else if (op == BINOP_ADD && ptrmath_type_p (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))
+              && is_integral_type (value_type (arg2)))
+       arg2 = value_ptradd (arg1, - value_as_long (arg2));
       else
        {
          struct value *tmp = arg1;
@@ -1753,10 +1893,12 @@ 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)))
-       return value_ptradd (arg1, arg2);
-      else if (ptrmath_type_p (value_type (arg2)))
-       return value_ptradd (arg2, arg1);
+      else if (ptrmath_type_p (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))
+              && is_integral_type (value_type (arg1)))
+       return value_ptradd (arg2, value_as_long (arg1));
       else
        {
          binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2);
@@ -1770,17 +1912,16 @@ 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 (value_type (arg1))
+              && ptrmath_type_p (value_type (arg2)))
        {
-         if (ptrmath_type_p (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
-           return value_ptrsub (arg1, 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))
+              && is_integral_type (value_type (arg2)))
+       return value_ptradd (arg1, - value_as_long (arg2));
       else
        {
          binop_promote (exp->language_defn, exp->gdbarch, &arg1, &arg2);
@@ -1875,7 +2016,7 @@ evaluate_subexp_standard (struct type *expect_type,
          if (noside == EVAL_AVOID_SIDE_EFFECTS)
            return value_zero (TYPE_TARGET_TYPE (type), VALUE_LVAL (arg1));
          else
-           return value_subscript (arg1, arg2);
+           return value_subscript (arg1, value_as_long (arg2));
        }
 
     case BINOP_IN:
@@ -1940,12 +2081,13 @@ evaluate_subexp_standard (struct type *expect_type,
                case TYPE_CODE_PTR:
                case TYPE_CODE_ARRAY:
                case TYPE_CODE_STRING:
-                 arg1 = value_subscript (arg1, arg2);
+                 arg1 = value_subscript (arg1, value_as_long (arg2));
                  break;
 
                case TYPE_CODE_BITSTRING:
                  type = language_bool_type (exp->language_defn, exp->gdbarch);
-                 arg1 = value_bitstring_subscript (type, arg1, arg2);
+                 arg1 = value_bitstring_subscript (type, arg1,
+                                                   value_as_long (arg2));
                  break;
 
                default:
@@ -2025,10 +2167,6 @@ evaluate_subexp_standard (struct type *expect_type,
          offset_item =
            array_size_array[i - 1] * offset_item + subscript_array[i - 1];
 
-       /* Construct a value node with the value of the offset */
-
-       arg2 = value_from_longest (builtin_type_int32, offset_item);
-
        /* Let us now play a dirty trick: we will take arg1 
           which is a value node pointing to the topmost level
           of the multidimensional array-set and pretend
@@ -2037,7 +2175,7 @@ evaluate_subexp_standard (struct type *expect_type,
           returns the correct type value */
 
        deprecated_set_value_type (arg1, tmp_type);
-       return value_subscripted_rvalue (arg1, arg2, 0);
+       return value_subscripted_rvalue (arg1, offset_item, 0);
       }
 
     case BINOP_LOGICAL_AND:
@@ -2340,6 +2478,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);
@@ -2376,12 +2530,12 @@ evaluate_subexp_standard (struct type *expect_type,
        }
       else
        {
-         arg2 = value_from_longest (builtin_type_uint8, (LONGEST) 1);
          if (ptrmath_type_p (value_type (arg1)))
-           arg2 = value_ptradd (arg1, arg2);
+           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);
            }
@@ -2399,12 +2553,12 @@ evaluate_subexp_standard (struct type *expect_type,
        }
       else
        {
-         arg2 = value_from_longest (builtin_type_uint8, (LONGEST) 1);
          if (ptrmath_type_p (value_type (arg1)))
-           arg2 = value_ptrsub (arg1, arg2);
+           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);
            }
@@ -2422,12 +2576,12 @@ evaluate_subexp_standard (struct type *expect_type,
        }
       else
        {
-         arg2 = value_from_longest (builtin_type_uint8, (LONGEST) 1);
          if (ptrmath_type_p (value_type (arg1)))
-           arg2 = value_ptradd (arg1, arg2);
+           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);
            }
@@ -2446,12 +2600,12 @@ evaluate_subexp_standard (struct type *expect_type,
        }
       else
        {
-         arg2 = value_from_longest (builtin_type_uint8, (LONGEST) 1);
          if (ptrmath_type_p (value_type (arg1)))
-           arg2 = value_ptrsub (arg1, arg2);
+           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);
            }
@@ -2475,7 +2629,17 @@ evaluate_subexp_standard (struct type *expect_type,
       if (noside == EVAL_SKIP)
         goto nosideret;
       else if (noside == EVAL_AVOID_SIDE_EFFECTS)
-        return allocate_value (exp->elts[pc + 1].type);
+       {
+         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);
+       }
       else
         error (_("Attempt to use a type name as an expression"));
 
@@ -2494,7 +2658,7 @@ GDB does not (yet) know how to evaluate that kind of expression"));
     }
 
 nosideret:
-  return value_from_longest (builtin_type_int8, (LONGEST) 1);
+  return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1);
 }
 \f
 /* Evaluate a subexpression of EXP, at index *POS,
@@ -2530,7 +2694,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;
@@ -2560,20 +2724,15 @@ evaluate_subexp_for_address (struct expression *exp, int *pos,
          return
            value_zero (type, not_lval);
        }
-      else if (symbol_read_needs_frame (var))
-       return
-         locate_var_value
-         (var,
-          block_innermost_frame (exp->elts[pc + 1].block));
       else
-       return locate_var_value (var, NULL);
+       return address_of_variable (var, exp->elts[pc + 1].block);
 
     case OP_SCOPE:
       tem = longest_to_int (exp->elts[pc + 2].longconst);
       (*pos) += 5 + BYTES_TO_EXP_ELEM (tem + 1);
       x = value_aggregate_elt (exp->elts[pc + 1].type,
                               &exp->elts[pc + 3].string,
-                              1, noside);
+                              NULL, 1, noside);
       if (x == NULL)
        error (_("There is no field named %s"), &exp->elts[pc + 3].string);
       return x;
@@ -2620,6 +2779,7 @@ evaluate_subexp_with_coercion (struct expression *exp,
   int pc;
   struct value *val;
   struct symbol *var;
+  struct type *type;
 
   pc = (*pos);
   op = exp->elts[pc].opcode;
@@ -2628,14 +2788,13 @@ evaluate_subexp_with_coercion (struct expression *exp,
     {
     case OP_VAR_VALUE:
       var = exp->elts[pc + 2].symbol;
-      if (TYPE_CODE (check_typedef (SYMBOL_TYPE (var))) == TYPE_CODE_ARRAY
+      type = check_typedef (SYMBOL_TYPE (var));
+      if (TYPE_CODE (type) == TYPE_CODE_ARRAY
          && CAST_IS_CONVERSION)
        {
          (*pos) += 4;
-         val =
-           locate_var_value
-           (var, block_innermost_frame (exp->elts[pc + 1].block));
-         return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (check_typedef (SYMBOL_TYPE (var)))),
+         val = address_of_variable (var, exp->elts[pc + 1].block);
+         return value_cast (lookup_pointer_type (TYPE_TARGET_TYPE (type)),
                             val);
        }
       /* FALLTHROUGH */
This page took 0.034663 seconds and 4 git commands to generate.