aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorMark Mitchell <mark@codesourcery.com>2003-12-06 22:11:45 +0000
committerMark Mitchell <mmitchel@gcc.gnu.org>2003-12-06 22:11:45 +0000
commita6c0d7722409af95b4e7c0e718bf85a07d679dcd (patch)
treee8af9134037c4b519c2df775026d650d51634041 /gcc
parent9be6533af6dcbffc1f2ae91d7d108cf5171b75d4 (diff)
downloadgcc-a6c0d7722409af95b4e7c0e718bf85a07d679dcd.zip
gcc-a6c0d7722409af95b4e7c0e718bf85a07d679dcd.tar.gz
gcc-a6c0d7722409af95b4e7c0e718bf85a07d679dcd.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/class.c9
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/inherit/operator2.C22
4 files changed, 41 insertions, 2 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 7127625..f2ec0e7 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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.
diff --git a/gcc/cp/class.c b/gcc/cp/class.c
index 1e1b71c..72f03a2 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 f6fd9ff..d65ed73 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/g++.dg/inherit/operator2.C b/gcc/testsuite/g++.dg/inherit/operator2.C
new file mode 100644
index 0000000..09407e1
--- /dev/null
+++ b/gcc/testsuite/g++.dg/inherit/operator2.C
@@ -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;