aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKriang Lerdsuwanakij <lerdsuwa@users.sourceforge.net>2003-05-18 09:42:12 +0000
committerKriang Lerdsuwanakij <lerdsuwa@gcc.gnu.org>2003-05-18 09:42:12 +0000
commit25903d03442b16235d3198031754e321e0c787c8 (patch)
tree27deb9add3b4a28ee4fbfd8d4f3136c9d635c6c7
parent8849fb4939f6f95f22e8e02126e608b85787693c (diff)
downloadgcc-25903d03442b16235d3198031754e321e0c787c8.zip
gcc-25903d03442b16235d3198031754e321e0c787c8.tar.gz
gcc-25903d03442b16235d3198031754e321e0c787c8.tar.bz2
semantics.c (perform_deferred_access_checks): Don't discard checked access.
* semantics.c (perform_deferred_access_checks): Don't discard checked access. * g++.dg/parse/access2.C: New test. From-SVN: r66925
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/semantics.c19
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/g++.dg/parse/access2.C15
4 files changed, 39 insertions, 4 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index b269645..bf1c262 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index 082bc78..be524be 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 8ee74fa..a2ad87c 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..ee8cd23
--- /dev/null
+++ b/gcc/testsuite/g++.dg/parse/access2.C
@@ -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" }