aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2012-08-02 14:44:58 -0400
committerPaolo Carlini <paolo@gcc.gnu.org>2012-08-02 18:44:58 +0000
commit742b0bcd66e1d8d40b19e33bf86764bbd3aa1744 (patch)
tree8dcb8f70665b36034a058e9049699008a55f672e /gcc/cp
parent328ece7de3d6903fd6e2c909e1efe1eea59fc8ec (diff)
downloadgcc-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/ChangeLog12
-rw-r--r--gcc/cp/cp-tree.h6
-rw-r--r--gcc/cp/pt.c12
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;