PR c++/21340
authormmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 May 2005 00:16:05 +0000 (00:16 +0000)
committermmitchel <mmitchel@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 29 May 2005 00:16:05 +0000 (00:16 +0000)
* method.c (implicitly_declare_fn): Clear processing_template_decl
when generating implicit declaration.

PR c++/21340
* g++.dg/init/ctor6.C: New test.

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

gcc/cp/ChangeLog
gcc/cp/method.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/init/ctor6.C [new file with mode: 0644]

index 24dc958..59af6b1 100644 (file)
@@ -1,3 +1,9 @@
+2005-05-28  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/21340
+       * method.c (implicitly_declare_fn): Clear processing_template_decl
+       when generating implicit declaration.
+
 2005-05-27  Mark Mitchell  <mark@codesourcery.com>
 
        PR c++/21614
index 37822be..843f414 100644 (file)
@@ -968,6 +968,19 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
   tree raises = empty_except_spec;
   tree rhs_parm_type = NULL_TREE;
   tree name;
+  HOST_WIDE_INT saved_processing_template_decl;
+
+  /* Because we create declarations for implictly declared functions
+     lazily, we may be creating the declaration for a member of TYPE
+     while in some completely different context.  However, TYPE will
+     never be a dependent class (because we never want to do lookups
+     for implicitly defined functions in a dependent class).
+     Furthermore, we must set PROCESSING_TEMPLATE_DECL to zero here
+     because we only create clones for constructors and destructors
+     when not in a template.  */
+  gcc_assert (!dependent_type_p (type));
+  saved_processing_template_decl = processing_template_decl;
+  processing_template_decl = 0;
 
   type = TYPE_MAIN_VARIANT (type);
 
@@ -1066,6 +1079,9 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
   DECL_INLINE (fn) = 1;
   gcc_assert (!TREE_USED (fn));
 
+  /* Restore PROCESSING_TEMPLATE_DECL.  */
+  processing_template_decl = saved_processing_template_decl;
+
   return fn;
 }
 
index f9a5e6a..a85e6b5 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-28  Mark Mitchell  <mark@codesourcery.com>
+
+       PR c++/21340
+       * g++.dg/init/ctor6.C: New test.
+
 2005-05-29  Jan Hubicka  <jh@suse.cz>
 
        * gcc.c-torture/compile/pr21562.c: New.
diff --git a/gcc/testsuite/g++.dg/init/ctor6.C b/gcc/testsuite/g++.dg/init/ctor6.C
new file mode 100644 (file)
index 0000000..a25ecab
--- /dev/null
@@ -0,0 +1,20 @@
+// PR c++/21340
+
+struct Base{};
+struct Iterator : virtual Base {};
+bool operator==(const Iterator&, const Iterator&);
+struct IteratorI : Iterator {};
+struct Obj
+{
+  bool operator==(const Obj&) const;
+};
+template <int>bool dummy()
+{
+  Obj lhs, rhs;
+  return lhs == rhs;
+}
+int
+main(int argc, char** argv)
+{
+  IteratorI* it2 = new IteratorI();
+}