[Bug c++/58954] accessing a private member function in decltype of a friend class causes access control error

daniel.kruegler at googlemail dot com gcc-bugzilla@gcc.gnu.org
Fri Nov 1 06:53:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58954

Daniel Krügler <daniel.kruegler at googlemail dot com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |daniel.kruegler@googlemail.
                   |                            |com

--- Comment #1 from Daniel Krügler <daniel.kruegler at googlemail dot com> ---
This seems to be a regression, the example was accepted in gcc 4.7.3.

The following is a first attempt to reduce the complexity of the example, in
particular by removing any library dependencies and any possible interaction
with alias templates and alias typedefs, furthermore the additional friend
declaration in template base is neither needed nor should it be relevant for
this issue, therefore has been removed:

//---------------
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;
}
//---------------


More information about the Gcc-bugs mailing list