Basing on discussions with Jason, I'm filing this PR, distilled from a typical library-only implementation of std::is_convertible instantiated with D and A, where A is an ambiguous base of D.
As a matter of fact, I'm personally not *completely* sure that SFINAE should apply here, but I'm tempted to believe than for is_convertible one cannot do much better than the below at the library-only level - I just checked that boost::is_convertible behaves exactly the same. In any case, better double checking with Jason: struct A { }; struct B : public A { }; struct C : public A { }; struct D : public B, public C { }; template<typename _From, typename _To> class mini_is_convertible { typedef char __one; typedef struct { char __arr[2]; } __two; static __one __test(_To); static __two __test(...); public: static const bool __value = sizeof(__test(_From())) == 1; }; void foo() { mini_is_convertible<D, A>::__value; } -- Summary: Problem with SFINAE and ambiguous base Product: gcc Version: 4.6.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: paolo dot carlini at oracle dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44896