text: // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -Wc++11-compat %s
  // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++98 -Wc++11-compat %s
  // RUN: %clang_cc1 -fsyntax-only -verify -pedantic -std=c++11 %s
  
  // Example from the standard
  template<class T> class Array { void mf() { } }; 
  
  template class Array<char>; 
  template void Array<int>::mf();
  template<class T> void sort(Array<T>& v) { /* ... */ }
  template void sort(Array<char>&);
  namespace N { 
    template<class T> void f(T&) { }
  } 
  template void N::f<int>(int&);
  
  
  template<typename T>
  struct X0 {
    struct Inner {};
    void f() { }
    static T value;
  };
  
  template<typename T>
  T X0<T>::value = 17;
  
  typedef X0<int> XInt;
  
  template struct XInt::Inner; // expected-warning{{template-id}}
  template void XInt::f(); // expected-warning{{template-id}}
  template int XInt::value; // expected-warning{{template-id}}
  
  namespace N {
    template<typename T>
    struct X1 { // expected-note{{explicit instantiation refers here}}
    };
    
    template<typename T>
    void f1(T) {} // expected-note{{explicit instantiation refers here}}
  }
  using namespace N;
  
  template struct X1<int>;
  #if __cplusplus <= 199711L
  // expected-warning@-2 {{explicit instantiation of 'N::X1' must occur in namespace 'N'}}
  #else
  // expected-error@-4 {{explicit instantiation of 'N::X1' must occur in namespace 'N'}}
  #endif
  
  template void f1(int);
  #if __cplusplus <= 199711L
  // expected-warning@-2 {{explicit instantiation of 'N::f1' must occur in namespace 'N'}}
  #else
  // expected-error@-4 {{explicit instantiation of 'N::f1' must occur in namespace 'N'}}
  #endif
  