Commit ae177d35 by Jason Merrill Committed by Jason Merrill

PR c++/61806 - missed SFINAE with partial specialization.

	* cp-tree.h (deferring_access_check_sentinel): Add deferring_kind
	parameter to constructor.
	* pt.c (instantiate_class_template_1): Enable access checking
	before call to most_specialized_partial_spec.

From-SVN: r261151
parent 8566678b
2018-06-04 Jason Merrill <jason@redhat.com> 2018-06-04 Jason Merrill <jason@redhat.com>
PR c++/61806 - missed SFINAE with partial specialization.
* cp-tree.h (deferring_access_check_sentinel): Add deferring_kind
parameter to constructor.
* pt.c (instantiate_class_template_1): Enable access checking
before call to most_specialized_partial_spec.
PR c++/85765 - SFINAE and non-type default template arg. PR c++/85765 - SFINAE and non-type default template arg.
* pt.c (type_unification_real): Do full semantic processing if * pt.c (type_unification_real): Do full semantic processing if
substituting a partial args list replaces all template parms. substituting a partial args list replaces all template parms.
......
...@@ -6807,9 +6807,9 @@ extern bool perform_or_defer_access_check (tree, tree, tree, ...@@ -6807,9 +6807,9 @@ extern bool perform_or_defer_access_check (tree, tree, tree,
struct deferring_access_check_sentinel struct deferring_access_check_sentinel
{ {
deferring_access_check_sentinel () deferring_access_check_sentinel (enum deferring_kind kind = dk_deferred)
{ {
push_deferring_access_checks (dk_deferred); push_deferring_access_checks (kind);
} }
~deferring_access_check_sentinel () ~deferring_access_check_sentinel ()
{ {
......
...@@ -10850,6 +10850,10 @@ instantiate_class_template_1 (tree type) ...@@ -10850,6 +10850,10 @@ instantiate_class_template_1 (tree type)
/* Mark the type as in the process of being defined. */ /* Mark the type as in the process of being defined. */
TYPE_BEING_DEFINED (type) = 1; TYPE_BEING_DEFINED (type) = 1;
/* We may be in the middle of deferred access check. Disable
it now. */
deferring_access_check_sentinel acs (dk_no_deferred);
/* Determine what specialization of the original template to /* Determine what specialization of the original template to
instantiate. */ instantiate. */
t = most_specialized_partial_spec (type, tf_warning_or_error); t = most_specialized_partial_spec (type, tf_warning_or_error);
...@@ -10889,10 +10893,6 @@ instantiate_class_template_1 (tree type) ...@@ -10889,10 +10893,6 @@ instantiate_class_template_1 (tree type)
if (! push_tinst_level (type)) if (! push_tinst_level (type))
return type; return type;
/* We may be in the middle of deferred access check. Disable
it now. */
push_deferring_access_checks (dk_no_deferred);
int saved_unevaluated_operand = cp_unevaluated_operand; int saved_unevaluated_operand = cp_unevaluated_operand;
int saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings; int saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
...@@ -11373,7 +11373,6 @@ instantiate_class_template_1 (tree type) ...@@ -11373,7 +11373,6 @@ instantiate_class_template_1 (tree type)
maximum_field_alignment = saved_maximum_field_alignment; maximum_field_alignment = saved_maximum_field_alignment;
if (!fn_context) if (!fn_context)
pop_from_top_level (); pop_from_top_level ();
pop_deferring_access_checks ();
pop_tinst_level (); pop_tinst_level ();
/* The vtable for a template class can be emitted in any translation /* The vtable for a template class can be emitted in any translation
......
// PR c++/61806
// { dg-do compile { target c++11 } }
struct true_type
{
static const bool value = true;
};
struct false_type
{
static const bool value = false;
};
template<class T>
T&& declval();
template<typename> struct check { typedef void type; };
template<typename T, typename Enable = void>
struct has_public_f : false_type {};
template<typename T>
struct has_public_f<
T,
typename check<
decltype(
declval<T&>().f()
)
>::type
> : true_type {};
struct Spub { public: void f(); };
struct Spriv { private: void f(); };
static_assert( has_public_f<Spub>::value, "Ouch");
static_assert(!has_public_f<Spriv>::value, "Ouch");
int main() {}
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