+2015-01-31  Doug Evans  <xdje42@gmail.com>
+
+       * gnu-v3-abi.c (gnuv3_dynamic_class): Assert only passed structs
+       or unions.  Return zero if union.
+       (gnuv3_get_vtable): Call check_typedef.  Assert only passed structs.
+       (gnuv3_rtti_type): Pass already-check_typedef'd value to
+       gnuv3_get_vtable.
+       (compute_vtable_size): Assert only passed structs.
+       (gnuv3_print_vtable): Don't call gnuv3_get_vtable for non-structs.
+
 2015-01-31  Doug Evans  <xdje42@gmail.com>
 
        * gdbtypes.c (copy_type_recursive): Handle all TYPE_SPECIFIC_FIELD
 
 {
   int fieldnum, fieldelem;
 
+  gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT
+             || TYPE_CODE (type) == TYPE_CODE_UNION);
+
+  if (TYPE_CODE (type) == TYPE_CODE_UNION)
+    return 0;
+
   if (TYPE_CPLUS_DYNAMIC (type))
     return TYPE_CPLUS_DYNAMIC (type) == 1;
 
   struct value *vtable_pointer;
   CORE_ADDR vtable_address;
 
+  CHECK_TYPEDEF (container_type);
+  gdb_assert (TYPE_CODE (container_type) == TYPE_CODE_STRUCT);
+
   /* If this type does not have a virtual table, don't read the first
      field.  */
-  if (!gnuv3_dynamic_class (check_typedef (container_type)))
+  if (!gnuv3_dynamic_class (container_type))
     return NULL;
 
   /* We do not consult the debug information to find the virtual table.
   if (using_enc_p)
     *using_enc_p = 0;
 
-  vtable = gnuv3_get_vtable (gdbarch, value_type (value),
+  vtable = gnuv3_get_vtable (gdbarch, values_type,
                             value_as_address (value_addr (value)));
   if (vtable == NULL)
     return NULL;
   void **slot;
   struct value_and_voffset search_vo, *current_vo;
 
+  gdb_assert (TYPE_CODE (type) == TYPE_CODE_STRUCT);
+
   /* If the object is not dynamic, then we are done; as it cannot have
      dynamic base types either.  */
   if (!gnuv3_dynamic_class (type))
     }
 
   gdbarch = get_type_arch (type);
-  vtable = gnuv3_get_vtable (gdbarch, type,
-                            value_as_address (value_addr (value)));
+
+  vtable = NULL;
+  if (TYPE_CODE (type) == TYPE_CODE_STRUCT)
+    vtable = gnuv3_get_vtable (gdbarch, type,
+                              value_as_address (value_addr (value)));
 
   if (!vtable)
     {