[PR86823] retain deferred access checks from outside firewall
authorAlexandre Oliva <aoliva@gcc.gnu.org>
Fri, 14 Dec 2018 20:06:15 +0000 (20:06 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Fri, 14 Dec 2018 20:06:15 +0000 (20:06 +0000)
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

gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/pr86823.C [new file with mode: 0644]

index 6460a666e985b1c2955854e2ef76935410413ffa..0467ca277613e6f41f9e072a29e749e5394fce97 100644 (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>
 
        PR c++/82294
index 7ff113f3c0fa4ae44d63009ecc4023a37aecb055..b57e35d04c5b32b43705d00411f4b3fae72ff24d 100644 (file)
@@ -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
index 1374be13f0eb0452acf4ab0ca1aa498c8c834395..4af1cf9423d2c3108b7420d4aacddb943299df01 100644 (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>
 
        PR c++/82294
diff --git a/gcc/testsuite/g++.dg/pr86823.C b/gcc/testsuite/g++.dg/pr86823.C
new file mode 100644 (file)
index 0000000..18914b0
--- /dev/null
@@ -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" }
+}