From: Volker Reichelt Date: Wed, 1 Feb 2006 11:57:42 +0000 (+0000) Subject: Backport: X-Git-Tag: releases/gcc-3.4.6~112 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9400e556b159292faafbbd16bd729f7425164188;p=thirdparty%2Fgcc.git Backport: 2005-12-22 Mark Mitchell PR c++/25369 * pt.c (tsubst_copy): Call mark_used on the member referenced by an OFFSET_REF. * decl2.c (mark_used): Accept BASELINKs. * g++.dg/template/ptrmem16.C: New test. From-SVN: r110473 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 5ea2f7ddfda8..da47e4854b19 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,13 @@ +2006-02-01 Volker Reichelt + + Backport: + 2005-12-22 Mark Mitchell + + PR c++/25369 + * pt.c (tsubst_copy): Call mark_used on the member referenced by an + OFFSET_REF. + * decl2.c (mark_used): Accept BASELINKs. + 2006-02-01 Volker Reichelt Backport: diff --git a/gcc/cp/decl2.c b/gcc/cp/decl2.c index 55d68a2e6016..abd86f7abecc 100644 --- a/gcc/cp/decl2.c +++ b/gcc/cp/decl2.c @@ -2967,6 +2967,18 @@ check_default_args (tree x) void mark_used (tree decl) { + /* If DECL is a BASELINK for a single function, then treat it just + like the DECL for the function. Otherwise, if the BASELINK is + for an overloaded function, we don't know which function was + actually used until after overload resolution. */ + if (TREE_CODE (decl) == BASELINK) + { + decl = BASELINK_FUNCTIONS (decl); + if (really_overloaded_fn (decl)) + return; + decl = OVL_CURRENT (decl); + } + TREE_USED (decl) = 1; if (processing_template_decl || skip_evaluation) return; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index aca2dcd53618..0ae2d23e70f8 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -7807,6 +7807,10 @@ tsubst_copy (tree t, tree args, tsubst_flags_t complain, tree in_decl) in_decl), tsubst (TREE_TYPE (t), args, complain, in_decl)); + case OFFSET_REF: + mark_used (TREE_OPERAND (t, 1)); + return t; + default: return t; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 4cad37618e17..6040ed2d972f 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2006-02-01 Volker Reichelt + + Backport: + 2005-12-22 Mark Mitchell + + PR c++/25369 + * g++.dg/template/ptrmem16.C: New test. + 2006-02-01 Volker Reichelt Backport: diff --git a/gcc/testsuite/g++.dg/template/ptrmem16.C b/gcc/testsuite/g++.dg/template/ptrmem16.C new file mode 100644 index 000000000000..caf5dd0f227e --- /dev/null +++ b/gcc/testsuite/g++.dg/template/ptrmem16.C @@ -0,0 +1,22 @@ +// PR c++/25369 +// { dg-do link } + +template struct A +{ + void foo() {} +}; + +void bar(void (A::*)()) {} + +template void baz() +{ + bar(&A::foo); +} + +int main() +{ + baz<0>(); + return 0; +} + +