xref: /llvm-project/clang/test/SemaTemplate/temp_func_order.cpp (revision 8fbe78f6fc7b41d1a4228c126fcb522131150518)
1*8fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s
20ff7d920SDouglas Gregor template<typename T>
30ff7d920SDouglas Gregor int &f0(T);
40ff7d920SDouglas Gregor 
50ff7d920SDouglas Gregor template<typename T>
60ff7d920SDouglas Gregor float &f0(T*);
70ff7d920SDouglas Gregor 
test_f0(int i,int * ip)80ff7d920SDouglas Gregor void test_f0(int i, int *ip) {
90ff7d920SDouglas Gregor   int &ir = f0(i);
100ff7d920SDouglas Gregor   float &fr = f0(ip);
110ff7d920SDouglas Gregor }
120ff7d920SDouglas Gregor 
130ff7d920SDouglas Gregor template<typename T, typename U>
140ff7d920SDouglas Gregor int &f1(T, U);
150ff7d920SDouglas Gregor 
160ff7d920SDouglas Gregor template<typename T>
170ff7d920SDouglas Gregor float &f1(T, T);
180ff7d920SDouglas Gregor 
test_f1(int i,float f)190ff7d920SDouglas Gregor void test_f1(int i, float f) {
200ff7d920SDouglas Gregor   int &ir = f1(i, f);
210ff7d920SDouglas Gregor   float &fr1 = f1(i, i);
220ff7d920SDouglas Gregor   float &fr2 = f1(f, f);
230ff7d920SDouglas Gregor }
240ff7d920SDouglas Gregor 
250ff7d920SDouglas Gregor template<typename T, typename U>
260ff7d920SDouglas Gregor struct A { };
270ff7d920SDouglas Gregor 
280ff7d920SDouglas Gregor template<typename T>
290ff7d920SDouglas Gregor int &f2(T);
300ff7d920SDouglas Gregor 
310ff7d920SDouglas Gregor template<typename T, typename U>
320ff7d920SDouglas Gregor float &f2(A<T, U>);
330ff7d920SDouglas Gregor 
340ff7d920SDouglas Gregor template<typename T>
350ff7d920SDouglas Gregor double &f2(A<T, T>);
360ff7d920SDouglas Gregor 
test_f2(int i,A<int,float> aif,A<int,int> aii)370ff7d920SDouglas Gregor void test_f2(int i, A<int, float> aif, A<int, int> aii) {
380ff7d920SDouglas Gregor   int &ir = f2(i);
390ff7d920SDouglas Gregor   float &fr = f2(aif);
400ff7d920SDouglas Gregor   double &dr = f2(aii);
410ff7d920SDouglas Gregor }
420ff7d920SDouglas Gregor 
430ff7d920SDouglas Gregor template<typename T, typename U>
440ff7d920SDouglas Gregor int &f3(T*, U); // expected-note{{candidate}}
450ff7d920SDouglas Gregor 
460ff7d920SDouglas Gregor template<typename T, typename U>
470ff7d920SDouglas Gregor float &f3(T, U*); // expected-note{{candidate}}
480ff7d920SDouglas Gregor 
test_f3(int i,int * ip,float * fp)490ff7d920SDouglas Gregor void test_f3(int i, int *ip, float *fp) {
500ff7d920SDouglas Gregor   int &ir = f3(ip, i);
510ff7d920SDouglas Gregor   float &fr = f3(i, fp);
520ff7d920SDouglas Gregor   f3(ip, ip); // expected-error{{ambiguous}}
530ff7d920SDouglas Gregor }
540ff7d920SDouglas Gregor 
550ff7d920SDouglas Gregor template<typename T>
560ff7d920SDouglas Gregor int &f4(T&);
570ff7d920SDouglas Gregor 
580ff7d920SDouglas Gregor template<typename T>
590ff7d920SDouglas Gregor float &f4(const T&);
600ff7d920SDouglas Gregor 
test_f4(int i,const int ic)610ff7d920SDouglas Gregor void test_f4(int i, const int ic) {
620ff7d920SDouglas Gregor   int &ir1 = f4(i);
630ff7d920SDouglas Gregor   float &fr1 = f4(ic);
640ff7d920SDouglas Gregor }
650ff7d920SDouglas Gregor 
660ff7d920SDouglas Gregor template<typename T, typename U>
670ff7d920SDouglas Gregor int &f5(T&, const U&); // expected-note{{candidate}}
680ff7d920SDouglas Gregor 
690ff7d920SDouglas Gregor template<typename T, typename U>
700ff7d920SDouglas Gregor float &f5(const T&, U&); // expected-note{{candidate}}
710ff7d920SDouglas Gregor 
test_f5(int i,const int ic)720ff7d920SDouglas Gregor void test_f5(int i, const int ic) {
730ff7d920SDouglas Gregor   f5(i, i); // expected-error{{ambiguous}}
740ff7d920SDouglas Gregor }
750ff7d920SDouglas Gregor 
760ff7d920SDouglas Gregor template<typename T, typename U>
770ff7d920SDouglas Gregor int &f6(T&, U&);
780ff7d920SDouglas Gregor 
790ff7d920SDouglas Gregor template<typename T, typename U>
800ff7d920SDouglas Gregor float &f6(const T&, U&);
810ff7d920SDouglas Gregor 
test_f6(int i,const int ic)820ff7d920SDouglas Gregor void test_f6(int i, const int ic) {
830ff7d920SDouglas Gregor   int &ir = f6(i, i);
840ff7d920SDouglas Gregor   float &fr = f6(ic, ic);
850ff7d920SDouglas Gregor }
866010da02SDouglas Gregor 
876010da02SDouglas Gregor struct CrazyFun {
886010da02SDouglas Gregor   template<typename T, typename U> operator A<T, U>();
896010da02SDouglas Gregor   template<typename T> operator A<T, T>();
906010da02SDouglas Gregor };
916010da02SDouglas Gregor 
fun(CrazyFun cf)926010da02SDouglas Gregor void fun(CrazyFun cf) {
936010da02SDouglas Gregor   A<int, float> aif = cf;
946010da02SDouglas Gregor   A<int, int> aii = cf;
956010da02SDouglas Gregor }
96