re PR c++/56071 (friend class template cannot access private constructor in exception...
authorJason Merrill <jason@redhat.com>
Tue, 22 Jan 2013 16:05:04 +0000 (11:05 -0500)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 22 Jan 2013 16:05:04 +0000 (11:05 -0500)
PR c++/56071
* pt.c (maybe_instantiate_noexcept): Don't defer access checks.

From-SVN: r195378

gcc/cp/ChangeLog
gcc/cp/pt.c
gcc/testsuite/g++.dg/cpp0x/noexcept20.C [new file with mode: 0644]

index b9f68fe0e679ebddbcf206b0a0c0c127266335c6..7da2b4aa5694cbf5dc175f0b91e1c0b3e4926c97 100644 (file)
@@ -1,3 +1,8 @@
+2013-01-22  Jason Merrill  <jason@redhat.com>
+
+       PR c++/56071
+       * pt.c (maybe_instantiate_noexcept): Don't defer access checks.
+
 2013-01-22  Dodji Seketeli  <dodji@redhat.com>
 
        PR c++/53609
index e38aca61a6c96f8068de4986519bc46965ae7529..01d4295975433505ff507b89262645eeff05c22c 100644 (file)
@@ -18429,12 +18429,14 @@ maybe_instantiate_noexcept (tree fn)
       if (push_tinst_level (fn))
        {
          push_access_scope (fn);
+         push_deferring_access_checks (dk_no_deferred);
          input_location = DECL_SOURCE_LOCATION (fn);
          noex = tsubst_copy_and_build (DEFERRED_NOEXCEPT_PATTERN (noex),
                                        DEFERRED_NOEXCEPT_ARGS (noex),
                                        tf_warning_or_error, fn,
                                        /*function_p=*/false,
                                        /*integral_constant_expression_p=*/true);
+         pop_deferring_access_checks ();
          pop_access_scope (fn);
          pop_tinst_level ();
          spec = build_noexcept_spec (noex, tf_warning_or_error);
diff --git a/gcc/testsuite/g++.dg/cpp0x/noexcept20.C b/gcc/testsuite/g++.dg/cpp0x/noexcept20.C
new file mode 100644 (file)
index 0000000..b867602
--- /dev/null
@@ -0,0 +1,22 @@
+// PR c++/56071
+// { dg-options -std=c++11 }
+
+class B
+{
+  template <typename T> friend struct A;
+  B() {}
+};
+
+template <typename T>
+struct A
+{
+  A() noexcept(noexcept(B())) { }
+};
+
+struct C
+{
+  C()
+  {
+    static_assert( !noexcept(A<int>()), "" );
+  }
+};