xref: /llvm-project/clang/test/CXX/temp/temp.fct.spec/temp.deduct/temp.deduct.partial/p11.cpp (revision 6edd977c6f368c36118479e6cd7db97a9cf48838)
18fbe78f6SDaniel Dunbar // RUN: %clang_cc1 -fsyntax-only -verify %s
2406f634dSDouglas Gregor 
3406f634dSDouglas Gregor template <class T> T* f(int);	// #1
4406f634dSDouglas Gregor template <class T, class U> T& f(U); // #2
5406f634dSDouglas Gregor 
g()6406f634dSDouglas Gregor void g() {
7406f634dSDouglas Gregor   int *ip = f<int>(1);	// calls #1
8406f634dSDouglas Gregor }
9406f634dSDouglas Gregor 
10e1d2ef35SDouglas Gregor template<typename T>
11e1d2ef35SDouglas Gregor struct identity {
12e1d2ef35SDouglas Gregor   typedef T type;
13e1d2ef35SDouglas Gregor };
14e1d2ef35SDouglas Gregor 
15e1d2ef35SDouglas Gregor template <class T>
16b837ea4eSDouglas Gregor   T* f2(int, typename identity<T>::type = 0);
17e1d2ef35SDouglas Gregor template <class T, class U>
18b837ea4eSDouglas Gregor   T& f2(U, typename identity<T>::type = 0);
19e1d2ef35SDouglas Gregor 
g2()20e1d2ef35SDouglas Gregor void g2() {
21b837ea4eSDouglas Gregor   int* ip = f2<int>(1);
22e1d2ef35SDouglas Gregor }
23552c7cf2SDouglas Gregor 
24552c7cf2SDouglas Gregor template<class T, class U> struct A { };
25552c7cf2SDouglas Gregor 
26552c7cf2SDouglas Gregor template<class T, class U> inline int *f3( U, A<U,T>* p = 0 ); // #1 expected-note{{candidate function [with T = int, U = int]}}
27552c7cf2SDouglas Gregor template<         class U> inline float *f3( U, A<U,U>* p = 0 ); // #2 expected-note{{candidate function [with U = int]}}
28552c7cf2SDouglas Gregor 
g3()29552c7cf2SDouglas Gregor void g3() {
30552c7cf2SDouglas Gregor    float *fp = f3<int>( 42, (A<int,int>*)0 );  // Ok, picks #2.
31552c7cf2SDouglas Gregor    f3<int>( 42 );                  // expected-error{{call to 'f3' is ambiguous}}
32552c7cf2SDouglas Gregor 
33552c7cf2SDouglas Gregor }
34*6edd977cSDouglas Gregor 
35*6edd977cSDouglas Gregor namespace PR9006 {
36*6edd977cSDouglas Gregor   struct X {
37*6edd977cSDouglas Gregor     template <class Get>
38*6edd977cSDouglas Gregor     int &f(char const* name, Get fget, char const* docstr = 0);
39*6edd977cSDouglas Gregor 
40*6edd977cSDouglas Gregor     template <class Get, class Set>
41*6edd977cSDouglas Gregor     float &f(char const* name, Get fget, Set fset, char const* docstr = 0);
42*6edd977cSDouglas Gregor   };
43*6edd977cSDouglas Gregor 
test(X x)44*6edd977cSDouglas Gregor   void test(X x) {
45*6edd977cSDouglas Gregor     int &ir = x.f("blah", 0, "blah");
46*6edd977cSDouglas Gregor   }
47*6edd977cSDouglas Gregor }
48