diff options
author | lerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-18 09:42:12 +0000 |
---|---|---|
committer | lerdsuwa <lerdsuwa@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-05-18 09:42:12 +0000 |
commit | 895bc69140fa92ab577dfeffb3b614e8081cd87c (patch) | |
tree | 27deb9add3b4a28ee4fbfd8d4f3136c9d635c6c7 /gcc/cp/semantics.c | |
parent | 11b0ccc8f85195b6543892ba67a46dc07aed7dad (diff) | |
download | ppe42-gcc-895bc69140fa92ab577dfeffb3b614e8081cd87c.tar.gz ppe42-gcc-895bc69140fa92ab577dfeffb3b614e8081cd87c.zip |
* semantics.c (perform_deferred_access_checks): Don't discard
checked access.
* g++.dg/parse/access2.C: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@66925 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/cp/semantics.c')
-rw-r--r-- | gcc/cp/semantics.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 082bc788f1e..be524bef5dd 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 |