10963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify -std=c++11 %s 262395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 362395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthtemplate <class T> 462395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthclass A { 562395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth void foo() { 662395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth undeclared(); 762395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth } 8fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet void foo2(); 962395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth}; 1062395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 1162395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthtemplate <class T> 1262395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthclass B { 1362395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth void foo4() { } // expected-note {{previous definition is here}} expected-note {{previous definition is here}} 14bcd0650c1e50a2e73b11717731e074a1ac2ac5baDavid Majnemer void foo4() { } // expected-error {{class member cannot be redeclared}} expected-error {{redefinition of 'foo4'}} 15bcd0650c1e50a2e73b11717731e074a1ac2ac5baDavid Majnemer void foo5() { } // expected-note {{previous definition is here}} 169d38dbc9a16017fff3e34b7876a6590413a7d56bFrancois Pichet 179d38dbc9a16017fff3e34b7876a6590413a7d56bFrancois Pichet friend void foo3() { 189d38dbc9a16017fff3e34b7876a6590413a7d56bFrancois Pichet undeclared(); 199d38dbc9a16017fff3e34b7876a6590413a7d56bFrancois Pichet } 2062395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth}; 2162395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 2262395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 2362395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthtemplate <class T> 24bcd0650c1e50a2e73b11717731e074a1ac2ac5baDavid Majnemervoid B<T>::foo5() { // expected-error {{redefinition of 'foo5'}} 2562395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth} 2662395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 2762395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthtemplate <class T> 2862395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthvoid A<T>::foo2() { 2962395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth undeclared(); 3062395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth} 3162395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 3262395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 3362395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthtemplate <class T> 3462395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthvoid foo3() { 3562395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth undeclared(); 3662395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth} 3762395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 3862395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthtemplate void A<int>::foo2(); 3962395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 4062395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 4162395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthvoid undeclared() 4262395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth{ 4362395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 4462395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth} 4562395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruth 4662395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthtemplate <class T> void foo5() {} //expected-note {{previous definition is here}} 4762395c9666b84bcb0cb322d5f5183472712685f6Chandler Carruthtemplate <class T> void foo5() {} // expected-error {{redefinition of 'foo5'}} 48fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet 49fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet 50fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet 51fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichetnamespace Inner_Outer_same_template_param_name { 52fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet 53fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichettemplate <class T> 54fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichetclass Outmost { 55fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichetpublic: 56fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet template <class T> 57fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet class Inner { 58fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet public: 59fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet void f() { 60fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet T* var; 61fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet } 62fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet }; 63fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet}; 64fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet 65fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet} 66fdde47061d8ff0b481414ccf69ebdc47c2216274Francois Pichet 67d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet 68d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichetnamespace PR11931 { 69d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet 70d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichettemplate <typename RunType> 71d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichetstruct BindState; 72d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet 73d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet template<> 74d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichetstruct BindState<void(void*)> { 75d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet static void Run() { } 76d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet}; 77d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet 78d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichetclass Callback { 79d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichetpublic: 80d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet typedef void RunType(); 81d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet 82d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet template <typename RunType> 83d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet Callback(BindState<RunType> bind_state) { 84d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet BindState<RunType>::Run(); 85d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet } 86d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet}; 87d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet 88d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet 89d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois PichetCallback Bind() { 90d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet return Callback(BindState<void(void*)>()); 91d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet} 92d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet 93d77177a752a08abf3f5cf46d7a3fe6143325815dFrancois Pichet} 940963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor 950963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregornamespace rdar11700604 { 960963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor template<typename T> void foo() = delete; 970963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor 980963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor struct X { 990963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor X() = default; 1000963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor 1010963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor template<typename T> void foo() = delete; 1020963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor }; 1030963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor} 1040963017dcbc32176c79a251c3ab23bc35ac784e5Douglas Gregor 10554679205de1a348f410d03ce4b331b56b21dce49David Majnemernamespace PR17334 { 10654679205de1a348f410d03ce4b331b56b21dce49David Majnemer 10754679205de1a348f410d03ce4b331b56b21dce49David Majnemertemplate <typename = void> struct ArrayRef { 10854679205de1a348f410d03ce4b331b56b21dce49David Majnemer constexpr ArrayRef() {} 10954679205de1a348f410d03ce4b331b56b21dce49David Majnemer}; 11054679205de1a348f410d03ce4b331b56b21dce49David Majnemertemplate <typename = void> void CreateConstInBoundsGEP2_32() { 11154679205de1a348f410d03ce4b331b56b21dce49David Majnemer ArrayRef<> IdxList; 11254679205de1a348f410d03ce4b331b56b21dce49David Majnemer} 11354679205de1a348f410d03ce4b331b56b21dce49David Majnemervoid LLVMBuildStructGEP() { CreateConstInBoundsGEP2_32(); } 11454679205de1a348f410d03ce4b331b56b21dce49David Majnemer 11554679205de1a348f410d03ce4b331b56b21dce49David Majnemer} 11654679205de1a348f410d03ce4b331b56b21dce49David Majnemer 117645526c3e42170e356f792b1bc0ac2acb65c26c4David Majnemernamespace PR17661 { 118645526c3e42170e356f792b1bc0ac2acb65c26c4David Majnemertemplate <typename T> 119645526c3e42170e356f792b1bc0ac2acb65c26c4David Majnemerconstexpr T Fun(T A) { return T(0); } 120645526c3e42170e356f792b1bc0ac2acb65c26c4David Majnemer 121645526c3e42170e356f792b1bc0ac2acb65c26c4David Majnemerconstexpr int Var = Fun(20); 122645526c3e42170e356f792b1bc0ac2acb65c26c4David Majnemer} 123645526c3e42170e356f792b1bc0ac2acb65c26c4David Majnemer 124651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinestemplate <typename T> 125651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesauto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}} 1266bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1276bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesnamespace PR19613 { 1286bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1296bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct HeapTypeConfig { 1306bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static void from_bitset(); 1316bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1326bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1336bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate <class Config> 1346bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct TypeImpl { 1356bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines struct BitsetType; 1366bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1376bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static void Any() { 1386bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines BitsetType::New(); 1396bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1406bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1416bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1426bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<class Config> 1436bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstruct TypeImpl<Config>::BitsetType { 1446bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static void New() { 1456bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines Config::from_bitset(); 1466bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1476bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1486bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1496bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic void f() { 1506bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines TypeImpl<HeapTypeConfig>::Any(); 1516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename A> struct S { 1546bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename B> struct T; 1556bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1566bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename A> template<typename B> struct S<A>::T { 1576bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename C, typename D> struct U; 1586bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename C> struct U<C, C> { 1596bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename E> static int f() { 1606bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return sizeof(A) + sizeof(B) + sizeof(C) + sizeof(E); 1616bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1626bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines }; 1636bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1646bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1656bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic void g() { 1666bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines S<int>::T<int>::U<int,int>::f<int>(); 1676bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1686bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1696bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> struct SS { 1706bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename U> struct X; 1716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines template<typename U> struct X<U*>; 1726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1736bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinestemplate<typename T> template<typename U> struct SS<T>::X<U*> { 1746bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines static int f() { 1756bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines return sizeof(T) + sizeof(U); 1766bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines } 1776bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines}; 1786bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1796bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hinesstatic void h() { 1806bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines SS<int>::X<int*>::f(); 1816bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 1826bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines 1836bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines} 184