* eval.c (evaluate_subexp): Improve error messages for OP_TYPE and
authorJim Kingdon <jkingdon@engr.sgi.com>
Sat, 3 Jul 1993 00:27:47 +0000 (00:27 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Sat, 3 Jul 1993 00:27:47 +0000 (00:27 +0000)
default cases.

gdb/ChangeLog
gdb/eval.c

index 64c469bc7570f900bb077575ac3ed61f53770014..037b38bac9c37af6f568706aed0463e06bfb8010 100644 (file)
@@ -1,9 +1,10 @@
-<<<<<<< ChangeLog
 Fri Jul  2 18:22:54 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
 
+       * eval.c (evaluate_subexp): Improve error messages for OP_TYPE and
+       default cases.
+
        * Makefile.in (distclean): Remove y.tab.h.
 
-=======
 Fri Jul  2 14:55:48 1993  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
 
        * exec.c (exec_file_command):  Remove Mar 28 hack as BFD handles
@@ -18,7 +19,8 @@ Fri Jul  2 13:33:12 1993  Steve Chamberlain  (sac@phydeaux.cygnus.com)
        New target macros for getting at the pc, sp and fp.
        * infcmd.c (read_pc, write_pc):  Modify to use new macros.
        (read_sp, write_sp, read_fp, write_fp): New functions.
-       * blockframe.c (reinit_frame_cache, get_prev_frame_info):  Use new functions.
+       * blockframe.c (reinit_frame_cache, get_prev_frame_info):
+       Use new functions.
        * breakpoint.c (bpstat_alloc): ditto.
        * infrun.c (wait_for_inferior): ditto.
        * stack.c (print_frame_info): ditto.
@@ -31,7 +33,6 @@ Fri Jul  2 13:33:12 1993  Steve Chamberlain  (sac@phydeaux.cygnus.com)
        * config/alpha/xm-alpha.h: Add MAKEVA_END.
        * config/h8500/tm-h8500.h: Define new macros.
 
->>>>>>> 1.1453
 Fri Jul  2 13:51:04 1993  Ian Lance Taylor  (ian@cygnus.com)
 
        * configure.in (mipos-*-riscos*): New host and target; use riscos.
index 971ad9a32d4abcbe2deb45adad11bd22a2cd2da6..98774bfc419f2e6a54fb531f43b94ebb60ba6af9 100644 (file)
@@ -162,7 +162,7 @@ evaluate_subexp (expect_type, exp, pos, noside)
      enum noside noside;
 {
   enum exp_opcode op;
-  int tem;
+  int tem, tem2, tem3;
   register int pc, pc2, oldpos;
   register value arg1, arg2, arg3;
   struct type *type;
@@ -176,8 +176,7 @@ evaluate_subexp (expect_type, exp, pos, noside)
     {
     case OP_SCOPE:
       tem = longest_to_int (exp->elts[pc + 2].longconst);
-      (*pos) += 4 + ((tem + sizeof (union exp_element))
-                    / sizeof (union exp_element));
+      (*pos) += 4 + BYTES_TO_EXP_ELEM (tem + 1);
       arg1 = value_struct_elt_for_reference (exp->elts[pc + 1].type,
                                             0,
                                             exp->elts[pc + 1].type,
@@ -238,12 +237,10 @@ evaluate_subexp (expect_type, exp, pos, noside)
       (*pos) += 2;
       return value_of_register (longest_to_int (exp->elts[pc + 1].longconst));
 
-    /* start-sanitize-chill */
     case OP_BOOL:
       (*pos) += 2;
       return value_from_longest (builtin_type_chill_bool,
                                 exp->elts[pc + 1].longconst);
-    /* end-sanitize-chill */
 
     case OP_INTERNALVAR:
       (*pos) += 2;
@@ -251,12 +248,31 @@ evaluate_subexp (expect_type, exp, pos, noside)
 
     case OP_STRING:
       tem = longest_to_int (exp->elts[pc + 1].longconst);
-      (*pos) += 3 + ((tem + sizeof (union exp_element))
-                    / sizeof (union exp_element));
+      (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
       if (noside == EVAL_SKIP)
        goto nosideret;
       return value_string (&exp->elts[pc + 2].string, tem);
 
+    case OP_BITSTRING:
+      error ("support for OP_BITSTRING unimplemented");
+      break;
+
+    case OP_ARRAY:
+      (*pos) += 3;
+      tem2 = longest_to_int (exp->elts[pc + 1].longconst);
+      tem3 = longest_to_int (exp->elts[pc + 2].longconst);
+      nargs = tem3 - tem2 + 1;
+      argvec = (value *) alloca (sizeof (value) * nargs);
+      for (tem = 0; tem < nargs; tem++)
+       {
+         /* Ensure that array expressions are coerced into pointer objects. */
+         argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside);
+       }
+      if (noside == EVAL_SKIP)
+       goto nosideret;
+      return (value_array (tem2, tem3, argvec));
+      break;
+
     case TERNOP_COND:
       /* Skip third and second args to evaluate the first one.  */
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
@@ -351,7 +367,7 @@ evaluate_subexp (expect_type, exp, pos, noside)
          /* First, evaluate the structure into arg2 */
          pc2 = (*pos)++;
          tem2 = longest_to_int (exp->elts[pc2 + 1].longconst);
-         *pos += 3 + (tem2 + sizeof (union exp_element)) / sizeof (union exp_element);
+         *pos += 3 + BYTES_TO_EXP_ELEM (tem2 + 1);
          if (noside == EVAL_SKIP)
            goto nosideret;
 
@@ -371,6 +387,8 @@ evaluate_subexp (expect_type, exp, pos, noside)
          nargs = longest_to_int (exp->elts[pc + 1].longconst);
          tem = 0;
        }
+      /* Allocate arg vector, including space for the function to be
+        called in argvec[0] and a terminating NULL */
       argvec = (value *) alloca (sizeof (value) * (nargs + 2));
       for (; tem <= nargs; tem++)
        /* Ensure that array expressions are coerced into pointer objects. */
@@ -393,7 +411,7 @@ evaluate_subexp (expect_type, exp, pos, noside)
          if (VALUE_OFFSET (temp))
            {
              arg2 = value_from_longest (lookup_pointer_type (VALUE_TYPE (temp)),
-                                     value_as_long (arg2)+VALUE_OFFSET (temp));
+                                        VALUE_ADDRESS (temp)+VALUE_OFFSET (temp));
              argvec[1] = arg2;
            }
          if (static_memfuncp)
@@ -432,8 +450,7 @@ evaluate_subexp (expect_type, exp, pos, noside)
 
     case STRUCTOP_STRUCT:
       tem = longest_to_int (exp->elts[pc + 1].longconst);
-      (*pos) += 3 + ((tem + sizeof (union exp_element))
-                    / sizeof (union exp_element));
+      (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
        goto nosideret;
@@ -451,13 +468,12 @@ evaluate_subexp (expect_type, exp, pos, noside)
 
     case STRUCTOP_PTR:
       tem = longest_to_int (exp->elts[pc + 1].longconst);
-      (*pos) += 3 + (tem + sizeof (union exp_element)) / sizeof (union exp_element);
+      (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       if (noside == EVAL_SKIP)
        goto nosideret;
       if (noside == EVAL_AVOID_SIDE_EFFECTS)
-       return value_zero (lookup_struct_elt_type (TYPE_TARGET_TYPE
-                                                  (VALUE_TYPE (arg1)),
+       return value_zero (lookup_struct_elt_type (VALUE_TYPE (arg1),
                                                   &exp->elts[pc + 2].string,
                                                   0),
                           lval_memory);
@@ -493,6 +509,16 @@ evaluate_subexp (expect_type, exp, pos, noside)
     bad_pointer_to_member:
       error("non-pointer-to-member value used in pointer-to-member construct");
 
+    case BINOP_CONCAT:
+      arg1 = evaluate_subexp_with_coercion (exp, pos, noside);
+      arg2 = evaluate_subexp_with_coercion (exp, pos, noside);
+      if (noside == EVAL_SKIP)
+       goto nosideret;
+      if (binop_user_defined_p (op, arg1, arg2))
+       return value_x_binop (arg1, arg2, op, OP_NULL);
+      else
+       return value_concat (arg1, arg2);
+
     case BINOP_ASSIGN:
       arg1 = evaluate_subexp (NULL_TYPE, exp, pos, noside);
       arg2 = evaluate_subexp (VALUE_TYPE (arg1), exp, pos, noside);
@@ -860,7 +886,7 @@ evaluate_subexp (expect_type, exp, pos, noside)
          if (op == OP_SCOPE)
            {
              int temm = longest_to_int (exp->elts[pc+3].longconst);
-             (*pos) += 3 + (temm + sizeof (union exp_element)) / sizeof (union exp_element);
+             (*pos) += 3 + BYTES_TO_EXP_ELEM (temm + 1);
            }
          else
            evaluate_subexp (expect_type, exp, pos, EVAL_SKIP);
@@ -961,8 +987,22 @@ evaluate_subexp (expect_type, exp, pos, noside)
       (*pos) += 1;
       return value_of_this (1);
 
+    case OP_TYPE:
+      error ("Attempt to use a type name as an expression");
+
     default:
-      error ("internal error: I do not know how to evaluate what you gave me");
+      /* Removing this case and compiling with gcc -Wall reveals that
+        a lot of cases are hitting this case.  Some of these should
+        probably be removed from expression.h (e.g. do we need a BINOP_SCOPE
+        and an OP_SCOPE?); others are legitimate expressions which are
+        (apparently) not fully implemented.
+
+        If there are any cases landing here which mean a user error,
+        then they should be separate cases, with more descriptive
+        error messages.  */
+
+      error ("\
+GDB does not (yet) know how to evaluated that kind of expression");
     }
 
  nosideret: