re PR c++/13323 (Template code does not compile in presence of typedef)

PR c++/13323
	* class.c (same_signature_p): Handle conversion operators
	correctly.
	(check_for_override): Likewise.

	PR c++/13323
	* g++.dg/inherit/operator2.C: New test.

From-SVN: r74370
This commit is contained in:
Mark Mitchell 2003-12-06 22:11:45 +00:00 committed by Mark Mitchell
parent 9be6533af6
commit a6c0d77224
4 changed files with 41 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2003-12-06 Mark Mitchell <mark@codesourcery.com>
PR c++/13323
* class.c (same_signature_p): Handle conversion operators
correctly.
(check_for_override): Likewise.
2003-12-06 Kelley Cook <kcook@gcc.gnu.org>
* Make-lang.in (GXX_CROSS_NAME, CXX_CROSS_NAME): Delete.

View File

@ -1900,7 +1900,11 @@ same_signature_p (tree fndecl, tree base_fndecl)
if (DECL_DESTRUCTOR_P (base_fndecl) || DECL_DESTRUCTOR_P (fndecl))
return 0;
if (DECL_NAME (fndecl) == DECL_NAME (base_fndecl))
if (DECL_NAME (fndecl) == DECL_NAME (base_fndecl)
|| (DECL_CONV_FN_P (fndecl)
&& DECL_CONV_FN_P (base_fndecl)
&& same_type_p (DECL_CONV_FN_TYPE (fndecl),
DECL_CONV_FN_TYPE (base_fndecl))))
{
tree types, base_types;
types = TYPE_ARG_TYPES (TREE_TYPE (fndecl));
@ -2439,7 +2443,8 @@ check_for_override (tree decl, tree ctype)
override a virtual function from a base class. */
return;
if ((DECL_DESTRUCTOR_P (decl)
|| IDENTIFIER_VIRTUAL_P (DECL_NAME (decl)))
|| IDENTIFIER_VIRTUAL_P (DECL_NAME (decl))
|| DECL_CONV_FN_P (decl))
&& look_for_overrides (ctype, decl)
&& !DECL_STATIC_FUNCTION_P (decl))
/* Set DECL_VINDEX to a value that is neither an INTEGER_CST nor

View File

@ -1,3 +1,8 @@
2003-12-06 Mark Mitchell <mark@codesourcery.com>
PR c++/13323
* g++.dg/inherit/operator2.C: New test.
2003-12-05 Mark Mitchell <mark@codesourcery.com>
PR c++/13305

View File

@ -0,0 +1,22 @@
typedef int INT_TYPEDEF;
template<class T>
class TypedIfc
{
public:
virtual ~TypedIfc() { }
virtual operator const T&() const = 0;
virtual const T& operator= (const T& t) = 0;
};
template<class Tnative>
class NullIfc : public TypedIfc<Tnative>
{
public:
const Tnative& operator= (const Tnative& t) { return t; }
operator const Tnative&() const { return *(Tnative *)0; }
};
typedef TypedIfc<INT_TYPEDEF> INT_TYPEDEFIfc;
NullIfc<int> i32;