// RUN: %clang_cc1 -fms-extensions %s -verify struct Nontemplate { typedef int type; }; template struct X { __if_exists(Nontemplate::type) { typedef Nontemplate::type type; } __if_exists(Nontemplate::value) { typedef Nontemplate::value type2; } __if_not_exists(Nontemplate::value) { typedef int type3; } __if_exists(T::X) { // expected-warning{{dependent __if_exists declarations are ignored}} typedef T::X type4; } }; X::type i1; X::type2 i2; // expected-error{{no type named 'type2' in 'X'}} X::type3 i3; X::type4 i4; // expected-error{{no type named 'type4' in 'X'}} struct HasFoo { void foo(); }; struct HasBar { void bar(int); void bar(float); }; template void f(T t) { __if_exists(T::foo) { { } t.foo(); } __if_not_exists(T::bar) { int *i = t; { } } } template void f(HasFoo); template void f(HasBar);