10672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor// RUN: %clang_cc1 -fsyntax-only -verify %s
20672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor
30672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregortemplate<int i> class A {  };
4e5ae4387a39699967565520bc4169dec43d7f147Douglas Gregortemplate<short s> void f(A<s>); // expected-note{{candidate template ignored: substitution failure}}
50672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor
60672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregorvoid k1() {
70672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  A<1> a;
80672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  f(a); // expected-error{{no matching function for call}}
90672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  f<1>(a);
100672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor}
110672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregortemplate<const short cs> class B { };
120672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregortemplate<short s> void g(B<s>);
130672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregorvoid k2() {
140672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  B<1> b;
150672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  g(b); // OK: cv-qualifiers are ignored on template parameter types
160672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor}
170672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor
18ca8d79a0dc1b31a73626e366e17f0ddb95250b19Douglas Gregortemplate<short s> void h(int (&)[s]); // expected-note{{candidate function template not viable: requires 1 argument, but 2 were provided}}
190672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregorvoid k3() {
200672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  int array[5];
210672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  h(array);
220672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  h<5>(array);
230672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor}
240672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor
25e5ae4387a39699967565520bc4169dec43d7f147Douglas Gregortemplate<short s> void h(int (&)[s], A<s>);  // expected-note{{candidate template ignored: substitution failure}}
260672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregorvoid k4() {
270672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  A<5> a;
280672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  int array[5];
290672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  h(array, a); // expected-error{{no matching function for call}}
300672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor  h<5>(array, a);
310672dde9c095c3e894519ed66aed2bfff9fbf250Douglas Gregor}
32