semantics.c (perform_deferred_access_checks): Don't discard checked access.
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
Sun, 18 May 2003 09:42:12 +0000 (09:42 +0000)
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>
Sun, 18 May 2003 09:42:12 +0000 (09:42 +0000)
* semantics.c (perform_deferred_access_checks): Don't discard
checked access.

* g++.dg/parse/access2.C: New test.

From-SVN: r66925

gcc/cp/ChangeLog
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/parse/access2.C [new file with mode: 0644]

index b269645..bf1c262 100644 (file)
@@ -1,3 +1,8 @@
+2003-05-18  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       * semantics.c (perform_deferred_access_checks): Don't discard
+       checked access.
+
 2003-05-17  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * error.c (cp_error_at, cp_warning_at, cp_pedwarn_at): Eliminate
index 082bc78..be524be 100644 (file)
@@ -234,7 +234,21 @@ void pop_to_parent_deferring_access_checks (void)
   pop_deferring_access_checks ();
 }
 
-/* Perform the deferred access checks.  */
+/* Perform the deferred access checks.
+
+   After performing the checks, we still have to keep the list
+   `deferred_access_stack->deferred_access_checks' since we may want
+   to check access for them again later in a different context.
+   For example:
+
+     class A {
+       typedef int X;
+       static X a;
+     };
+     A::X A::a, x;     // No error for `A::a', error for `x'
+
+   We have to perform deferred access of `A::X', first with `A::a',
+   next with `x'.  */
 
 void perform_deferred_access_checks (void)
 {
@@ -245,9 +259,6 @@ void perform_deferred_access_checks (void)
     /* Check access.  */
     enforce_access (TREE_PURPOSE (deferred_check), 
                    TREE_VALUE (deferred_check));
-
-  /* No more deferred checks.  */
-  deferred_access_stack->deferred_access_checks = NULL_TREE;
 }
 
 /* Defer checking the accessibility of DECL, when looked up in
index 8ee74fa..a2ad87c 100644 (file)
@@ -1,3 +1,7 @@
+2003-05-18  Kriang Lerdsuwanakij  <lerdsuwa@users.sourceforge.net>
+
+       * g++.dg/parse/access2.C: New test.
+
 2003-05-17  Mark Mitchell  <mark@codesourcery.com>
 
        * lib/gcc-dg.exp (gcc-dg-debug-runtest): New method.
diff --git a/gcc/testsuite/g++.dg/parse/access2.C b/gcc/testsuite/g++.dg/parse/access2.C
new file mode 100644 (file)
index 0000000..ee8cd23
--- /dev/null
@@ -0,0 +1,15 @@
+// Copyright (C) 2003 Free Software Foundation
+// Contributed by Kriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>
+// { dg-do compile }
+
+// Deferred access checking of variable declaration.
+
+class A {
+  typedef int X;       // { dg-error "private" }
+  static X a, b, c;
+};
+
+A::X A::a;
+A::X A::b, x;          // { dg-error "this context" }
+A::X y, A::c;          // { dg-error "this context" }
+A::X z;                        // { dg-error "this context" }