]> gcc.gnu.org Git - gcc.git/commitdiff
typeck.c (get_delta_difference): Give hard error for conversion from virtual base.
authorJason Merrill <jason@yorick.cygnus.com>
Wed, 25 Feb 1998 10:07:07 +0000 (10:07 +0000)
committerJason Merrill <jason@gcc.gnu.org>
Wed, 25 Feb 1998 10:07:07 +0000 (05:07 -0500)
* typeck.c (get_delta_difference): Give hard error for conversion
from virtual base.
* cp-tree.h: Tweak formatting.

From-SVN: r18229

gcc/cp/ChangeLog
gcc/cp/cp-tree.h
gcc/cp/typeck.c

index 115e786e47c6908bcf709787218e65049ee3c2c7..76fb2d65bd80bdf07cc086ebb7e7dc397da22e03 100644 (file)
@@ -1,3 +1,10 @@
+Wed Feb 25 09:51:29 1998  Jason Merrill  <jason@yorick.cygnus.com>
+
+       * typeck.c (get_delta_difference): Give hard error for conversion
+       from virtual base.
+
+       * cp-tree.h: Tweak formatting.
+
 Wed Feb 25 00:35:33 1998  Jason Merrill  <jason@yorick.cygnus.com>
 
        * decl.c (push_namespace): Handle redeclaration error.
index dcaf69fb6de25b1924b7dbd80beccad44d76bdf2..b6f7bc7f9ed099b116d712f954efbbc48e82e577 100644 (file)
@@ -29,7 +29,7 @@ Boston, MA 02111-1307, USA.  */
 struct lang_identifier
 {
   struct tree_identifier ignore;
-  tree global_value, local_value;
+  tree namespace_bindings, local_value;
   tree class_value;
   tree class_template_info;
   struct lang_id2 *x;
@@ -58,8 +58,8 @@ typedef struct
   tree decl;
 } template_parm_index;
 
-#define BINDING_SCOPE(NODE)    (((struct tree_binding*)NODE)->scope)
-#define BINDING_VALUE(NODE)   (((struct tree_binding*)NODE)->value)
+#define BINDING_SCOPE(NODE)    (((struct tree_binding*)NODE)->scope)
+#define BINDING_VALUE(NODE)    (((struct tree_binding*)NODE)->value)
 #define NAMESPACE_BINDING(ID,NS) BINDING_VALUE (binding_for_name (ID, NS))
 #define IDENTIFIER_GLOBAL_VALUE(NODE) \
   NAMESPACE_BINDING (NODE, global_namespace)
@@ -80,7 +80,7 @@ struct tree_binding
 /* Macros for access to language-specific slots in an identifier.  */
 
 #define IDENTIFIER_NAMESPACE_BINDINGS(NODE)    \
-  (((struct lang_identifier *)(NODE))->global_value)
+  (((struct lang_identifier *)(NODE))->namespace_bindings)
 #define IDENTIFIER_CLASS_VALUE(NODE)   \
   (((struct lang_identifier *)(NODE))->class_value)
 #define IDENTIFIER_LOCAL_VALUE(NODE)   \
index 3375f11db0f86dd3c3b9c101ee3286cb96e96114..fa5ee5a2a1bc4c37d1c1a837790759dc1dc15c27 100644 (file)
@@ -6304,24 +6304,8 @@ get_delta_difference (from, to, force)
          return delta;
        }
       binfo = get_binfo (to, from, 1);
-      if (binfo == error_mark_node)
-       {
-         if (!force)
-           error ("   in pointer to member conversion");
-         return delta;
-       }
-      if (binfo == 0)
-       {
-         if (!force)
-           cp_error ("cannot convert pointer to member of type %T to unrelated pointer to member of type %T", from, to);
-         return delta;
-       }
-      if (TREE_VIA_VIRTUAL (binfo))
-       {
-         binfo = binfo_member (BINFO_TYPE (binfo),
-                               CLASSTYPE_VBASECLASSES (from));
-         warning ("pointer to member conversion to virtual base class will only work if you are very careful");
-       }
+      if (binfo == 0 || binfo == error_mark_node || TREE_VIA_VIRTUAL (binfo))
+       return delta;
       delta = BINFO_OFFSET (binfo);
       delta = cp_convert (ptrdiff_type_node, delta);
       
@@ -6329,10 +6313,21 @@ get_delta_difference (from, to, force)
                              integer_zero_node,
                              delta, 1);
     }
+
   if (TREE_VIA_VIRTUAL (binfo))
     {
-      warning ("pointer to member conversion from virtual base class will only work if you are very careful");
+      if (force)
+       {
+         cp_warning ("pointer to member cast from virtual base `%T'",
+                     BINFO_TYPE (binfo));
+         warning ("  will only work if you are very careful");
+       }
+      else
+       cp_error ("pointer to member conversion from virtual base `%T'",
+                 BINFO_TYPE (binfo));
+      return delta;
     }
+
   return BINFO_OFFSET (binfo);
 }
 
This page took 0.091801 seconds and 5 git commands to generate.