* stabsread.c (get_substring): Declare second arg as int.
[deliverable/binutils-gdb.git] / gdb / eval.c
index b45c3c880cd0ad50b3978be1da1b51d4e349bf29..bcece9d487cd0cd806447b166bf4da47dc58ca42 100644 (file)
@@ -283,7 +283,7 @@ evaluate_struct_tuple (struct_val, exp, pos, noside, nargs)
 
          field_type = TYPE_FIELD_TYPE (substruct_type, subfieldno);
          if (val == 0)
-           val = evaluate_subexp (substruct_type, exp, pos, noside);
+           val = evaluate_subexp (field_type, exp, pos, noside);
 
          /* Now actually set the field in struct_val. */
 
@@ -335,7 +335,6 @@ init_array_element (array, element, exp, pos, noside, low_bound, high_bound)
   else if (exp->elts[*pos].opcode == BINOP_RANGE)
     {
       LONGEST low, high;
-      value_ptr val;
       (*pos)++;
       low = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
       high = value_as_long (evaluate_subexp (NULL_TYPE, exp, pos, noside));
@@ -460,11 +459,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
 
     case OP_BOOL:
       (*pos) += 2;
-      if (current_language->la_language == language_fortran)
-       return value_from_longest (builtin_type_f_logical_s2,
-                                  exp->elts[pc + 1].longconst);
-      else
-       return value_from_longest (builtin_type_chill_bool,
+      return value_from_longest (LA_BOOL_TYPE,
                                   exp->elts[pc + 1].longconst);
 
     case OP_INTERNALVAR:
@@ -555,27 +550,54 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
          value_ptr set = allocate_value (expect_type);
          char *valaddr = VALUE_CONTENTS_RAW (set);
          struct type *element_type = TYPE_INDEX_TYPE (type);
+         struct type *check_type = element_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)
+           check_type = TYPE_TARGET_TYPE (check_type);
+
          if (get_discrete_bounds (element_type, &low_bound, &high_bound) < 0)
            error ("(power)set type with unknown size");
          memset (valaddr, '\0', TYPE_LENGTH (type));
          for (tem = 0; tem < nargs; tem++)
            {
              LONGEST range_low, range_high;
+             struct type *range_low_type, *range_high_type;
              value_ptr 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);
                }
+             /* 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 */
+             if (TYPE_CODE (range_low_type) == TYPE_CODE_RANGE)
+               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)))
+               /* 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))
+               error ("incompatible POWERSET tuple elements");
              if (range_low > range_high)
                {
                  warning ("empty POWERSET tuple range");
@@ -647,11 +669,15 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
     case OP_FUNCALL:
       (*pos) += 2;
       op = exp->elts[*pos].opcode;
+      nargs = longest_to_int (exp->elts[pc + 1].longconst);
+      /* Allocate arg vector, including space for the function to be
+        called in argvec[0] and a terminating NULL */
+      argvec = (value_ptr *) alloca (sizeof (value_ptr) * (nargs + 3));
       if (op == STRUCTOP_MEMBER || op == STRUCTOP_MPTR)
        {
          LONGEST fnptr;
 
-         nargs = longest_to_int (exp->elts[pc + 1].longconst) + 1;
+         nargs++;
          /* First, evaluate the structure into arg2 */
          pc2 = (*pos)++;
 
@@ -694,7 +720,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
                  /* If one is virtual, then all are virtual.  */
                  if (TYPE_FN_FIELD_VIRTUAL_P (f, 0))
                    for (j = TYPE_FN_FIELDLIST_LENGTH (basetype, i) - 1; j >= 0; --j)
-                     if (TYPE_FN_FIELD_VOFFSET (f, j) == fnoffset)
+                     if ((int) TYPE_FN_FIELD_VOFFSET (f, j) == fnoffset)
                        {
                          value_ptr temp = value_ind (arg2);
                          arg1 = value_virtual_fn_field (&temp, f, j, domain_type, 0);
@@ -719,7 +745,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
          /* Hair for method invocations */
          int tem2;
 
-         nargs = longest_to_int (exp->elts[pc + 1].longconst) + 1;
+         nargs++;
          /* First, evaluate the structure into arg2 */
          pc2 = (*pos)++;
          tem2 = longest_to_int (exp->elts[pc2 + 1].longconst);
@@ -754,15 +780,27 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
        }
       else
        {
-         nargs = longest_to_int (exp->elts[pc + 1].longconst);
-         tem = 0;
+         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)
+           {
+             for (; tem <= nargs && tem <= TYPE_NFIELDS (type); tem++)
+               {
+                 argvec[tem] = evaluate_subexp (TYPE_FIELD_TYPE (type, tem-1),
+                                                exp, pos, noside);
+               }
+           }
        }
