diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 7127625f6245..f2ec0e751bc9 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2003-12-06 Mark Mitchell + + PR c++/13323 + * class.c (same_signature_p): Handle conversion operators + correctly. + (check_for_override): Likewise. + 2003-12-06 Kelley Cook * Make-lang.in (GXX_CROSS_NAME, CXX_CROSS_NAME): Delete. diff --git a/gcc/cp/class.c b/gcc/cp/class.c index 1e1b71c94dcf..72f03a254f7a 100644 --- a/gcc/cp/class.c +++ b/gcc/cp/class.c @@ -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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f6fd9ff402cb..d65ed7388145 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2003-12-06 Mark Mitchell + + PR c++/13323 + * g++.dg/inherit/operator2.C: New test. + 2003-12-05 Mark Mitchell PR c++/13305 diff --git a/gcc/testsuite/g++.dg/inherit/operator2.C b/gcc/testsuite/g++.dg/inherit/operator2.C new file mode 100644 index 000000000000..09407e1b4898 --- /dev/null +++ b/gcc/testsuite/g++.dg/inherit/operator2.C @@ -0,0 +1,22 @@ +typedef int INT_TYPEDEF; + +template +class TypedIfc +{ +public: + virtual ~TypedIfc() { } + virtual operator const T&() const = 0; + virtual const T& operator= (const T& t) = 0; +}; + +template +class NullIfc : public TypedIfc +{ +public: + const Tnative& operator= (const Tnative& t) { return t; } + operator const Tnative&() const { return *(Tnative *)0; } +}; + +typedef TypedIfc INT_TYPEDEFIfc; + +NullIfc i32;