Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -fsyntax-only %s
      2 typedef char one_byte;
      3 typedef char (&two_bytes)[2];
      4 typedef char (&four_bytes)[4];
      5 typedef char (&eight_bytes)[8];
      6 
      7 template<int N> struct A { };
      8 
      9 namespace N1 {
     10   struct X { };
     11 }
     12 
     13 namespace N2 {
     14   struct Y { };
     15 
     16   two_bytes operator+(Y, Y);
     17 }
     18 
     19 namespace N3 {
     20   struct Z { };
     21 
     22   eight_bytes operator+(Z, Z);
     23 }
     24 
     25 namespace N4 {
     26   one_byte operator+(N1::X, N2::Y);
     27 
     28   template<typename T, typename U>
     29   struct BinOpOverload {
     30     typedef A<sizeof(T() + U())> type;
     31   };
     32 }
     33 
     34 namespace N1 {
     35   four_bytes operator+(X, X);
     36 }
     37 
     38 namespace N3 {
     39   eight_bytes operator+(Z, Z); // redeclaration
     40 }
     41 
     42 void test_bin_op_overload(A<1> *a1, A<2> *a2, A<4> *a4, A<8> *a8) {
     43   typedef N4::BinOpOverload<N1::X, N2::Y>::type XY;
     44   XY *xy = a1;
     45   typedef N4::BinOpOverload<N1::X, N1::X>::type XX;
     46   XX *xx = a4;
     47   typedef N4::BinOpOverload<N2::Y, N2::Y>::type YY;
     48   YY *yy = a2;
     49   typedef N4::BinOpOverload<N3::Z, N3::Z>::type ZZ;
     50   ZZ *zz = a8;
     51 }
     52 
     53 namespace N3 {
     54   eight_bytes operator-(::N3::Z);
     55 }
     56 
     57 namespace N4 {
     58   template<typename T>
     59   struct UnaryOpOverload {
     60     typedef A<sizeof(-T())> type;
     61   };
     62 }
     63 
     64 void test_unary_op_overload(A<8> *a8) {
     65   typedef N4::UnaryOpOverload<N3::Z>::type UZ;
     66   UZ *uz = a8;
     67 }
     68 
     69 /*
     70 namespace N5 {
     71   template<int I>
     72   struct Lookup {
     73     enum { val = I, more = val + 1 };
     74   };
     75 
     76   template<bool B>
     77   struct Cond {
     78     enum Junk { is = B ? Lookup<B>::more : Lookup<Lookup<B+1>::more>::val };
     79   };
     80 
     81   enum { resultT = Cond<true>::is,
     82          resultF = Cond<false>::is };
     83 }
     84 */
     85 
     86 namespace N6 {
     87   // non-typedependent
     88   template<int I>
     89   struct Lookup {};
     90 
     91   template<bool B, typename T, typename E>
     92   struct Cond {
     93     typedef Lookup<B ? sizeof(T) : sizeof(E)> True;
     94     typedef Lookup<!B ? sizeof(T) : sizeof(E)> False;
     95   };
     96 
     97   typedef Cond<true, int, char>::True True;
     98   typedef Cond<true, int, char>::False False;
     99 
    100   // check that we have the right types
    101   Lookup<1> const &L1(False());
    102   Lookup<sizeof(int)> const &L2(True());
    103 }
    104 
    105 
    106 namespace N7 {
    107   // type dependent
    108   template<int I>
    109   struct Lookup {};
    110 
    111   template<bool B, typename T, typename E>
    112   struct Cond {
    113     T foo() { return B ? T() : E(); }
    114     typedef Lookup<sizeof(B ? T() : E())> Type;
    115   };
    116 
    117   //Cond<true, int*, double> C; // Errors
    118   //int V(C.foo()); // Errors
    119   //typedef Cond<true, int*, double>::Type Type; // Errors
    120   typedef Cond<true, int, double>::Type Type;
    121 }
    122 
    123 template<typename T, unsigned long N> struct IntegralConstant { };
    124 
    125 template<typename T>
    126 struct X0 {
    127   void f(T x, IntegralConstant<T, sizeof(x)>);
    128 };
    129 
    130 void test_X0(X0<int> x, IntegralConstant<int, sizeof(int)> ic) {
    131   x.f(5,ic);
    132 }
    133 
    134 namespace N8 {
    135   struct X {
    136     X operator+(const X&) const;
    137   };
    138 
    139   template<typename T>
    140   T test_plus(const T* xp, const T& x, const T& y) {
    141     x.operator+(y);
    142     return xp->operator+(y);
    143   }
    144 
    145   void test_test_plus(X x) {
    146     test_plus(&x, x, x);
    147   }
    148 }
    149 
    150 namespace N9 {
    151   struct A {
    152     bool operator==(int value);
    153   };
    154 
    155   template<typename T> struct B {
    156     bool f(A a) {
    157       return a == 1;
    158     }
    159   };
    160 
    161   template struct B<int>;
    162 }
    163 
    164 namespace N10 {
    165   template <typename T>
    166   class A {
    167     struct X { };
    168 
    169   public:
    170     ~A() {
    171       f(reinterpret_cast<X *>(0), reinterpret_cast<X *>(0));
    172     }
    173 
    174   private:
    175     void f(X *);
    176     void f(X *, X *);
    177   };
    178 
    179   template class A<int>;
    180 }
    181 
    182 namespace N12 {
    183   // PR5224
    184   template<typename T>
    185   struct A { typedef int t0; };
    186 
    187   struct C  {
    188     C(int);
    189 
    190     template<typename T>
    191     static C *f0(T a0) {return new C((typename A<T>::t0) 1);   }
    192   };
    193 
    194   void f0(int **a) { C::f0(a); }
    195 }
    196 
    197 namespace PR7202 {
    198   template<typename U, typename T>
    199   struct meta {
    200     typedef T type;
    201   };
    202 
    203   struct X {
    204     struct dummy;
    205 
    206     template<typename T>
    207     X(T, typename meta<T, dummy*>::type = 0);
    208 
    209     template<typename T, typename A>
    210     X(T, A);
    211   };
    212 
    213   template<typename T>
    214   struct Z { };
    215 
    216   template<typename T> Z<T> g(T);
    217 
    218   struct Y {
    219     template<typename T>
    220     void f(T t) {
    221       new X(g(*this));
    222     }
    223   };
    224 
    225   template void Y::f(int);
    226 }
    227 
    228 namespace N13 {
    229   class A{
    230     A(const A&);
    231 
    232   public:
    233     ~A();
    234     A(int);
    235     template<typename T> A &operator<<(const T&);
    236   };
    237 
    238   template<typename T>
    239   void f(T t) {
    240     A(17) << t;
    241   }
    242 
    243   template void f(int);
    244 
    245 }
    246