http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58590
Bug ID: 58590 Summary: [C++11] Hidden typename not ill-formed under SFINAE conditions Product: gcc Version: 4.9.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: daniel.kruegler at googlemail dot com gcc 4.9.0 20130922 (experimental) compiled with the flags -std=c++11 -Wall -pedantic-errors rejects the following code: //--------------------- struct S { int member; struct member{}; }; template<class T, class = typename T::member> auto f(int) -> char(&)[1]; template<class T> auto f(...) -> char(&)[2]; static_assert(sizeof(f<S>(0)) == 2, ""); int main() { } //--------------------- "main.cpp|9|error: static assertion failed: |" After discussion with Richard Smith: The presence of 'typename' before 'T::member' does not influence name lookup, and 'S::member' as a template-argument names the non-static data member, not the type, by [basic.scope.hiding]p2. The relevant rule in [temp.res]p4. It seems that GCC uses the elaborated-type-specifier lookup instead here.