// RUN: %clang_cc1 -fms-extensions -std=c++11 %s -verify struct Nontemplate { typedef int type; }; template<typename T> 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<int>::type i1; X<int>::type2 i2; // expected-error{{no type named 'type2' in 'X<int>'}} X<int>::type3 i3; X<int>::type4 i4; // expected-error{{no type named 'type4' in 'X<int>'}} struct HasFoo { void foo(); }; struct HasBar { void bar(int); void bar(float); }; template<typename T> void f(T t) { __if_exists(T::foo) { { } t.foo(); } __if_not_exists(T::bar) { int *i = t; // expected-error{{no viable conversion from 'HasFoo' to 'int *'}} { } } int array2[] = { 0, __if_exists(T::bar) {2, }// expected-warning{{dependent __if_exists declarations are ignored}} 3 }; } template void f(HasFoo); // expected-note{{in instantiation of function template specialization 'f<HasFoo>' requested here}} template void f(HasBar); template<typename T, typename ...Ts> void g(T, Ts...) { __if_exists(T::operator Ts) { // expected-error{{__if_exists name contains unexpanded parameter pack 'Ts'}} } __if_not_exists(Ts::operator T) { // expected-error{{__if_not_exists name contains unexpanded parameter pack 'Ts'}} } }