re PR c++/21340 (error in constructor lookup (can't find constructor with "const...
authorMark Mitchell <mark@codesourcery.com>
Sun, 29 May 2005 00:16:05 +0000 (00:16 +0000)
committerMark Mitchell <mmitchel@gcc.gnu.org>
Sun, 29 May 2005 00:16:05 +0000 (00:16 +0000)
PR c++/21340
* method.c (implicitly_declare_fn): Clear processing_template_decl
when generating implicit declaration.

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

From-SVN: r100306

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

index 24dc95819b6fb29ac23be37e4728677705bd9fe4..59af6b18bde3e032396455915e630c4c9aabf14b 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 37822bea78e2e8fef2e965a96c458752fd4b36c6..843f414bb9b5a90464977a1dd140339317dc09b6 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 f9a5e6a19898915c3618c631aa5d2071b518a602..a85e6b5d6b6ca29ab68fe7bb7c5236a35dd8990d 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();
+}