diff options
author | Jason Merrill <jason@redhat.com> | 2012-08-02 14:44:58 -0400 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2012-08-02 18:44:58 +0000 |
commit | 742b0bcd66e1d8d40b19e33bf86764bbd3aa1744 (patch) | |
tree | 8dcb8f70665b36034a058e9049699008a55f672e /gcc/cp | |
parent | 328ece7de3d6903fd6e2c909e1efe1eea59fc8ec (diff) | |
download | gcc-742b0bcd66e1d8d40b19e33bf86764bbd3aa1744.zip gcc-742b0bcd66e1d8d40b19e33bf86764bbd3aa1744.tar.gz gcc-742b0bcd66e1d8d40b19e33bf86764bbd3aa1744.tar.bz2 |
PR c++/51213 (again)
/cp
2012-08-02 Jason Merrill <jason@redhat.com>
Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51213 (again)
* pt.c (type_unification_real): Call push_deferring_access_checks /
pop_deferring_access_checks around the substitution of default
template args.
(instantiate_template_1): When the specialization returned by
retrieve_specialization has FNDECL_HAS_ACCESS_ERRORS set and we
are in a SFINAE context, simply return error_mark_node.
* cp-tree.h (FNDECL_RECHECK_ACCESS_P): Rename FNDECL_HAS_ACCESS_ERRORS.
/testsuite
2012-08-02 Jason Merrill <jason@redhat.com>
Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51213 (again)
* g++.dg/cpp0x/sfinae37.C: Extend.
Co-Authored-By: Paolo Carlini <paolo.carlini@oracle.com>
From-SVN: r190093
Diffstat (limited to 'gcc/cp')
-rw-r--r-- | gcc/cp/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/cp/cp-tree.h | 6 | ||||
-rw-r--r-- | gcc/cp/pt.c | 12 |
3 files changed, 24 insertions, 6 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 8c2272e..92c9db1 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,15 @@ +2012-08-02 Jason Merrill <jason@redhat.com> + Paolo Carlini <paolo.carlini@oracle.com> + + PR c++/51213 (again) + * pt.c (type_unification_real): Call push_deferring_access_checks / + pop_deferring_access_checks around the substitution of default + template args. + (instantiate_template_1): When the specialization returned by + retrieve_specialization has FNDECL_HAS_ACCESS_ERRORS set and we + are in a SFINAE context, simply return error_mark_node. + * cp-tree.h (FNDECL_RECHECK_ACCESS_P): Rename FNDECL_HAS_ACCESS_ERRORS. + 2012-07-31 Paolo Carlini <paolo.carlini@oracle.com> * pt.c (check_default_tmpl_args): Change is_primary and is_partial diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h index ec33d92..e40f114 100644 --- a/gcc/cp/cp-tree.h +++ b/gcc/cp/cp-tree.h @@ -729,10 +729,10 @@ DEF_VEC_ALLOC_O (qualified_typedef_usage_t,gc); /* Non-zero if this template specialization has access violations that should be rechecked when the function is instantiated outside argument deduction. */ -#define TINFO_RECHECK_ACCESS_P(NODE) \ +#define TINFO_HAS_ACCESS_ERRORS(NODE) \ (TREE_LANG_FLAG_0 (TEMPLATE_INFO_CHECK (NODE))) -#define FNDECL_RECHECK_ACCESS_P(NODE) \ - (TINFO_RECHECK_ACCESS_P (DECL_TEMPLATE_INFO (NODE))) +#define FNDECL_HAS_ACCESS_ERRORS(NODE) \ + (TINFO_HAS_ACCESS_ERRORS (DECL_TEMPLATE_INFO (NODE))) struct GTY(()) tree_template_info { struct tree_common common; diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 6257502..2ae576d 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -14363,8 +14363,12 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain) if (spec != NULL_TREE) { - if (FNDECL_RECHECK_ACCESS_P (spec) && (complain & tf_error)) - recheck_decl_substitution (spec, gen_tmpl, targ_ptr); + if (FNDECL_HAS_ACCESS_ERRORS (spec)) + { + if (complain & tf_error) + recheck_decl_substitution (spec, gen_tmpl, targ_ptr); + return error_mark_node; + } return spec; } @@ -14426,7 +14430,7 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain) { /* Remember to reinstantiate when we're out of SFINAE so the user can see the errors. */ - FNDECL_RECHECK_ACCESS_P (fndecl) = true; + FNDECL_HAS_ACCESS_ERRORS (fndecl) = true; } return error_mark_node; } @@ -15122,9 +15126,11 @@ type_unification_real (tree tparms, location_t save_loc = input_location; if (DECL_P (parm)) input_location = DECL_SOURCE_LOCATION (parm); + push_deferring_access_checks (dk_no_deferred); arg = tsubst_template_arg (arg, targs, complain, NULL_TREE); arg = convert_template_argument (parm, arg, targs, complain, i, NULL_TREE); + pop_deferring_access_checks (); input_location = save_loc; if (arg == error_mark_node) return 1; |