aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <merrill@gnu.org>1994-10-15 00:32:58 +0000
committerJason Merrill <merrill@gnu.org>1994-10-15 00:32:58 +0000
commita5c2941b8a67649bb484a6c02682158d4c29ff9b (patch)
tree513788d8f3d1545c05d0e9c0c08589222b73dc38
parentf37f4651e1bcb4d14b8540f8e317a975f897498d (diff)
downloadgcc-a5c2941b8a67649bb484a6c02682158d4c29ff9b.zip
gcc-a5c2941b8a67649bb484a6c02682158d4c29ff9b.tar.gz
gcc-a5c2941b8a67649bb484a6c02682158d4c29ff9b.tar.bz2
(build_method_call): Disable code that tries to do tricky stuff with a default parameter that is a constructor call...
(build_method_call): Disable code that tries to do tricky stuff with a default parameter that is a constructor call, but actually does other tricky stuff that breaks things. (build_scoped_method_call): Don't lose side effects in the object expression when calling a non-existent destructor. (build_scoped_method_call): Remove erroneous error message when destructor call is written as a scoped call. From-SVN: r8274
-rw-r--r--gcc/cp/call.c20
1 files changed, 12 insertions, 8 deletions
diff --git a/gcc/cp/call.c b/gcc/cp/call.c
index 606f5eb..41580a6 100644
--- a/gcc/cp/call.c
+++ b/gcc/cp/call.c
@@ -1439,12 +1439,10 @@ build_scoped_method_call (exp, scopes, name, parms)
cp_error ("type of `%E' does not match destructor type `%T' (type was `%T')",
exp, basetype, type);
name = TREE_OPERAND (name, 0);
- if (IDENTIFIER_HAS_TYPE_VALUE (name))
- name = IDENTIFIER_TYPE_VALUE (name);
- if (basetype != name)
- cp_error ("qualified type `%T' does not match destructor type `%T'",
+ if (basetype != get_type_value (name))
+ cp_error ("qualified type `%T' does not match destructor name `~%T'",
basetype, name);
- return void_zero_node;
+ return convert (void_type_node, exp);
}
if (! is_aggr_typedef (basename, 1))
@@ -1472,15 +1470,16 @@ build_scoped_method_call (exp, scopes, name, parms)
{
/* Explicit call to destructor. */
name = TREE_OPERAND (name, 0);
- if (name != constructor_name (TREE_TYPE (decl)))
+ if (! (name == constructor_name (TREE_TYPE (decl))
+ || TREE_TYPE (decl) == get_type_value (name)))
{
cp_error
- ("qualified type `%T' does not match destructor type `%T'",
+ ("qualified type `%T' does not match destructor name `~%T'",
TREE_TYPE (decl), name);
return error_mark_node;
}
if (! TYPE_HAS_DESTRUCTOR (TREE_TYPE (decl)))
- return void_zero_node;
+ return convert (void_type_node, exp);
return build_delete (TREE_TYPE (decl), decl, integer_two_node,
LOOKUP_NORMAL|LOOKUP_NONVIRTUAL|LOOKUP_DESTRUCTOR,
@@ -1962,6 +1961,10 @@ build_method_call (instance, name, parms, basetype_path, flags)
TREE_CALLS_NEW (instance_ptr) = 1;
instance = build_indirect_ref (instance_ptr, NULL_PTR);
+#if 0
+ /* This breaks initialization of a reference from a new
+ expression of a different type. And it doesn't appear to
+ serve its original purpose any more, either. jason 10/12/94 */
/* If it's a default argument initialized from a ctor, what we get
from instance_ptr will match the arglist for the FUNCTION_DECL
of the constructor. */
@@ -1970,6 +1973,7 @@ build_method_call (instance, name, parms, basetype_path, flags)
&& TREE_CALLS_NEW (TREE_VALUE (TREE_OPERAND (TREE_VALUE (parms), 1))))
parms = build_tree_list (NULL_TREE, instance_ptr);
else
+#endif
parms = tree_cons (NULL_TREE, instance_ptr, parms);
}
}