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