Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 template<typename T, typename U = const T> struct Def1;
      3 
      4 template<> struct Def1<int> {
      5   void foo();
      6 };
      7 
      8 template<> struct Def1<const int> { // expected-note{{previous definition is here}}
      9   void bar();
     10 };
     11 
     12 template<> struct Def1<int&> {
     13   void wibble();
     14 };
     15 
     16 void test_Def1(Def1<int, const int> *d1, Def1<const int, const int> *d2,
     17                Def1<int&, int&> *d3) {
     18   d1->foo();
     19   d2->bar();
     20   d3->wibble();
     21 }
     22 
     23 template<typename T,  // FIXME: bad error message below, needs better location info
     24          typename T2 = const T*>  // expected-error{{'T2' declared as a pointer to a reference}}
     25   struct Def2;
     26 
     27 template<> struct Def2<int> {
     28   void foo();
     29 };
     30 
     31 void test_Def2(Def2<int, int const*> *d2) {
     32   d2->foo();
     33 }
     34 
     35 typedef int& int_ref_t;
     36 Def2<int_ref_t> *d2; // expected-note{{in instantiation of default argument for 'Def2<int &>' required here}}
     37 
     38 
     39 template<> struct Def1<const int, const int> { }; // expected-error{{redefinition of 'Def1<const int>'}}
     40 
     41 template<typename T, typename T2 = T&> struct Def3;
     42 
     43 template<> struct Def3<int> {
     44   void foo();
     45 };
     46 
     47 template<> struct Def3<int&> {
     48   void bar();
     49 };
     50 
     51 void test_Def3(Def3<int, int&> *d3a, Def3<int&, int&> *d3b) {
     52   d3a->foo();
     53   d3b->bar();
     54 }
     55 
     56 
     57 template<typename T, typename T2 = T[]> struct Def4;
     58 
     59 template<> struct Def4<int> {
     60   void foo();
     61 };
     62 
     63 void test_Def4(Def4<int, int[]> *d4a) {
     64   d4a->foo();
     65 }
     66 
     67 template<typename T, typename T2 = T const[12]> struct Def5;
     68 
     69 template<> struct Def5<int> {
     70   void foo();
     71 };
     72 
     73 template<> struct Def5<int, int const[13]> {
     74   void bar();
     75 };
     76 
     77 void test_Def5(Def5<int, const int[12]> *d5a, Def5<int, const int[13]> *d5b) {
     78   d5a->foo();
     79   d5b->bar();
     80 }
     81 
     82 template<typename R, typename Arg1, typename Arg2 = Arg1,
     83          typename FuncType = R (*)(Arg1, Arg2)>
     84   struct Def6;
     85 
     86 template<> struct Def6<int, float> {
     87   void foo();
     88 };
     89 
     90 template<> struct Def6<bool, int[5], float(double, double)> {
     91   void bar();
     92 };
     93 
     94 bool test_Def6(Def6<int, float, float> *d6a,
     95                Def6<int, float, float, int (*)(float, float)> *d6b,
     96                Def6<bool, int[5], float(double, double),
     97                     bool(*)(int*, float(*)(double, double))> *d6c) {
     98   d6a->foo();
     99   d6b->foo();
    100   d6c->bar();
    101   return d6a == d6b;
    102 }
    103