// RUN: %clang_cc1 -fsyntax-only -std=c++11 -verify %s

template<typename T>
struct X0 {
  void f(T &t) {
    t = 1; // expected-error{{incompatible type}}
  }
  
  void g(T &t);
  
  void h(T &t);
  
  static T static_var;
};

template<typename T>
inline void X0<T>::g(T & t) {
  t = 1; // expected-error{{incompatible type}}
}

template<typename T>
void X0<T>::h(T & t) {
  t = 1;
}

template<typename T>
T X0<T>::static_var = 1;

extern template struct X0<int*>;

int *&test(X0<int*> xi, int *ip) {
  xi.f(ip); // expected-note{{instantiation}}
  xi.g(ip); // expected-note{{instantiation}}
  xi.h(ip);
  return X0<int*>::static_var;
}

template<typename T>
void f0(T& t) {
  t = 1; // expected-error{{incompatible type}}
}

template<typename T>
inline void f1(T& t) {
  t = 1; // expected-error 2{{incompatible type}}
}

extern template void f0<>(int *&);
extern template void f1<>(int *&);

void test_f0(int *ip, float *fp) {
  f0(ip);
  f0(fp); // expected-note{{instantiation}}
}

void test_f1(int *ip, float *fp) {
  f1(ip); // expected-note{{instantiation}}
  f1(fp); // expected-note{{instantiation}}
}
