aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJason Merrill <jason@yorick.cygnus.com>1998-02-25 10:07:07 +0000
committerJason Merrill <jason@gcc.gnu.org>1998-02-25 05:07:07 -0500
commit32e02ee0c0155fc3df9c566d0dacddc96b2defbd (patch)
tree9249db6859211b3367f4ede346e81ce1a0c90a62 /gcc
parent75cf27d4c9102fc5c92782ba12d2daef8777aea2 (diff)
downloadgcc-32e02ee0c0155fc3df9c566d0dacddc96b2defbd.zip
gcc-32e02ee0c0155fc3df9c566d0dacddc96b2defbd.tar.gz
gcc-32e02ee0c0155fc3df9c566d0dacddc96b2defbd.tar.bz2
typeck.c (get_delta_difference): Give hard error for conversion from virtual base.
* typeck.c (get_delta_difference): Give hard error for conversion from virtual base. * cp-tree.h: Tweak formatting. From-SVN: r18229
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/cp-tree.h8
-rw-r--r--gcc/cp/typeck.c33
3 files changed, 25 insertions, 23 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 115e786..76fb2d6 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index dcaf69f..b6f7bc7 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -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) \
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index 3375f11..fa5ee5a 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -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);
}