Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -fms-extensions -std=c++11 %s -verify
      2 
      3 struct Nontemplate {
      4   typedef int type;
      5 };
      6 
      7 template<typename T>
      8 struct 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 
     26 X<int>::type i1;
     27 X<int>::type2 i2; // expected-error{{no type named 'type2' in 'X<int>'}}
     28 X<int>::type3 i3;
     29 X<int>::type4 i4; // expected-error{{no type named 'type4' in 'X<int>'}}
     30 
     31 struct HasFoo {
     32   void foo();
     33 };
     34 struct HasBar {
     35   void bar(int);
     36   void bar(float);
     37 };
     38 
     39 template<typename T>
     40 void 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 
     58 template void f(HasFoo); // expected-note{{in instantiation of function template specialization 'f<HasFoo>' requested here}}
     59 template void f(HasBar);
     60 
     61 template<typename T, typename ...Ts>
     62 void 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