aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2019-03-18 11:58:24 -0400
committerJason Merrill <jason@gcc.gnu.org>2019-03-18 11:58:24 -0400
commitb6e45a40cde2c8e7a18b62cca23dcd2f6916afa1 (patch)
treea190096cda3c6cb88a3573692e82d805f3f14f1f
parentca6d4a08c120841654acb10b973b0d009b053ef3 (diff)
downloadgcc-b6e45a40cde2c8e7a18b62cca23dcd2f6916afa1.zip
gcc-b6e45a40cde2c8e7a18b62cca23dcd2f6916afa1.tar.gz
gcc-b6e45a40cde2c8e7a18b62cca23dcd2f6916afa1.tar.bz2
PR c++/89682 - wrong access error in default argument.
Here we were pushing into the right access context, but we were called from a deferred checking context, so didn't end up doing the checks until after we left the access context. * pt.c (tsubst_default_argument): Don't defer access checks. From-SVN: r269766
-rw-r--r--gcc/cp/ChangeLog5
-rw-r--r--gcc/cp/pt.c2
-rw-r--r--gcc/testsuite/g++.dg/overload/defarg12.C14
3 files changed, 21 insertions, 0 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index fa569bc..bc3850d 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,8 @@
+2019-03-18 Jason Merrill <jason@redhat.com>
+
+ PR c++/89682 - wrong access error in default argument.
+ * pt.c (tsubst_default_argument): Don't defer access checks.
+
2019-03-18 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/85014
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index dc5c24c..7dc6e44 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -12776,6 +12776,7 @@ tsubst_default_argument (tree fn, int parmnum, tree type, tree arg,
rather than in the current class. */
push_to_top_level ();
push_access_scope (fn);
+ push_deferring_access_checks (dk_no_deferred);
start_lambda_scope (parm);
/* The default argument expression may cause implicitly defined
@@ -12799,6 +12800,7 @@ tsubst_default_argument (tree fn, int parmnum, tree type, tree arg,
inform (input_location,
" when instantiating default argument for call to %qD", fn);
+ pop_deferring_access_checks ();
pop_access_scope (fn);
pop_from_top_level ();
diff --git a/gcc/testsuite/g++.dg/overload/defarg12.C b/gcc/testsuite/g++.dg/overload/defarg12.C
new file mode 100644
index 0000000..4a2b7e5
--- /dev/null
+++ b/gcc/testsuite/g++.dg/overload/defarg12.C
@@ -0,0 +1,14 @@
+// PR c++/89682
+
+template <typename T>
+class C {
+ class TagType {};
+public:
+ C(int, TagType = makeTag());
+private:
+ static TagType makeTag();
+};
+
+void test() {
+ C<int>(1);
+}