DelayedTemplateParsing.cpp revision 651f13cea278ec967336033dd032faef0e9fc2ec
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}}  expected-note {{previous definition is here}}
14   void foo4() { } // expected-error {{class member cannot be redeclared}} expected-error {{redefinition of 'foo4'}}
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