13573b2c84372d9484296fa658f5276f6c09acb92Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
2b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregor
3b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregortemplate<typename T> struct A { };
4b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregor
5b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregortemplate<typename T> A<T> f0(T*);
6b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregor
7b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregorvoid test_f0(int *ip, float const *cfp) {
8b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregor  A<int> a0 = f0(ip);
9b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregor  A<const float> a1 = f0(cfp);
10b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregor}
11b60eb759cc2de7125e3554b7f48b2452ca807d82Douglas Gregor
12ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregortemplate<typename T> void f1(T*, int);
13ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor
14ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregorvoid test_f1(int *ip, float fv) {
15ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor  f1(ip, fv);
16ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor}
17ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor
18011323d90dd2c1ff2db6e1871154831885f2d7cbJohn McCall// TODO: this diagnostic can and should improve
19a4f7ff4959c7a5a0ff5e093facad76671e176f28Douglas Gregortemplate<typename T> void f2(T*, T*); // expected-note {{candidate template ignored: failed template argument deduction}} \
20a4f7ff4959c7a5a0ff5e093facad76671e176f28Douglas Gregor// expected-note{{candidate template ignored: deduced conflicting types for parameter 'T' ('int' vs. 'float')}}
21ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor
22ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregorstruct ConvToIntPtr {
23ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor  operator int*() const;
24ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor};
25ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor
26ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregorvoid test_f2(int *ip, float *fp) {
27ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor  f2(ip, ConvToIntPtr()); // expected-error{{no matching function}}
28ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor  f2(ip, ip); // okay
29ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor  f2(ip, fp); // expected-error{{no matching function}}
30ad538e5150e7248e49066e917db2620bd8af8825Douglas Gregor}
31