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:
parent
0bce3228e5
commit
4149642428
@ -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
|
||||
|
@ -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)))
|
||||
|
39
gcc/testsuite/g++.dg/cpp0x/access02.C
Normal file
39
gcc/testsuite/g++.dg/cpp0x/access02.C
Normal 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;
|
||||
}
|
Loading…
Reference in New Issue
Block a user