1762bb9d0ad20320b9f97a841dce57ba5e8e48b07Richard Smith// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s
23b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
33b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregortemplate<typename T>
43b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorstruct X0 {
53b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  void f(T &t) {
63b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor    t = 1; // expected-error{{incompatible type}}
73b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  }
83b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
93b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  void g(T &t);
103b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
113b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  void h(T &t);
123b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
133b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  static T static_var;
143b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor};
153b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
163b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregortemplate<typename T>
173b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorinline void X0<T>::g(T & t) {
183b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  t = 1; // expected-error{{incompatible type}}
193b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor}
203b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
213b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregortemplate<typename T>
223b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorvoid X0<T>::h(T & t) {
233b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  t = 1;
243b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor}
253b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
263b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregortemplate<typename T>
273b846b6c252972a6f142aa226c1e65aebd0feecaDouglas GregorT X0<T>::static_var = 1;
283b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
293b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorextern template struct X0<int*>;
303b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
313b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorint *&test(X0<int*> xi, int *ip) {
323b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  xi.f(ip); // expected-note{{instantiation}}
333b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  xi.g(ip); // expected-note{{instantiation}}
343b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  xi.h(ip);
353b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  return X0<int*>::static_var;
363b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor}
373b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
383b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregortemplate<typename T>
393b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorvoid f0(T& t) {
403b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  t = 1; // expected-error{{incompatible type}}
413b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor}
423b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
433b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregortemplate<typename T>
443b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorinline void f1(T& t) {
453b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  t = 1; // expected-error 2{{incompatible type}}
463b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor}
473b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
483b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorextern template void f0<>(int *&);
493b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorextern template void f1<>(int *&);
503b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
513b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorvoid test_f0(int *ip, float *fp) {
523b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  f0(ip);
533b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  f0(fp); // expected-note{{instantiation}}
543b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor}
553b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor
563b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregorvoid test_f1(int *ip, float *fp) {
573b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  f1(ip); // expected-note{{instantiation}}
583b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor  f1(fp); // expected-note{{instantiation}}
593b846b6c252972a6f142aa226c1e65aebd0feecaDouglas Gregor}
60