diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-11-02 14:17:39 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-11-02 14:17:39 +0000 |
commit | 3dfa3500061aede01f2d1bcf7db0c8ae7531087a (patch) | |
tree | 74134e65eeb6ce504beaddbdbc3450fdd44b8071 /gcc | |
parent | 31f0f571e61d1d7f8ff67a4f6a741173dfc4161c (diff) | |
download | gcc-3dfa3500061aede01f2d1bcf7db0c8ae7531087a.zip gcc-3dfa3500061aede01f2d1bcf7db0c8ae7531087a.tar.gz gcc-3dfa3500061aede01f2d1bcf7db0c8ae7531087a.tar.bz2 |
re PR c++/9810 (Using-declaration for template functions does not work)
PR c++/9810
* call.c (build_over_call): Check access using primary template
if FN is a member function template.
* g++.dg/template/using8.C: New test.
* g++.old-deja/g++.other/access11.C: Adjust expected error location.
From-SVN: r73201
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/call.c | 34 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/template/using8.C | 22 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.other/access11.C | 4 |
5 files changed, 69 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index db68053..677deca 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-11-02 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/9810 + * call.c (build_over_call): Check access using primary template + if FN is a member function template. + 2003-11-01 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> PR c++/12796 diff --git a/gcc/cp/call.c b/gcc/cp/call.c index e7bbd22..07622ab 100644 --- a/gcc/cp/call.c +++ b/gcc/cp/call.c @@ -4387,7 +4387,39 @@ build_over_call (struct z_candidate *cand, int flags) joust (cand, WRAPPER_ZC (TREE_VALUE (val)), 1); if (DECL_FUNCTION_MEMBER_P (fn)) - perform_or_defer_access_check (cand->access_path, fn); + { + /* If FN is a template function, two cases must be considered. + For example: + + struct A { + protected: + template <class T> void f(); + }; + template <class T> struct B { + protected: + void g(); + }; + struct C : A, B<int> { + using A::f; // #1 + using B<int>::g; // #2 + }; + + In case #1 where `A::f' is a member template, DECL_ACCESS is + recorded in the primary template but not in its specialization. + We check access of FN using its primary template. + + In case #2, where `B<int>::g' has a DECL_TEMPLATE_INFO simply + because it is a member of class template B, DECL_ACCESS is + recorded in the specialization `B<int>::g'. We cannot use its + primary template because `B<T>::g' and `B<int>::g' may have + different access. */ + if (DECL_TEMPLATE_INFO (fn) + && is_member_template (DECL_TI_TEMPLATE (fn))) + perform_or_defer_access_check (cand->access_path, + DECL_TI_TEMPLATE (fn)); + else + perform_or_defer_access_check (cand->access_path, fn); + } if (args && TREE_CODE (args) != TREE_LIST) args = build_tree_list (NULL_TREE, args); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1dabd38..4c13815 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2003-11-02 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/9810 + * g++.dg/template/using8.C: New test. + * g++.old-deja/g++.other/access11.C: Adjust expected error location. + 2003-11-02 Roger Sayle <roger@eyesopen.com> PR optimization/10817 diff --git a/gcc/testsuite/g++.dg/template/using8.C b/gcc/testsuite/g++.dg/template/using8.C new file mode 100644 index 0000000..a791587 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/using8.C @@ -0,0 +1,22 @@ +// { dg-do compile } + +// Origin: Sergey Shandar <comer@pisem.net> + +// PR c++/9810: Access checking for member function template +// appeared in using declaration. + +struct A +{ + template<class R> void F(R) {} +}; + +struct B: private A +{ + using A::F; +}; + +int main() +{ + B b; + b.F(3); +} diff --git a/gcc/testsuite/g++.old-deja/g++.other/access11.C b/gcc/testsuite/g++.old-deja/g++.other/access11.C index 72fc333..fb97824 100644 --- a/gcc/testsuite/g++.old-deja/g++.other/access11.C +++ b/gcc/testsuite/g++.old-deja/g++.other/access11.C @@ -5,12 +5,12 @@ class A { private: - template <class T> void g(T t) {} + template <class T> void g(T t) {} // { dg-error "" } private int i; }; template <> -void A::g<int>(int t) { i = 1; } // { dg-error "" } private +void A::g<int>(int t) { i = 1; } int main() { |