Fix PR 19494: hang when killing unfollowed fork children
[deliverable/binutils-gdb.git] / gdb / eval.c
index 9804a977f7bc0c48818bd662510d1361f2d8c750..78ad946391ce20941fc4c9b1cbacb0536cc07ff6 100644 (file)
@@ -1,6 +1,6 @@
 /* Evaluate expressions for GDB.
 
-   Copyright (C) 1986-2015 Free Software Foundation, Inc.
+   Copyright (C) 1986-2016 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -406,7 +406,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 f90_range_type range_type
+    = (enum f90_range_type) longest_to_int (exp->elts[pc].longconst);
  
   *pos += 3;
 
@@ -997,7 +998,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
@@ -1063,7 +1064,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;
@@ -1081,8 +1082,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;
 
@@ -1226,7 +1226,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))
@@ -1492,7 +1492,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));
@@ -1742,6 +1742,15 @@ evaluate_subexp_standard (struct type *expect_type,
              return value_zero (builtin_type (exp->gdbarch)->builtin_int,
                                 not_lval);
            }
+         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_GNU_IFUNC (ftype))
            return allocate_value (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (ftype)));
          else if (TYPE_TARGET_TYPE (ftype))
@@ -1853,7 +1862,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:
@@ -3080,7 +3089,7 @@ 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 = check_typedef (TYPE_TARGET_TYPE (type));
This page took 0.02894 seconds and 4 git commands to generate.