[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:
parent
0fca07e31d
commit
b96778342f
4 changed files with 32 additions and 4 deletions
|
@ -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>
|
||||
|
||||
PR c++/82294
|
||||
|
|
|
@ -16187,16 +16187,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
|
||||
|
|
|
@ -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>
|
||||
|
||||
PR c++/82294
|
||||
|
|
15
gcc/testsuite/g++.dg/pr86823.C
Normal file
15
gcc/testsuite/g++.dg/pr86823.C
Normal 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" }
|
||||
}
|
Loading…
Add table
Reference in a new issue