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

Reply via email to