basic.cpp revision a933319ebf754396623165f9dc0a29c2a48879f5
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// RUN: %clang_cc1 -fsyntax-only -verify %s
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> struct A { };
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> A<T> f0(T*);
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void test_f0(int *ip, float const *cfp) {
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  A<int> a0 = f0(ip);
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  A<const float> a1 = f0(cfp);
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> void f1(T*, int);
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void test_f1(int *ip, float fv) {
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  f1(ip, fv);
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO: this diagnostic can and should improve
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename T> void f2(T*, T*); // expected-note {{candidate template ignored: failed template argument deduction}} \
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// expected-note{{candidate template ignored: deduced conflicting types for parameter 'T' ('int' vs. 'float')}}
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct ConvToIntPtr {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  operator int*() const;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void test_f2(int *ip, float *fp) {
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  f2(ip, ConvToIntPtr()); // expected-error{{no matching function}}
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  f2(ip, ip); // okay
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  f2(ip, fp); // expected-error{{no matching function}}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)