diff options
author | Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> | 2003-08-19 12:55:00 +0000 |
---|---|---|
committer | Kriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org> | 2003-08-19 12:55:00 +0000 |
commit | b54f5338d920cc2365a0e3f09dc7cefe2bd6258e (patch) | |
tree | 2af4698f783f34d32d20523a83a198c5df2680ae /gcc | |
parent | 3ab37c7de76a6e34d40c9c9bd9a0101d9accfb33 (diff) | |
download | gcc-b54f5338d920cc2365a0e3f09dc7cefe2bd6258e.zip gcc-b54f5338d920cc2365a0e3f09dc7cefe2bd6258e.tar.gz gcc-b54f5338d920cc2365a0e3f09dc7cefe2bd6258e.tar.bz2 |
re PR c++/11174 (derived class can access protected base class member function through pointer to member function)
PR c++/11174
* init.c (build_offset_ref): Perform access checking for
pointer to member correctly.
* g++.dg/parse/access4.C: New test.
* g++.dg/parse/access5.C: Likewise.
* g++.old-deja/g++.jason/access17.C: Adjust error message.
From-SVN: r70566
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/cp/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/init.c | 21 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/access4.C | 20 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/parse/access5.C | 18 | ||||
-rw-r--r-- | gcc/testsuite/g++.old-deja/g++.jason/access17.C | 2 |
6 files changed, 71 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4d10e69..958f53fa 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2003-08-19 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/11174 + * init.c (build_offset_ref): Perform access checking for + pointer to member correctly. + 2003-08-19 Gabriel Dos Reis <gdr@integrable-solutions.net> * cp-lang.c (LANG_HOOKS_INITIALIZE_DIAGNOSTICS): Fix spelling. diff --git a/gcc/cp/init.c b/gcc/cp/init.c index 0cd7270..032959c 100644 --- a/gcc/cp/init.c +++ b/gcc/cp/init.c @@ -1502,8 +1502,20 @@ build_offset_ref (tree type, tree name, bool address_p) /* Get rid of a potential OVERLOAD around it */ t = OVL_CURRENT (t); - /* unique functions are handled easily. */ - perform_or_defer_access_check (basebinfo, t); + /* Unique functions are handled easily. */ + + /* For non-static member of base class, we need a special rule + for access checking [class.protected]: + + If the access is to form a pointer to member, the + nested-name-specifier shall name the derived class + (or any class derived from that class). */ + if (address_p && DECL_P (t) + && DECL_NONSTATIC_MEMBER_P (t)) + perform_or_defer_access_check (TYPE_BINFO (type), t); + else + perform_or_defer_access_check (basebinfo, t); + mark_used (t); if (DECL_STATIC_FUNCTION_P (t)) return t; @@ -1515,6 +1527,11 @@ build_offset_ref (tree type, tree name, bool address_p) member = fnfields; } } + else if (address_p && TREE_CODE (member) == FIELD_DECL) + /* We need additional test besides the one in + check_accessibility_of_qualified_id in case it is + a pointer to non-static member. */ + perform_or_defer_access_check (TYPE_BINFO (type), member); if (!address_p) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 29553cd..7bce0ed 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2003-08-19 Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net> + + PR c++/11174 + * g++.dg/parse/access4.C: New test. + * g++.dg/parse/access5.C: Likewise. + * g++.old-deja/g++.jason/access17.C: Adjust error message. + 2003-08-18 Matt Kraai <kraai@alumni.cmu.edu> * gcc.dg/noncompile/20030818-1.c: New. diff --git a/gcc/testsuite/g++.dg/parse/access4.C b/gcc/testsuite/g++.dg/parse/access4.C new file mode 100644 index 0000000..d3870bd --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access4.C @@ -0,0 +1,20 @@ +// { dg-do compile } + +// Origin: Mike Reed <mike.reed@amadron.com> + +// PR c++/11174: Access checking of pointer-to-member function + +class A { +protected: + void foo() {} // { dg-error "protected" } +public: + A(); +}; + +class B : public A { + void bar() { + A a; + void (A::*pmf)() = &A::foo; // { dg-error "this context" } + (a.*pmf)(); + } +}; diff --git a/gcc/testsuite/g++.dg/parse/access5.C b/gcc/testsuite/g++.dg/parse/access5.C new file mode 100644 index 0000000..cd1789e --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access5.C @@ -0,0 +1,18 @@ +// { dg-do compile } + +// Origin: Giovanni Bajo <giovannibajo@libero.it> + +// PR c++/11174: Access checking on pointer to member data. + +struct A +{ +protected: + int a; // { dg-error "protected" } +}; + +struct B : A +{ + void foo() { + (void)&A::a; // { dg-error "this context" } + } +}; diff --git a/gcc/testsuite/g++.old-deja/g++.jason/access17.C b/gcc/testsuite/g++.old-deja/g++.jason/access17.C index f7a7acb..ec8949d 100644 --- a/gcc/testsuite/g++.old-deja/g++.jason/access17.C +++ b/gcc/testsuite/g++.old-deja/g++.jason/access17.C @@ -13,7 +13,7 @@ struct B: public A { }; int A::* B::p = &A::i; // { dg-error "" } -int (A::* B::fp)() = &A::f; // ERROR - +int (A::* B::fp)() = &A::f; // { dg-error "" } struct C { static int A::*p; |