PR c++/16623
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Jul 2004 19:28:09 +0000 (19:28 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Mon, 19 Jul 2004 19:28:09 +0000 (19:28 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@84928 138bc75d-0d04-0410-961f-82ee72b054a4

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 dfd8d26..4038747 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 69f6d9e..75f7152 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 ca7eae3..ad8e8dd 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 802d4c0..e3c65f8 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 51256e5..b5a322c 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;