From 7dd4bdf55d415cc02fb09a010dd4edccd856bc8f Mon Sep 17 00:00:00 2001 From: Mark Mitchell Date: Sun, 24 May 1998 23:57:48 +0000 Subject: tree.c (cp_tree_equal): Handle pointers to member functions. 1998-05-24 Mark Mitchell * tree.c (cp_tree_equal): Handle pointers to member functions. From-SVN: r20038 --- gcc/cp/ChangeLog | 2 ++ gcc/cp/tree.c | 18 +++++++++++++++- gcc/testsuite/g++.old-deja/g++.pt/nontype4.C | 31 ++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/g++.old-deja/g++.pt/nontype4.C (limited to 'gcc') diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 0bf7d8a..b54b78f 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,7 @@ 1998-05-24 Mark Mitchell + * tree.c (cp_tree_equal): Handle pointers to member functions. + * call.c (maybe_handle_implicit_object): Handle QUAL_CONVs. Make sure the type of the REF_BIND is a reference type. (maybe_handle_ref_bind, compare_ics): Rename reference_type to diff --git a/gcc/cp/tree.c b/gcc/cp/tree.c index ce60118..a5f30ea 100644 --- a/gcc/cp/tree.c +++ b/gcc/cp/tree.c @@ -2134,7 +2134,23 @@ cp_tree_equal (t1, t2) TREE_STRING_LENGTH (t1)); case CONSTRUCTOR: - abort (); + /* We need to do this when determining whether or not two + non-type pointer to member function template arguments + are the same. */ + if (!(comptypes (TREE_TYPE (t1), TREE_TYPE (t2), 1) + /* The first operand is RTL. */ + && TREE_OPERAND (t1, 0) == TREE_OPERAND (t2, 0))) + return 0; + return cp_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1)); + + case TREE_LIST: + cmp = cp_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2)); + if (cmp <= 0) + return cmp; + cmp = cp_tree_equal (TREE_VALUE (t1), TREE_VALUE (t2)); + if (cmp <= 0) + return cmp; + return cp_tree_equal (TREE_CHAIN (t1), TREE_CHAIN (t2)); case SAVE_EXPR: return cp_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0)); diff --git a/gcc/testsuite/g++.old-deja/g++.pt/nontype4.C b/gcc/testsuite/g++.old-deja/g++.pt/nontype4.C new file mode 100644 index 0000000..2aa38b1 --- /dev/null +++ b/gcc/testsuite/g++.old-deja/g++.pt/nontype4.C @@ -0,0 +1,31 @@ +// Build don't link: + +template +class s +{ +public: + s (R &r) : _r (r) {} + + void e (void) { (_r.*A) (); } + +private: + R &_r; +}; + +class x +{ +public: + void test1 (void) { int j = 0; } + void test2 (void) { int j = 1; } +}; + +int +main (void) +{ + x r; + + s c4 (r); + s c5 (r); + + return 0; +} -- cgit v1.1