Commit 742b0bcd by Jason Merrill Committed by Paolo Carlini

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
parent 328ece7d
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> 2012-07-31 Paolo Carlini <paolo.carlini@oracle.com>
* pt.c (check_default_tmpl_args): Change is_primary and is_partial * pt.c (check_default_tmpl_args): Change is_primary and is_partial
......
...@@ -729,10 +729,10 @@ DEF_VEC_ALLOC_O (qualified_typedef_usage_t,gc); ...@@ -729,10 +729,10 @@ DEF_VEC_ALLOC_O (qualified_typedef_usage_t,gc);
/* Non-zero if this template specialization has access violations that /* Non-zero if this template specialization has access violations that
should be rechecked when the function is instantiated outside argument should be rechecked when the function is instantiated outside argument
deduction. */ deduction. */
#define TINFO_RECHECK_ACCESS_P(NODE) \ #define TINFO_HAS_ACCESS_ERRORS(NODE) \
(TREE_LANG_FLAG_0 (TEMPLATE_INFO_CHECK (NODE))) (TREE_LANG_FLAG_0 (TEMPLATE_INFO_CHECK (NODE)))
#define FNDECL_RECHECK_ACCESS_P(NODE) \ #define FNDECL_HAS_ACCESS_ERRORS(NODE) \
(TINFO_RECHECK_ACCESS_P (DECL_TEMPLATE_INFO (NODE))) (TINFO_HAS_ACCESS_ERRORS (DECL_TEMPLATE_INFO (NODE)))
struct GTY(()) tree_template_info { struct GTY(()) tree_template_info {
struct tree_common common; struct tree_common common;
......
...@@ -14363,8 +14363,12 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain) ...@@ -14363,8 +14363,12 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain)
if (spec != NULL_TREE) if (spec != NULL_TREE)
{ {
if (FNDECL_RECHECK_ACCESS_P (spec) && (complain & tf_error)) if (FNDECL_HAS_ACCESS_ERRORS (spec))
recheck_decl_substitution (spec, gen_tmpl, targ_ptr); {
if (complain & tf_error)
recheck_decl_substitution (spec, gen_tmpl, targ_ptr);
return error_mark_node;
}
return spec; return spec;
} }
...@@ -14426,7 +14430,7 @@ instantiate_template_1 (tree tmpl, tree orig_args, tsubst_flags_t complain) ...@@ -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 /* Remember to reinstantiate when we're out of SFINAE so the user
can see the errors. */ can see the errors. */
FNDECL_RECHECK_ACCESS_P (fndecl) = true; FNDECL_HAS_ACCESS_ERRORS (fndecl) = true;
} }
return error_mark_node; return error_mark_node;
} }
...@@ -15122,9 +15126,11 @@ type_unification_real (tree tparms, ...@@ -15122,9 +15126,11 @@ type_unification_real (tree tparms,
location_t save_loc = input_location; location_t save_loc = input_location;
if (DECL_P (parm)) if (DECL_P (parm))
input_location = DECL_SOURCE_LOCATION (parm); input_location = DECL_SOURCE_LOCATION (parm);
push_deferring_access_checks (dk_no_deferred);
arg = tsubst_template_arg (arg, targs, complain, NULL_TREE); arg = tsubst_template_arg (arg, targs, complain, NULL_TREE);
arg = convert_template_argument (parm, arg, targs, complain, arg = convert_template_argument (parm, arg, targs, complain,
i, NULL_TREE); i, NULL_TREE);
pop_deferring_access_checks ();
input_location = save_loc; input_location = save_loc;
if (arg == error_mark_node) if (arg == error_mark_node)
return 1; return 1;
......
2012-08-02 Jason Merrill <jason@redhat.com>
Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51213 (again)
* g++.dg/cpp0x/sfinae37.C: Extend.
2012-08-02 Richard Guenther <rguenther@suse.de> 2012-08-02 Richard Guenther <rguenther@suse.de>
PR tree-optimization/50672 PR tree-optimization/50672
......
...@@ -5,6 +5,12 @@ class C { ...@@ -5,6 +5,12 @@ class C {
typedef int type; typedef int type;
}; };
template<int>
struct I;
template<>
struct I<2> { };
template<class T, class = typename T::type> template<class T, class = typename T::type>
auto f(int) -> char; auto f(int) -> char;
...@@ -13,6 +19,10 @@ auto f(...) -> char (&)[2]; ...@@ -13,6 +19,10 @@ auto f(...) -> char (&)[2];
static_assert(sizeof(f<C>(0)) == 2, "Ouch"); static_assert(sizeof(f<C>(0)) == 2, "Ouch");
typedef int testf[sizeof(f<C>(0)) == 2 ? 1 : -1];
I<sizeof(f<C>(0))> vf;
template<class T> template<class T>
auto g(int) -> decltype(typename T::type(), char()); auto g(int) -> decltype(typename T::type(), char());
...@@ -20,3 +30,7 @@ template<class> ...@@ -20,3 +30,7 @@ template<class>
auto g(...) -> char (&)[2]; auto g(...) -> char (&)[2];
static_assert(sizeof(g<C>(0)) == 2, "Ouch"); static_assert(sizeof(g<C>(0)) == 2, "Ouch");
typedef int testg[sizeof(g<C>(0)) == 2 ? 1 : -1];
I<sizeof(g<C>(0))> vg;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment