This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
A patch for g++.jason/crash6.C
- To: loewis at informatik dot hu-berlin dot de
- Subject: A patch for g++.jason/crash6.C
- From: hjl at lucon dot org (H.J. Lu)
- Date: Wed, 27 May 1998 18:44:16 -0700 (PDT)
- Cc: egcs at cygnus dot com
Please ignore my last patch. This patch seems to fix g++.jason/crash6.C.
Thanks.
--
H.J. Lu (hjl@gnu.org)
---
Wed May 27 18:42:01 1998 H.J. Lu (hjl@gnu.org)
* call.c (build_scoped_method_call): Check if return from
get_type_value (name) is NULL.
(build_method_call): Likewise.
Index: call.c
===================================================================
RCS file: /home/work/cvs/gnu/egcs/gcc/cp/call.c,v
retrieving revision 1.1.1.43
diff -u -p -r1.1.1.43 call.c
--- call.c 1998/05/26 14:41:01 1.1.1.43
+++ call.c 1998/05/27 22:54:24
@@ -389,13 +389,16 @@ build_scoped_method_call (exp, basetype,
and template parms. */
if (TREE_CODE (name) == BIT_NOT_EXPR && ! IS_AGGR_TYPE (basetype))
{
+ tree tv;
+
if (TYPE_MAIN_VARIANT (type) != TYPE_MAIN_VARIANT (basetype))
cp_error ("type of `%E' does not match destructor type `%T' (type was `%T')",
exp, basetype, type);
name = TREE_OPERAND (name, 0);
if (TYPE_MAIN_VARIANT (basetype) != name
- && (TYPE_MAIN_VARIANT (basetype)
- != TYPE_MAIN_VARIANT (get_type_value (name))))
+ && (!(tv = get_type_value (name))
+ || (TYPE_MAIN_VARIANT (basetype)
+ != TYPE_MAIN_VARIANT (tv))))
cp_error ("qualified type `%T' does not match destructor name `~%T'",
basetype, name);
return cp_convert (void_type_node, exp);
@@ -632,6 +635,8 @@ build_method_call (instance, name, parms
if (TREE_CODE (name) == BIT_NOT_EXPR)
{
+ tree tv;
+
flags |= LOOKUP_DESTRUCTOR;
name = TREE_OPERAND (name, 0);
if (parms)
@@ -642,8 +647,9 @@ build_method_call (instance, name, parms
if (! (name == TYPE_MAIN_VARIANT (basetype)
|| (IS_AGGR_TYPE (basetype)
&& name == constructor_name (basetype))
- || (TYPE_MAIN_VARIANT (basetype)
- == TYPE_MAIN_VARIANT (get_type_value (name)))))
+ || ((tv = get_type_value (name))
+ && (TYPE_MAIN_VARIANT (basetype)
+ == TYPE_MAIN_VARIANT (tv)))))
{
cp_error ("destructor name `~%D' does not match type `%T' of expression",
name, basetype);