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