From 64b2bdb353f2c0550f7deeec7abff967b18fa6d2 Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sun, 29 May 2005 00:16:05 +0000 Subject: [PATCH] re PR c++/21340 (error in constructor lookup (can't find constructor with "const void**" argument)) 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 | 6 ++++++ gcc/cp/method.c | 16 ++++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/init/ctor6.C | 20 ++++++++++++++++++++ 4 files changed, 47 insertions(+) create mode 100644 gcc/testsuite/g++.dg/init/ctor6.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 24dc95819b6f..59af6b18bde3 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2005-05-28 Mark Mitchell + + PR c++/21340 + * method.c (implicitly_declare_fn): Clear processing_template_decl + when generating implicit declaration. + 2005-05-27 Mark Mitchell PR c++/21614 diff --git a/gcc/cp/method.c b/gcc/cp/method.c index 37822bea78e2..843f414bb9b5 100644 --- a/gcc/cp/method.c +++ b/gcc/cp/method.c @@ -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; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f9a5e6a19898..a85e6b5d6b6c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-05-28 Mark Mitchell + + PR c++/21340 + * g++.dg/init/ctor6.C: New test. + 2005-05-29 Jan Hubicka * 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 index 000000000000..a25ecab1fa76 --- /dev/null +++ b/gcc/testsuite/g++.dg/init/ctor6.C @@ -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 bool dummy() +{ + Obj lhs, rhs; + return lhs == rhs; +} +int +main(int argc, char** argv) +{ + IteratorI* it2 = new IteratorI(); +}