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