From b83eeaf21d308fff6007e099445e05904088bc0c Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 12 Jul 2012 22:57:03 +0000 Subject: [PATCH] * pt.c (deduction_tsubst_fntype): Just suppress access checking. (instantiate_template_1): Set DECL_TI_TEMPLATE before access checking. (push_deduction_access_scope, pop_deduction_access_scope): Remove. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189443 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/cp/ChangeLog | 6 ++++ gcc/cp/pt.c | 45 +++++------------------------ gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/g++.dg/template/sfinae6_neg.C | 2 +- 4 files changed, 18 insertions(+), 39 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index fd2ba7315cd..299116b81fa 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2012-07-12 Jason Merrill + + * pt.c (deduction_tsubst_fntype): Just suppress access checking. + (instantiate_template_1): Set DECL_TI_TEMPLATE before access checking. + (push_deduction_access_scope, pop_deduction_access_scope): Remove. + 2012-07-11 Jason Merrill DR 1402 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 72b0c4f18b2..fec88eb4a34 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -116,8 +116,6 @@ enum template_base_result { static void push_access_scope (tree); static void pop_access_scope (tree); -static void push_deduction_access_scope (tree); -static void pop_deduction_access_scope (tree); static bool resolve_overloaded_unification (tree, tree, tree, tree, unification_kind_t, int, bool); @@ -14263,9 +14261,10 @@ deduction_tsubst_fntype (tree fn, tree targs, tsubst_flags_t complain) input_location = DECL_SOURCE_LOCATION (fn); ++deduction_depth; - push_deduction_access_scope (fn); + /* We will do access checks in instantiate_template. */ + push_deferring_access_checks (dk_deferred); r = tsubst (fntype, targs, complain, NULL_TREE); - pop_deduction_access_scope (fn); + pop_deferring_access_checks (); --deduction_depth; if (excessive_deduction_depth) @@ -14374,6 +14373,10 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain) if (fndecl == error_mark_node) return error_mark_node; + /* The DECL_TI_TEMPLATE should always be the immediate parent + template, not the most general template. */ + DECL_TI_TEMPLATE (fndecl) = tmpl; + /* Now we know the specialization, compute access previously deferred. */ push_access_scope (fndecl); @@ -14387,10 +14390,6 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain) pop_access_scope (fndecl); pop_deferring_access_checks (); - /* The DECL_TI_TEMPLATE should always be the immediate parent - template, not the most general template. */ - DECL_TI_TEMPLATE (fndecl) = tmpl; - /* If we've just instantiated the main entry point for a function, instantiate all the alternate entry points as well. We do this by cloning the instantiation of the main entry point, not by @@ -14413,36 +14412,6 @@ instantiate_template (tree tmpl, tree orig_args, tsubst_flags_t complain) return ret; } -/* We're going to do deduction substitution on the type of TMPL, a function - template. In C++11 mode, push into that access scope. In C++03 mode, - disable access checking. */ - -static void -push_deduction_access_scope (tree tmpl) -{ - if (cxx_dialect >= cxx0x) - { - int ptd = processing_template_decl; - push_access_scope (DECL_TEMPLATE_RESULT (tmpl)); - /* Preserve processing_template_decl across push_to_top_level. */ - if (ptd && !processing_template_decl) - ++processing_template_decl; - } - else - push_deferring_access_checks (dk_no_check); -} - -/* And pop back out. */ - -static void -pop_deduction_access_scope (tree tmpl) -{ - if (cxx_dialect >= cxx0x) - pop_access_scope (DECL_TEMPLATE_RESULT (tmpl)); - else - pop_deferring_access_checks (); -} - /* PARM is a template parameter pack for FN. Returns true iff PARM is used in a deducible way in the argument list of FN. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8cb337b11af..c794248ef27 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2012-07-12 Jason Merrill + + * g++.dg/template/sfinae6_neg.C: Adjust. + 2012-07-12 Tobias Burnus * gfortran.dg/c_f_pointer_shape_tests_5.f90: New. diff --git a/gcc/testsuite/g++.dg/template/sfinae6_neg.C b/gcc/testsuite/g++.dg/template/sfinae6_neg.C index 9b7bdfd134d..c238222af75 100644 --- a/gcc/testsuite/g++.dg/template/sfinae6_neg.C +++ b/gcc/testsuite/g++.dg/template/sfinae6_neg.C @@ -14,7 +14,7 @@ template struct enable_if { }; template typename enable_if()(create_a(), create_a()), 1), yes_type>::type - check_is_callable2(type, type, type); // { dg-error "within this context" "" { target c++11 } } + check_is_callable2(type, type, type); no_type check_is_callable2(...); -- 2.11.4.GIT