re PR c++/16623 (g++ ICE in tsubst_decl:6081)
authorMark Mitchell <mark@codesourcery.com>
Mon, 19 Jul 2004 19:28:09 +0000 (19:28 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Mon, 19 Jul 2004 19:28:09 +0000 (19:28 +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.

PR c++/16623
* g++.dg/template/assign1.C: New test.

From-SVN: r84928

gcc/cp/ChangeLog
gcc/cp/class.c
gcc/cp/cp-tree.h
gcc/cp/method.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/template/assign1.C [new file with mode: 0644]

index dfd8d26229a32199c5357cbe4fa0d333bff0cb06..4038747763734f76a93707b41ce90aade66523ef 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-19  Nathan Sidwell  <nathan@codesourcery.com>
 
        * class.c (add_method): Delay adding the slot until the end.
index 69f6d9e6e6fd504ce9e6c954934131203710b23f..75f7152d4004b2531c1648db339e24768d221490 100644 (file)
@@ -2558,7 +2558,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 ca7eae30f3b5605c5d67338a1532c3ef4cac16d0..ad8e8dd2d64634fa009aacbd98b95ee61fab3bec 100644 (file)
@@ -989,6 +989,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;
@@ -1002,7 +1003,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 vfields;
@@ -1097,6 +1098,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 802d4c023fe68a4abbce52eb3d8405793ebf35a7..e3c65f8ab85fd8da13929d74a22d81c79adc936c 100644 (file)
@@ -1068,6 +1068,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 51256e5403a33ed08a1c10df5c606547aa365e3a..b5a322c39e16d569f5defa30a5639f10b1979403 100644 (file)
@@ -1,3 +1,8 @@
+2004-07-18  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/16623
+       * g++.dg/template/assign1.C: New test.
+
 2004-07-19  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
 
        PR c++/12170
diff --git a/gcc/testsuite/g++.dg/template/assign1.C b/gcc/testsuite/g++.dg/template/assign1.C
new file mode 100644 (file)
index 0000000..d0e134a
--- /dev/null
@@ -0,0 +1,15 @@
+// PR c++/16623
+
+template <int N>
+struct C
+{
+  C& operator= (int);
+};
+
+template <int N>
+C<N>& C<N>::operator= (int)
+{
+  return *this;
+}
+
+C<0> a;