Home | History | Annotate | Download | only in SemaTemplate
      1 // RUN: %clang_cc1 -fsyntax-only -verify %s
      2 
      3 struct X {
      4   template<typename T> T& f0(T);
      5 
      6   void g0(int i, double d) {
      7     int &ir = f0(i);
      8     double &dr = f0(d);
      9   }
     10 
     11   template<typename T> T& f1(T);
     12   template<typename T, typename U> U& f1(T, U);
     13 
     14   void g1(int i, double d) {
     15     int &ir1 = f1(i);
     16     int &ir2 = f1(d, i);
     17     int &ir3 = f1(i, i);
     18   }
     19 };
     20 
     21 void test_X_f0(X x, int i, float f) {
     22   int &ir = x.f0(i);
     23   float &fr = x.f0(f);
     24 }
     25 
     26 void test_X_f1(X x, int i, float f) {
     27   int &ir1 = x.f1(i);
     28   int &ir2 = x.f1(f, i);
     29   int &ir3 = x.f1(i, i);
     30 }
     31 
     32 void test_X_f0_address() {
     33   int& (X::*pm1)(int) = &X::f0;
     34   float& (X::*pm2)(float) = &X::f0;
     35 }
     36 
     37 void test_X_f1_address() {
     38   int& (X::*pm1)(int) = &X::f1;
     39   float& (X::*pm2)(float) = &X::f1;
     40   int& (X::*pm3)(float, int) = &X::f1;
     41 }
     42 
     43 void test_X_f0_explicit(X x, int i, long l) {
     44   int &ir1 = x.f0<int>(i);
     45   int &ir2 = x.f0<>(i);
     46   long &il1 = x.f0<long>(i);
     47 }
     48 
     49 // PR4608
     50 class A { template <class x> x a(x z) { return z+y; } int y; };
     51 
     52 // PR5419
     53 struct Functor {
     54   template <typename T>
     55   bool operator()(const T& v) const {
     56     return true;
     57   }
     58 };
     59 
     60 void test_Functor(Functor f) {
     61   f(1);
     62 }
     63 
     64 // Instantiation on ->
     65 template<typename T>
     66 struct X1 {
     67   template<typename U> U& get();
     68 };
     69 
     70 template<typename T> struct X2; // expected-note{{here}}
     71 
     72 void test_incomplete_access(X1<int> *x1, X2<int> *x2) {
     73   float &fr = x1->get<float>();
     74   (void)x2->get<float>(); // expected-error{{implicit instantiation of undefined template}}
     75 }
     76 
     77 // Instantiation of template template parameters in a member function
     78 // template.
     79 namespace TTP {
     80   template<int Dim> struct X {
     81     template<template<class> class M, class T> void f(const M<T>&);
     82   };
     83 
     84   template<typename T> struct Y { };
     85 
     86   void test_f(X<3> x, Y<int> y) { x.f(y); }
     87 }
     88 
     89 namespace PR7387 {
     90   template <typename T> struct X {};
     91 
     92   template <typename T1> struct S {
     93     template <template <typename> class TC> void foo(const TC<T1>& arg);
     94   };
     95 
     96   template <typename T1> template <template <typename> class TC>
     97   void S<T1>::foo(const TC<T1>& arg) {}
     98 
     99   void test(const X<int>& x) {
    100     S<int> s;
    101     s.foo(x);
    102   }
    103 }
    104