1// RUN: %clang_cc1 -fms-extensions -std=c++11 %s -verify 2 3struct Nontemplate { 4 typedef int type; 5}; 6 7template<typename T> 8struct X { 9 __if_exists(Nontemplate::type) { 10 typedef Nontemplate::type type; 11 } 12 13 __if_exists(Nontemplate::value) { 14 typedef Nontemplate::value type2; 15 } 16 17 __if_not_exists(Nontemplate::value) { 18 typedef int type3; 19 } 20 21 __if_exists(T::X) { // expected-warning{{dependent __if_exists declarations are ignored}} 22 typedef T::X type4; 23 } 24}; 25 26X<int>::type i1; 27X<int>::type2 i2; // expected-error{{no type named 'type2' in 'X<int>'}} 28X<int>::type3 i3; 29X<int>::type4 i4; // expected-error{{no type named 'type4' in 'X<int>'}} 30 31struct HasFoo { 32 void foo(); 33}; 34struct HasBar { 35 void bar(int); 36 void bar(float); 37}; 38 39template<typename T> 40void f(T t) { 41 __if_exists(T::foo) { 42 { } 43 t.foo(); 44 } 45 46 __if_not_exists(T::bar) { 47 int *i = t; // expected-error{{no viable conversion from 'HasFoo' to 'int *'}} 48 { } 49 } 50 51 int array2[] = { 52 0, 53 __if_exists(T::bar) {2, }// expected-warning{{dependent __if_exists declarations are ignored}} 54 3 55 }; 56} 57 58template void f(HasFoo); // expected-note{{in instantiation of function template specialization 'f<HasFoo>' requested here}} 59template void f(HasBar); 60 61template<typename T, typename ...Ts> 62void g(T, Ts...) { 63 __if_exists(T::operator Ts) { // expected-error{{__if_exists name contains unexpanded parameter pack 'Ts'}} 64 } 65 66 __if_not_exists(Ts::operator T) { // expected-error{{__if_not_exists name contains unexpanded parameter pack 'Ts'}} 67 } 68} 69