aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2003-08-19 12:55:00 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2003-08-19 12:55:00 +0000
commitb54f5338d920cc2365a0e3f09dc7cefe2bd6258e (patch)
tree2af4698f783f34d32d20523a83a198c5df2680ae
parent3ab37c7de76a6e34d40c9c9bd9a0101d9accfb33 (diff)
downloadgcc-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
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/init.c21
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/g++.dg/parse/access4.C20
-rw-r--r--gcc/testsuite/g++.dg/parse/access5.C18
-rw-r--r--gcc/testsuite/g++.old-deja/g++.jason/access17.C2
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;