re PR c++/16623 (g++ ICE in tsubst_decl:6081)
authorMark Mitchell <mark@codesourcery.com>
Tue, 20 Jul 2004 15:36:08 +0000 (15:36 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Tue, 20 Jul 2004 15:36:08 +0000 (15:36 +0000)
PR c++/16623
* cp-tree.h (lang_type_class): Add lazy_assignment_op.
(CLASSTYPE_LAZY_ASSIGNMENT_OP): New macro.
* class.c (add_implicitly_declared_members): Use
CLASSTYPE_LAZY_ASSIGNMENT_OP.
* method.c (lazily_declare_fn): Clear
CLASSTYPE_LAZY_ASSIGNMENT_OP.
* search.c (lookup_fnfields_1): Check it.

From-SVN: r84956

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/method.c
gcc/cp/search.c

index 53406d0c45476d9ff44a508c52a813c7bba591e4..2cf92d0a43547cd43c799ca1154a23841fcd012f 100644 (file)
@@ -1,3 +1,14 @@
+2004-07-19  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/16623
+       * cp-tree.h (lang_type_class): Add lazy_assignment_op.
+       (CLASSTYPE_LAZY_ASSIGNMENT_OP): New macro.
+       * class.c (add_implicitly_declared_members): Use
+       CLASSTYPE_LAZY_ASSIGNMENT_OP.
+       * method.c (lazily_declare_fn): Clear
+       CLASSTYPE_LAZY_ASSIGNMENT_OP.
+       * search.c (lookup_fnfields_1): Check it.
+
 2004-07-20  Nathan Sidwell  <nathan@codesourcery.com>
 
        * cp-tree.h (vec_binfo_member): Remove.
index 169dd917ed7d956ab41ed9fbb49437f3a510376a..0274ca9fc4cd23b9586d4c88e237ee8a91f21464 100644 (file)
@@ -2533,7 +2533,11 @@ add_implicitly_declared_members (tree t,
      of the parameter to the assignment operator will be a const or
      non-const reference.  */
   if (!TYPE_HAS_ASSIGN_REF (t) && !TYPE_FOR_JAVA (t))
-    TYPE_HAS_CONST_ASSIGN_REF (t) = !cant_have_const_assignment;
+    {
+      TYPE_HAS_ASSIGN_REF (t) = 1;
+      TYPE_HAS_CONST_ASSIGN_REF (t) = !cant_have_const_assignment;
+      CLASSTYPE_LAZY_ASSIGNMENT_OP (t) = 1;
+    }
   
   /* Now, hook all of the new functions on to TYPE_METHODS,
      and add them to the CLASSTYPE_METHOD_VEC.  */
index a3779d88db5f0dd1612e93c329e57d4ef54ec4a6..097295d937d675bdc44340c3805af2b108a3bb13 100644 (file)
@@ -987,6 +987,7 @@ struct lang_type_class GTY(())
 
   unsigned lazy_default_ctor : 1;
   unsigned lazy_copy_ctor : 1;
+  unsigned lazy_assignment_op : 1;
   unsigned has_const_init_ref : 1;
   unsigned has_complex_init_ref : 1;
   unsigned has_complex_assign_ref : 1;
@@ -1000,7 +1001,7 @@ struct lang_type_class GTY(())
   /* There are some bits left to fill out a 32-bit word.  Keep track
      of this by updating the size of this bitfield whenever you add or
      remove a flag.  */
-  unsigned dummy : 9;
+  unsigned dummy : 8;
 
   tree primary_base;
   tree vcall_indices;
@@ -1094,6 +1095,11 @@ struct lang_type GTY(())
 #define CLASSTYPE_LAZY_COPY_CTOR(NODE) \
   (LANG_TYPE_CLASS_CHECK (NODE)->lazy_copy_ctor)
 
+/* Nonzero means that NODE (a class type) has an assignment operator
+   -- but that it has not yet been declared.  */
+#define CLASSTYPE_LAZY_ASSIGNMENT_OP(NODE) \
+  (LANG_TYPE_CLASS_CHECK (NODE)->lazy_assignment_op)
+
 /* Nonzero means that this _CLASSTYPE node overloads operator=(X&).  */
 #define TYPE_HAS_ASSIGN_REF(NODE) (LANG_TYPE_CLASS_CHECK (NODE)->has_assign_ref)
 
index a28c90182c24d453b1059905b55f3caf787fc845..d2d52bbf0b9cefaacbf8330f9e169e70c3742f66 100644 (file)
@@ -1064,6 +1064,8 @@ lazily_declare_fn (special_function_kind sfk, tree type)
       /* Create appropriate clones.  */
       clone_function_decl (fn, /*update_method_vec=*/true);
     }
+  else if (sfk == sfk_assignment_operator)
+    CLASSTYPE_LAZY_ASSIGNMENT_OP (type) = 0;
 
   return fn;
 }
index 364e8f26b779328f9f6d71a20d559f2dc48045a4..63cb6391e1a97da51b2a1b3ba0ed4e62fc65c825 100644 (file)
@@ -1367,8 +1367,7 @@ lookup_fnfields_1 (tree type, tree name)
            lazily_declare_fn (sfk_copy_constructor, type);
        }
       else if (name == ansi_assopname(NOP_EXPR)
-              && !TYPE_HAS_ASSIGN_REF (type)
-              && !TYPE_FOR_JAVA (type))
+              && CLASSTYPE_LAZY_ASSIGNMENT_OP (type))
        lazily_declare_fn (sfk_assignment_operator, type);
     }