1// RUN: %clang_cc1 -fms-extensions -fdelayed-template-parsing -fsyntax-only -verify -std=c++11 %s
2
3template <class T>
4class A {
5   void foo() {
6       undeclared();
7   }
8   void foo2();
9};
10
11template <class T>
12class B {
13   void foo4() { } // expected-note {{previous definition is here}}
14   void foo4() { } // expected-error {{class member cannot be redeclared}}
15   void foo5() { } // expected-note {{previous definition is here}}
16
17   friend void foo3() {
18       undeclared();
19   }
20};
21
22
23template <class T>
24void B<T>::foo5() { // expected-error {{redefinition of 'foo5'}}
25}
26
27template <class T>
28void A<T>::foo2() {
29    undeclared();
30}
31
32
33template <class T>
34void foo3() {
35   undeclared();
36}
37
38template void A<int>::foo2();
39
40
41void undeclared()
42{
43
44}
45
46template <class T> void foo5() {} //expected-note {{previous definition is here}}
47template <class T> void foo5() {} // expected-error {{redefinition of 'foo5'}}
48
49
50
51namespace Inner_Outer_same_template_param_name {
52
53template <class T>
54class Outmost {
55public:
56    template <class T>
57    class Inner {
58    public:
59        void f() {
60            T* var;
61        }
62   };
63};
64
65}
66
67
68namespace PR11931 {
69
70template <typename RunType>
71struct BindState;
72
73  template<>
74struct BindState<void(void*)> {
75  static void Run() { }
76};
77
78class Callback {
79public:
80  typedef void RunType();
81
82  template <typename RunType>
83  Callback(BindState<RunType> bind_state) {
84    BindState<RunType>::Run();
85  }
86};
87
88
89Callback Bind() {
90  return Callback(BindState<void(void*)>());
91}
92
93}
94
95namespace rdar11700604 {
96  template<typename T> void foo() = delete;
97
98  struct X {
99    X() = default;
100
101    template<typename T> void foo() = delete;
102  };
103}
104
105namespace PR17334 {
106
107template <typename = void> struct ArrayRef {
108  constexpr ArrayRef() {}
109};
110template <typename = void> void CreateConstInBoundsGEP2_32() {
111  ArrayRef<> IdxList;
112}
113void LLVMBuildStructGEP() { CreateConstInBoundsGEP2_32(); }
114
115}
116
117namespace PR17661 {
118template <typename T>
119constexpr T Fun(T A) { return T(0); }
120
121constexpr int Var = Fun(20);
122}
123
124template <typename T>
125auto invalidTrailingRetType() -> Bogus {} // expected-error {{unknown type name 'Bogus'}}
126
127namespace PR19613 {
128
129struct HeapTypeConfig {
130  static void from_bitset();
131};
132
133template <class Config>
134struct TypeImpl  {
135  struct BitsetType;
136
137  static void Any() {
138    BitsetType::New();
139  }
140};
141
142template<class Config>
143struct TypeImpl<Config>::BitsetType {
144  static void New() {
145    Config::from_bitset();
146  }
147};
148
149static void f() {
150  TypeImpl<HeapTypeConfig>::Any();
151}
152
153template<typename A> struct S {
154  template<typename B> struct T;
155};
156template<typename A> template<typename B> struct S<A>::T {
157  template<typename C, typename D> struct U;
158  template<typename C> struct U<C, C> {
159    template<typename E> static int f() {
160      return sizeof(A) + sizeof(B) + sizeof(C) + sizeof(E);
161    }
162  };
163};
164
165static void g() {
166  S<int>::T<int>::U<int,int>::f<int>();
167}
168
169template<typename T> struct SS {
170  template<typename U> struct X;
171  template<typename U> struct X<U*>;
172};
173template<typename T> template<typename U> struct SS<T>::X<U*> {
174  static int f() {
175    return sizeof(T) + sizeof(U);
176  }
177};
178
179static void h() {
180  SS<int>::X<int*>::f();
181}
182
183}
184