http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57874
Bug ID: 57874 Summary: No SFINAE on ADL lookup failure Product: gcc Version: 4.7.3 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: gpderetta at gmail dot com It seems that at least GCC 4.7 fails with an hard error on failure to lookup a function via ADL in a sfinae context, if a function of that name is not visible in scope. The following test fails to compile unless WORKAROUND is defined: #ifdef WORKAROUND struct unusable{}; void foo(unusable); #endif namespace NX { struct X {}; void foo(X){} } namespace NY { struct Y {}; } template<class T> auto ADLfoo(T&&x) -> decltype((foo(T{}), short())); //decltype(foo(x)); char ADLfoo(...); static_assert(sizeof(ADLfoo(NY::Y{})) == 1, ""); static_assert(sizeof(ADLfoo(NX::X{})) == 2, ""); int main(){} # g++ --std=c++11 -C adl.cc adl.cc: In substitution of ‘template<class T> decltype ((foo(T{}), short int())) ADLfoo(T&&) [with T = NY::Y]’: adl.cc:24:36: required from here adl.cc:19:6: error: ‘foo’ was not declared in this scope adl.cc:19:6: note: suggested alternative: adl.cc:9:6: note: ‘NX::foo’ Clang 3.2 compiles this fine.