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