[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.


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.

From-SVN: r267144
This commit is contained in:
Alexandre Oliva 2018-12-14 20:06:15 +00:00
parent 0fca07e31d
commit b96778342f
4 changed files with 32 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2018-12-14 Jason Merrill <jason@redhat.com>
PR c++/86823
* parser.c (cp_parser_template_id): Rearrange deferred access
checks into the firewall.
2018-12-14 Jakub Jelinek <jakub@redhat.com> 2018-12-14 Jakub Jelinek <jakub@redhat.com>
PR c++/82294 PR c++/82294

View File

@ -16187,16 +16187,18 @@ cp_parser_template_id (cp_parser *parser,
is_declaration, is_declaration,
tag_type, tag_type,
&is_identifier); &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) if (templ == error_mark_node || is_identifier)
{ return templ;
pop_deferring_access_checks ();
return templ;
}
/* Since we're going to preserve any side-effects from this parse, set up a /* 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 firewall to protect our callers from cp_parser_commit_to_tentative_parse
in the template arguments. */ in the template arguments. */
tentative_firewall firewall (parser); tentative_firewall firewall (parser);
reopen_deferring_access_checks (checks);
/* If we find the sequence `[:' after a template-name, it's probably /* If we find the sequence `[:' after a template-name, it's probably
a digraph-typo for `< ::'. Substitute the tokens and check if we can a digraph-typo for `< ::'. Substitute the tokens and check if we can

View File

@ -1,3 +1,8 @@
2018-12-14 Alexandre Oliva <aoliva@redhat.com>
PR c++/86823
* g++.dg/pr86823.C: New.
2018-12-14 Jakub Jelinek <jakub@redhat.com> 2018-12-14 Jakub Jelinek <jakub@redhat.com>
PR c++/82294 PR c++/82294

View File

@ -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" }
}