This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] [PR86823] retain deferred access checks from outside firewall


OK.
On Thu, Dec 13, 2018 at 8:35 PM Alexandre Oliva <aoliva@redhat.com> wrote:
>
> On Dec  6, 2018, Alexandre Oliva <aoliva@redhat.com> wrote:
>
> > I'm giving your proposed patch a full round of testing along with other
> > patches.
>
> [PR86823] retain deferred access checks from outside firewall
>
> We used to preserve deferred access check along with resolved template
> ids, but a tentative parsing firewall introduced additional layers of
> deferred access checks, so that we don't preserve the checks we
> want to any more.
>
> This patch moves the deferred access checks from outside the firewall
> into it.
>
> Regstrapped on x86_64- and i686-linux-gnu.  Ok to install?
>
>
> From: Jason Merrill <jason@redhat.com>
> for  gcc/cp/ChangeLog
>
>         PR c++/86823
>         * parser.c (cp_parser_template_id): Rearrange deferred access
>         checks into the firewall.
>
> From: Alexandre Oliva <aoliva@redhat.com>
> for  gcc/testsuite/ChangeLog
>
>         PR c++/86823
>         * g++.dg/pr86823.C: New.
> ---
>  gcc/cp/parser.c                |   10 ++++++----
>  gcc/testsuite/g++.dg/pr86823.C |   15 +++++++++++++++
>  2 files changed, 21 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/g++.dg/pr86823.C
>
> diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
> index adfe09e494dc..0bf0e309a588 100644
> --- a/gcc/cp/parser.c
> +++ b/gcc/cp/parser.c
> @@ -16182,16 +16182,18 @@ cp_parser_template_id (cp_parser *parser,
>                                    is_declaration,
>                                    tag_type,
>                                    &is_identifier);
> +
> +  /* Push any access checks inside the firewall we're about to create.  */
> +  vec<deferred_access_check, va_gc> *checks = get_deferred_access_checks ();
> +  pop_deferring_access_checks ();
>    if (templ == error_mark_node || is_identifier)
> -    {
> -      pop_deferring_access_checks ();
> -      return templ;
> -    }
> +    return templ;
>
>    /* Since we're going to preserve any side-effects from this parse, set up a
>       firewall to protect our callers from cp_parser_commit_to_tentative_parse
>       in the template arguments.  */
>    tentative_firewall firewall (parser);
> +  reopen_deferring_access_checks (checks);
>
>    /* If we find the sequence `[:' after a template-name, it's probably
>       a digraph-typo for `< ::'. Substitute the tokens and check if we can
> diff --git a/gcc/testsuite/g++.dg/pr86823.C b/gcc/testsuite/g++.dg/pr86823.C
> new file mode 100644
> index 000000000000..18914b00aa8d
> --- /dev/null
> +++ b/gcc/testsuite/g++.dg/pr86823.C
> @@ -0,0 +1,15 @@
> +// { dg-do compile }
> +
> +struct X {
> +private:
> +  template<typename T>
> +  struct Y {
> +    int data;
> +  };
> +public:
> +  int value;
> +};
> +
> +int main() {
> +  typename X::Y<int> a; // { dg-error "private" }
> +}
>
>
> --
> Alexandre Oliva, freedom fighter   https://FSFLA.org/blogs/lxo
> Be the change, be Free!         FSF Latin America board member
> GNU Toolchain Engineer                Free Software Evangelist
> Hay que enGNUrecerse, pero sin perder la terGNUra jamás-GNUChe


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]