Commit 64b2bdb3 by Mark Mitchell Committed by Mark Mitchell

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
parent fd44f634
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> 2005-05-27 Mark Mitchell <mark@codesourcery.com>
PR c++/21614 PR c++/21614
......
...@@ -968,6 +968,19 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p) ...@@ -968,6 +968,19 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
tree raises = empty_except_spec; tree raises = empty_except_spec;
tree rhs_parm_type = NULL_TREE; tree rhs_parm_type = NULL_TREE;
tree name; 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); type = TYPE_MAIN_VARIANT (type);
...@@ -1066,6 +1079,9 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p) ...@@ -1066,6 +1079,9 @@ implicitly_declare_fn (special_function_kind kind, tree type, bool const_p)
DECL_INLINE (fn) = 1; DECL_INLINE (fn) = 1;
gcc_assert (!TREE_USED (fn)); gcc_assert (!TREE_USED (fn));
/* Restore PROCESSING_TEMPLATE_DECL. */
processing_template_decl = saved_processing_template_decl;
return fn; return fn;
} }
......
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> 2005-05-29 Jan Hubicka <jh@suse.cz>
* gcc.c-torture/compile/pr21562.c: New. * gcc.c-torture/compile/pr21562.c: New.
......
// 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();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment