From: Kriang Lerdsuwanakij Date: Sun, 18 May 2003 09:42:12 +0000 (+0000) Subject: semantics.c (perform_deferred_access_checks): Don't discard checked access. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=25903d03442b16235d3198031754e321e0c787c8;p=gcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index b269645f4b4..bf1c262afaf 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,8 @@ +2003-05-18 Kriang Lerdsuwanakij + + * semantics.c (perform_deferred_access_checks): Don't discard + checked access. + 2003-05-17 Kaveh R. Ghazi * 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 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8ee74fa3fd1..a2ad87c929b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-05-18 Kriang Lerdsuwanakij + + * g++.dg/parse/access2.C: New test. + 2003-05-17 Mark Mitchell * 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 00000000000..ee8cd234e07 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/access2.C @@ -0,0 +1,15 @@ +// Copyright (C) 2003 Free Software Foundation +// Contributed by Kriang Lerdsuwanakij +// { 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" }