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
This commit is contained in:
Jason Merrill 2012-08-02 14:44:58 -04:00 committed by Paolo Carlini
parent 328ece7de3
commit 742b0bcd66
5 changed files with 44 additions and 6 deletions

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -1,3 +1,9 @@
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>
PR tree-optimization/50672

View File

@ -5,6 +5,12 @@ class C {
typedef int type;
};
template<int>
struct I;
template<>
struct I<2> { };
template<class T, class = typename T::type>
auto f(int) -> char;
@ -13,6 +19,10 @@ auto f(...) -> char (&)[2];
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>
auto g(int) -> decltype(typename T::type(), char());
@ -20,3 +30,7 @@ template<class>
auto g(...) -> char (&)[2];
static_assert(sizeof(g<C>(0)) == 2, "Ouch");
typedef int testg[sizeof(g<C>(0)) == 2 ? 1 : -1];
I<sizeof(g<C>(0))> vg;