aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp/class.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cp/class.c')
-rw-r--r--gcc/cp/class.c16
1 files changed, 10 insertions, 6 deletions
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index b8254fe..ff5190a 100644
--- a/gcc/cp/class.c
+++ b/gcc/cp/class.c
@@ -879,9 +879,10 @@ modify_vtable_entry (tree t,
/* Add method METHOD to class TYPE. If USING_DECL is non-null, it is
- the USING_DECL naming METHOD. */
+ the USING_DECL naming METHOD. Returns true if the method could be
+ added to the method vec. */
-void
+bool
add_method (tree type, tree method, tree using_decl)
{
unsigned slot;
@@ -894,7 +895,7 @@ add_method (tree type, tree method, tree using_decl)
tree current_fns;
if (method == error_mark_node)
- return;
+ return false;
complete_p = COMPLETE_TYPE_P (type);
conv_p = DECL_CONV_FN_P (method);
@@ -1027,7 +1028,7 @@ add_method (tree type, tree method, tree using_decl)
{
if (DECL_CONTEXT (fn) == type)
/* Defer to the local function. */
- return;
+ return false;
if (DECL_CONTEXT (fn) == DECL_CONTEXT (method))
error ("repeated using declaration %q+D", using_decl);
else
@@ -1044,7 +1045,7 @@ add_method (tree type, tree method, tree using_decl)
declarations because that will confuse things if the
methods have inline definitions. In particular, we
will crash while processing the definitions. */
- return;
+ return false;
}
}
}
@@ -1069,6 +1070,7 @@ add_method (tree type, tree method, tree using_decl)
else
/* Replace the current slot. */
VEC_replace (tree, method_vec, slot, overload);
+ return true;
}
/* Subroutines of finish_struct. */
@@ -1980,7 +1982,9 @@ update_vtable_entry_for_fn (tree t, tree binfo, tree fn, tree* virtuals,
if (POINTER_TYPE_P (over_return)
&& TREE_CODE (over_return) == TREE_CODE (base_return)
&& CLASS_TYPE_P (TREE_TYPE (over_return))
- && CLASS_TYPE_P (TREE_TYPE (base_return)))
+ && CLASS_TYPE_P (TREE_TYPE (base_return))
+ /* If the overrider is invalid, don't even try. */
+ && !DECL_INVALID_OVERRIDER_P (overrider_target))
{
/* If FN is a covariant thunk, we must figure out the adjustment
to the final base FN was converting to. As OVERRIDER_TARGET might