1a5728872c7702ddd09537c95bc3cbd20e1f2fb09Daniel Dunbar// RUN: %clang_cc1 -fsyntax-only -verify %s
27dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregortemplate<typename T>
37dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregorstruct X0 {
47dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregor  typedef T* type;
57dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregor
67dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregor  void f0(T);
77dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregor  void f1(type);
87dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregor};
97dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregor
107dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregortemplate<> void X0<char>::f0(char);
117dfd0fb08300b60a9657748bda7d8b3ceb07babeDouglas Gregortemplate<> void X0<char>::f1(type);
122fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor
132fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregornamespace PR6161 {
142fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor  template<typename _CharT>
152fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor  class numpunct : public locale::facet // expected-error{{use of undeclared identifier 'locale'}} \
16d65587f7a6d38965fa37158d3f57990a7faf3836Douglas Gregor              // expected-error{{expected class name}}
172fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor  {
18edc287751a4b05e3b4d8ff2b38fa30c5b59a548bJeffrey Yasskin    static locale::id id; // expected-error{{use of undeclared identifier}}
192fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor  };
200e2c34f92f00628d48968dfea096d36381f494cbStephen Hines  numpunct<char>::~numpunct();
212fa98001f832836e3f652c211a9d2f80501d659aDouglas Gregor}
2221383febfcc27c3aead61ecb74be6641cc7c0a04Richard Smith
2321383febfcc27c3aead61ecb74be6641cc7c0a04Richard Smithnamespace PR12331 {
2421383febfcc27c3aead61ecb74be6641cc7c0a04Richard Smith  template<typename T> struct S {
2521383febfcc27c3aead61ecb74be6641cc7c0a04Richard Smith    struct U { static const int n = 5; };
2621383febfcc27c3aead61ecb74be6641cc7c0a04Richard Smith    enum E { e = U::n }; // expected-note {{implicit instantiation first required here}}
2721383febfcc27c3aead61ecb74be6641cc7c0a04Richard Smith    int arr[e];
2821383febfcc27c3aead61ecb74be6641cc7c0a04Richard Smith  };
2921383febfcc27c3aead61ecb74be6641cc7c0a04Richard Smith  template<> struct S<int>::U { static const int n = sizeof(int); }; // expected-error {{explicit specialization of 'U' after instantiation}}
3021383febfcc27c3aead61ecb74be6641cc7c0a04Richard Smith}
31461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling
32461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendlingnamespace PR18246 {
33461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling  template<typename T>
34461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling  class Baz {
35461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling  public:
36461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling    template<int N> void bar();
37461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling  };
38461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling
39461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling  template<typename T>
40461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling  template<int N>
416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void Baz<T>::bar() { // expected-note {{couldn't infer template argument 'N'}}
42461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling  }
43461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling
446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // FIXME: We shouldn't try to match this against a prior declaration if
456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  // template parameter matching failed.
46461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling  template<typename T>
476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  void Baz<T>::bar<0>() { // expected-error {{cannot specialize a member of an unspecialized template}} \
486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                          // expected-error {{no function template matches}}
49461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling  }
50461b1b961cd83c1322c3bf402b3601954bc7757bBill Wendling}
516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace PR19340 {
536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> struct Helper {
546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines  template<int N> static void func(const T *m) {} // expected-note {{failed template argument deduction}}
556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines};
566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines
576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> void Helper<T>::func<2>() {} // expected-error {{cannot specialize a member}} \
586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines                                                  // expected-error {{no function template matches}}
596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}
60