OSDN Git Service

PR c++/11174
authorlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Aug 2003 12:55:00 +0000 (12:55 +0000)
committerlerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 19 Aug 2003 12:55:00 +0000 (12:55 +0000)
* 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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@70566 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/cp/ChangeLog
gcc/cp/init.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/access4.C [new file with mode: 0644]
gcc/testsuite/g++.dg/parse/access5.C [new file with mode: 0644]
gcc/testsuite/g++.old-deja/g++.jason/access17.C

index 4d10e69..958f53f 100644 (file)
@@ -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.
index 0cd7270..032959c 100644 (file)
@@ -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)
     {
index 29553cd..7bce0ed 100644 (file)
@@ -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 (file)
index 0000000..d3870bd
--- /dev/null
@@ -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 (file)
index 0000000..cd1789e
--- /dev/null
@@ -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" }
+  }
+};
index f7a7acb..ec8949d 100644 (file)
@@ -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;