brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.5 KiB · 9b95bba Raw
69 lines · cpp
1// RUN: %clang_cc1 -fms-extensions -std=c++11 %s -verify2 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    355  };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