-      /* Allocate arg vector, including space for the function to be
-        called in argvec[0] and a terminating NULL */
-      argvec = (value_ptr *) alloca (sizeof (value_ptr) * (nargs + 2));
+
       for (; tem <= nargs; tem++)
-       /* Ensure that array expressions are coerced into pointer objects. */
-       argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside);
+       {
+         /* Ensure that array expressions are coerced into pointer objects. */
+         
+         argvec[tem] = evaluate_subexp_with_coercion (exp, pos, noside);
+       }
 
       /* signal end of arglist */
       argvec[tem] = 0;
@@ -884,7 +922,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
         goto nosideret;
       
       tem2 = value_as_long (arg2);
-      tem2 = value_as_long (arg3);
+      tem3 = value_as_long (arg3);
       
       return value_slice (arg1, tem2, tem3 - tem2 + 1);
 
@@ -1258,7 +1296,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
          tem = value_logical_not (arg1);
          arg2 = evaluate_subexp (NULL_TYPE, exp, pos,
                                  (tem ? EVAL_SKIP : noside));
-         return value_from_longest (builtin_type_int,
+         return value_from_longest (LA_BOOL_TYPE,
                                  (LONGEST) (!tem && !value_logical_not (arg2)));
        }
 
@@ -1284,7 +1322,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
          tem = value_logical_not (arg1);
          arg2 = evaluate_subexp (NULL_TYPE, exp, pos,
                                  (!tem ? EVAL_SKIP : noside));
-         return value_from_longest (builtin_type_int,
+         return value_from_longest (LA_BOOL_TYPE,
                                  (LONGEST) (!tem || !value_logical_not (arg2)));
        }
 
@@ -1300,7 +1338,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
       else
        {
          tem = value_equal (arg1, arg2);
-         return value_from_longest (builtin_type_int, (LONGEST) tem);
+         return value_from_longest (LA_BOOL_TYPE, (LONGEST) tem);
        }
 
     case BINOP_NOTEQUAL:
@@ -1315,7 +1353,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
       else
        {
          tem = value_equal (arg1, arg2);
-         return value_from_longest (builtin_type_int, (LONGEST) ! tem);
+         return value_from_longest (LA_BOOL_TYPE, (LONGEST) ! tem);
        }
 
     case BINOP_LESS:
@@ -1330,7 +1368,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
       else
        {
          tem = value_less (arg1, arg2);
-         return value_from_longest (builtin_type_int, (LONGEST) tem);
+         return value_from_longest (LA_BOOL_TYPE, (LONGEST) tem);
        }
 
     case BINOP_GTR:
@@ -1345,7 +1383,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
       else
        {
          tem = value_less (arg2, arg1);
-         return value_from_longest (builtin_type_int, (LONGEST) tem);
+         return value_from_longest (LA_BOOL_TYPE, (LONGEST) tem);
        }
 
     case BINOP_GEQ:
@@ -1360,7 +1398,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
       else
        {
          tem = value_less (arg2, arg1) || value_equal (arg1, arg2);
-         return value_from_longest (builtin_type_int, (LONGEST) tem);
+         return value_from_longest (LA_BOOL_TYPE, (LONGEST) tem);
        }
 
     case BINOP_LEQ:
@@ -1375,7 +1413,7 @@ evaluate_subexp_standard (expect_type, exp, pos, noside)
       else 
        {
          tem = value_less (arg1, arg2) || value_equal (arg1, arg2);
-         return value_from_longest (builtin_type_int, (LONGEST) tem);
+         return value_from_longest (LA_BOOL_TYPE, (LONGEST) tem);
        }
 
     case BINOP_REPEAT:
This page took 0.036741 seconds and 4 git commands to generate.