re PR c++/58954 (accessing a private member function in decltype of a friend class causes access control error)

PR c++/58954
	* pt.c (resolve_overloaded_unification): Use instantiate_template.

From-SVN: r205952
This commit is contained in:
Jason Merrill 2013-12-12 22:58:48 -05:00 committed by Jason Merrill
parent 0bce3228e5
commit 4149642428
3 changed files with 45 additions and 1 deletions

View File

@ -1,3 +1,8 @@
2013-12-12 Jason Merrill <jason@redhat.com>
PR c++/58954
* pt.c (resolve_overloaded_unification): Use instantiate_template.
2013-12-12 Jakub Jelinek <jakub@redhat.com>
PR c++/58627

View File

@ -16407,7 +16407,7 @@ resolve_overloaded_unification (tree tparms,
if (subargs != error_mark_node
&& !any_dependent_template_arguments_p (subargs))
{
elem = tsubst (TREE_TYPE (fn), subargs, tf_none, NULL_TREE);
elem = TREE_TYPE (instantiate_template (fn, subargs, tf_none));
if (try_one_overload (tparms, targs, tempargs, parm,
elem, strict, sub_strict, addr_p, explain_p)
&& (!goodfn || !same_type_p (goodfn, elem)))

View File

@ -0,0 +1,39 @@
// PR c++/58954
// { dg-require-effective-target c++11 }
template<class T>
T&& declval();
template<class T>
struct foo_argument
{
template<class Ret, class C, class Arg>
static Arg test(Ret (C::*)(Arg));
typedef decltype(test(&T::template foo<>)) type;
};
template<class T, class>
struct dependent { typedef T type; };
template<class T>
struct base
{
template<class Ignore = void>
auto foo(int i) -> decltype(declval<
typename dependent<T&, Ignore>::type
>().foo_impl(i));
};
struct derived : base<derived>
{
friend struct base<derived>;
private:
int foo_impl(int i);
};
int main()
{
foo_argument<derived>::type var = 0;
return var;
}