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