| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- // 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'}}
- }
- }
|