https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80245

Jonathan Wakely <redi at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
         Resolution|---                         |DUPLICATE

--- Comment #1 from Jonathan Wakely <redi at gcc dot gnu.org> ---
Reduced:

struct B { void operator()(char){} };

template <int>
struct base : B {};

struct ob : base<0>, base<1>
{
  using base<0>::operator(); // char
  using base<1>::operator(); // char
};

template <class...>
using void_t = void;

template <class, class = void>
struct is_ambiguous { };

template <class T>
struct is_ambiguous<T, void_t<decltype(T{}('a'))>> { };

is_ambiguous<ob> test;

ambig.cc: In instantiation of 'struct is_ambiguous<ob>':
ambig.cc:21:18:   required from here
ambig.cc:19:43: error: 'B' is an ambiguous base of 'ob'
 struct is_ambiguous<T, void_t<decltype(T{}('a'))>> { };
                                        ~~~^~~~~
ambig.cc:19:43: error: 'B' is an ambiguous base of 'ob'

> The request for an ambiguous member function call produces a SFINAE-friendly
> context on `clang++5`, allowing the `is_ambiguous` detection to properly
> take place.

I don't think the problem for GCC is that it's not a SFINAE-friendly context,
it's that it gives a different answer in the SFINAE context and when
instantiated. So this is the same as PR 84689.

*** This bug has been marked as a duplicate of bug 84689 ***

Reply via email to