* valops.c (value_struct_elt_for_reference): Work around macro
authorJeff Law <law@redhat.com>
Fri, 3 Mar 1995 22:15:23 +0000 (22:15 +0000)
committerJeff Law <law@redhat.com>
Fri, 3 Mar 1995 22:15:23 +0000 (22:15 +0000)
bugs in HP's compilers.
* c-exp.y (block): Likewise.

gdb/ChangeLog
gdb/c-exp.y
gdb/valops.c

index 398a985b7b326a6a9dcd5e582d3cdde403f564e0..f7ec8a6eabb2e23d2c098f938d7c256e7a83c2a1 100644 (file)
@@ -1,3 +1,9 @@
+Fri Mar  3 15:12:12 1995  Jeff Law  (law@snake.cs.utah.edu)
+
+       * valops.c (value_struct_elt_for_reference): Work around macro
+       bugs in HP's compilers.
+       * c-exp.y (block): Likewise.
+
 Fri Mar  3 12:27:28 1995  Jim Kingdon  <kingdon@deneb.cygnus.com>
 
        * rs6000-tdep.c (push_dummy_frame): Fix order of arguments to
index 77816afb81ffb2cdfef502a46dff68e3a286b2a5..f31dc0759c8775139ab859ccd1454001770d8f7a 100644 (file)
@@ -548,8 +548,7 @@ block       :       BLOCKNAME
                              struct symtab *tem =
                                  lookup_symtab (copy_name ($1.stoken));
                              if (tem)
-                               $$ = BLOCKVECTOR_BLOCK
-                                        (BLOCKVECTOR (tem), STATIC_BLOCK);
+                               $$ = BLOCKVECTOR_BLOCK (BLOCKVECTOR (tem), STATIC_BLOCK);
                              else
                                error ("No file or function \"%s\".",
                                       copy_name ($1.stoken));
index a08dfc58c89b592a8f9dcaf4fdbda2441b2a39a0..d2702a8ff6cdef0559567a1c059ed39e25972fa1 100644 (file)
@@ -139,7 +139,29 @@ value_cast (type, arg2)
   if (code1 == TYPE_CODE_BOOL) 
     code1 = TYPE_CODE_INT; 
   if (code2 == TYPE_CODE_BOOL) 
-    code2 = TYPE_CODE_INT; 
+    code2 = TYPE_CODE_INT;
+
+  /* A cast to an undetermined-length array_type, such as (TYPE [])OBJECT,
+     is treated like a cast to (TYPE [N])OBJECT,
+     where N is sizeof(OBJECT)/sizeof(TYPE). */
+  if (code1 == TYPE_CODE_ARRAY
+      && TYPE_LENGTH (TYPE_TARGET_TYPE (type)) > 0
+      && TYPE_ARRAY_UPPER_BOUND_TYPE (type) == BOUND_CANNOT_BE_DETERMINED)
+    {
+      struct type *element_type = TYPE_TARGET_TYPE (type);
+      struct type *range_type = TYPE_INDEX_TYPE (type);
+      int low_bound = TYPE_LOW_BOUND (range_type);
+      int val_length = TYPE_LENGTH (VALUE_TYPE (arg2));
+      int new_length = val_length / TYPE_LENGTH (element_type);
+      if (val_length % TYPE_LENGTH (element_type) != 0)
+       warning("array element type size does not divide object size in cast");
+      range_type = create_range_type ((struct type *) NULL,
+                                     TYPE_TARGET_TYPE (range_type),
+                                     low_bound, new_length + low_bound - 1);
+      VALUE_TYPE (arg2) = create_array_type ((struct type *) NULL,
+                                            element_type, range_type);
+      return arg2;
+    }
 
   scalar = (code2 == TYPE_CODE_INT || code2 == TYPE_CODE_FLT
            || code2 == TYPE_CODE_ENUM || code2 == TYPE_CODE_RANGE);
@@ -815,7 +837,7 @@ value_arg_coerce (arg, param_type)
   switch (TYPE_CODE (type))
     {
     case TYPE_CODE_REF:
-      if (TYPE_CODE (SYMBOL_TYPE (arg)) != TYPE_CODE_REF)
+      if (TYPE_CODE (VALUE_TYPE (arg)) != TYPE_CODE_REF)
        {
          arg = value_addr (arg);
          VALUE_TYPE (arg) = param_type;
@@ -1911,8 +1933,7 @@ value_struct_elt_for_reference (domain, offset, curtype, name, intype)
                (lookup_reference_type
                 (lookup_member_type (TYPE_FN_FIELD_TYPE (f, j),
                                      domain)),
-                (LONGEST) METHOD_PTR_FROM_VOFFSET
-                 (TYPE_FN_FIELD_VOFFSET (f, j)));
+                (LONGEST) METHOD_PTR_FROM_VOFFSET (TYPE_FN_FIELD_VOFFSET (f, j)));
            }
          else
            {