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