xref: /aosp_15_r20/external/clang/test/SemaTemplate/instantiate-using-decl.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -std=c++11 -fsyntax-only -verify %s
2*67e74705SXin Li // RUN: %clang_cc1 -std=c++98 -fsyntax-only -verify %s
3*67e74705SXin Li 
4*67e74705SXin Li namespace test0 {
5*67e74705SXin Li   namespace N { }
6*67e74705SXin Li 
7*67e74705SXin Li   template<typename T>
8*67e74705SXin Li   struct A {
9*67e74705SXin Li     void f();
10*67e74705SXin Li   };
11*67e74705SXin Li 
12*67e74705SXin Li   template<typename T>
13*67e74705SXin Li   struct B : A<T> {
14*67e74705SXin Li     using A<T>::f;
15*67e74705SXin Li 
gtest0::B16*67e74705SXin Li     void g() {
17*67e74705SXin Li       using namespace N;
18*67e74705SXin Li       f();
19*67e74705SXin Li     }
20*67e74705SXin Li   };
21*67e74705SXin Li 
22*67e74705SXin Li   template struct B<int>;
23*67e74705SXin Li }
24*67e74705SXin Li 
25*67e74705SXin Li namespace test1 {
26*67e74705SXin Li   template <class Derived> struct Visitor1 {
27*67e74705SXin Li     void Visit(struct Object1*);
28*67e74705SXin Li   };
29*67e74705SXin Li   template <class Derived> struct Visitor2 {
30*67e74705SXin Li     void Visit(struct Object2*); // expected-note {{candidate function}}
31*67e74705SXin Li   };
32*67e74705SXin Li 
33*67e74705SXin Li   template <class Derived> struct JoinVisitor
34*67e74705SXin Li       : Visitor1<Derived>, Visitor2<Derived> {
35*67e74705SXin Li     typedef Visitor1<Derived> Base1;
36*67e74705SXin Li     typedef Visitor2<Derived> Base2;
37*67e74705SXin Li 
38*67e74705SXin Li     void Visit(struct Object1*);  // expected-note {{candidate function}}
39*67e74705SXin Li     using Base2::Visit;
40*67e74705SXin Li   };
41*67e74705SXin Li 
42*67e74705SXin Li   class Knot : public JoinVisitor<Knot> {
43*67e74705SXin Li   };
44*67e74705SXin Li 
test()45*67e74705SXin Li   void test() {
46*67e74705SXin Li     Knot().Visit((struct Object1*) 0);
47*67e74705SXin Li     Knot().Visit((struct Object2*) 0);
48*67e74705SXin Li     Knot().Visit((struct Object3*) 0); // expected-error {{no matching member function for call}}
49*67e74705SXin Li   }
50*67e74705SXin Li }
51*67e74705SXin Li 
52*67e74705SXin Li // PR5847
53*67e74705SXin Li namespace test2 {
54*67e74705SXin Li   namespace ns {
55*67e74705SXin Li     void foo();
56*67e74705SXin Li   }
57*67e74705SXin Li 
bar(T * ptr)58*67e74705SXin Li   template <class T> void bar(T* ptr) {
59*67e74705SXin Li     using ns::foo;
60*67e74705SXin Li     foo();
61*67e74705SXin Li   }
62*67e74705SXin Li 
63*67e74705SXin Li   template void bar(char *);
64*67e74705SXin Li }
65*67e74705SXin Li 
66*67e74705SXin Li namespace test3 {
67*67e74705SXin Li   template <typename T> struct t {
68*67e74705SXin Li     struct s1 {
69*67e74705SXin Li       T f1() const;
70*67e74705SXin Li     };
71*67e74705SXin Li     struct s2 : s1 {
72*67e74705SXin Li       using s1::f1;
73*67e74705SXin Li       T f1() const;
74*67e74705SXin Li     };
75*67e74705SXin Li   };
76*67e74705SXin Li 
f2()77*67e74705SXin Li   void f2()
78*67e74705SXin Li   {
79*67e74705SXin Li     t<int>::s2 a;
80*67e74705SXin Li     t<int>::s2 const & b = a;
81*67e74705SXin Li     b.f1();
82*67e74705SXin Li   }
83*67e74705SXin Li }
84*67e74705SXin Li 
85*67e74705SXin Li namespace PR16936 {
86*67e74705SXin Li   // Make sure both using decls are properly considered for
87*67e74705SXin Li   // overload resolution.
88*67e74705SXin Li   template<class> struct A {
89*67e74705SXin Li     void access(int);
90*67e74705SXin Li   };
91*67e74705SXin Li   template<class> struct B {
92*67e74705SXin Li     void access();
93*67e74705SXin Li   };
94*67e74705SXin Li   template<class CELL> struct X : public A<CELL>, public B<CELL> {
95*67e74705SXin Li     using A<CELL>::access;
96*67e74705SXin Li     using B<CELL>::access;
97*67e74705SXin Li 
fPR16936::X98*67e74705SXin Li     void f() {
99*67e74705SXin Li       access(0);
100*67e74705SXin Li     }
101*67e74705SXin Li   };
102*67e74705SXin Li 
f()103*67e74705SXin Li   void f() {
104*67e74705SXin Li     X<int> x;
105*67e74705SXin Li     x.f();
106*67e74705SXin Li   }
107*67e74705SXin Li }
108*67e74705SXin Li 
109*67e74705SXin Li namespace pr21923 {
110*67e74705SXin Li template <typename> struct Base {
111*67e74705SXin Li   int field;
112*67e74705SXin Li   void method();
113*67e74705SXin Li };
114*67e74705SXin Li template <typename Scalar> struct Derived : Base<Scalar> {
115*67e74705SXin Li   using Base<Scalar>::field;
116*67e74705SXin Li   using Base<Scalar>::method;
m_fn1pr21923::Derived117*67e74705SXin Li   static void m_fn1() {
118*67e74705SXin Li     // expected-error@+1 {{invalid use of member 'field' in static member function}}
119*67e74705SXin Li     (void)field;
120*67e74705SXin Li     // expected-error@+1 {{invalid use of member 'field' in static member function}}
121*67e74705SXin Li     (void)&field;
122*67e74705SXin Li     // expected-error@+1 {{call to non-static member function without an object argument}}
123*67e74705SXin Li     (void)method;
124*67e74705SXin Li     // expected-error@+1 {{call to non-static member function without an object argument}}
125*67e74705SXin Li     (void)&method;
126*67e74705SXin Li     // expected-error@+1 {{call to non-static member function without an object argument}}
127*67e74705SXin Li     method();
128*67e74705SXin Li     (void)&Base<Scalar>::field;
129*67e74705SXin Li     (void)&Base<Scalar>::method;
130*67e74705SXin Li   }
131*67e74705SXin Li #if __cplusplus >= 201103L
132*67e74705SXin Li   // These usages are OK in C++11 due to the unevaluated context.
133*67e74705SXin Li   enum { TheSize = sizeof(field) };
134*67e74705SXin Li   typedef decltype(field) U;
135*67e74705SXin Li #else
136*67e74705SXin Li   // expected-error@+1 {{invalid use of non-static data member 'field'}}
137*67e74705SXin Li   enum { TheSize = sizeof(field) };
138*67e74705SXin Li #endif
139*67e74705SXin Li };
140*67e74705SXin Li 
141*67e74705SXin Li #if __cplusplus < 201103L
142*67e74705SXin Li // C++98 has an extra note for TheSize.
143*67e74705SXin Li // expected-note@+2 {{requested here}}
144*67e74705SXin Li #endif
145*67e74705SXin Li template class Derived<int>; // expected-note {{requested here}}
146*67e74705SXin Li 
147*67e74705SXin Li // This is interesting because we form an UnresolvedLookupExpr in the static
148*67e74705SXin Li // function template and an UnresolvedMemberExpr in the instance function
149*67e74705SXin Li // template. As a result, we get slightly different behavior.
150*67e74705SXin Li struct UnresolvedTemplateNames {
151*67e74705SXin Li   template <typename> void maybe_static();
152*67e74705SXin Li #if __cplusplus < 201103L
153*67e74705SXin Li   // expected-warning@+2 {{default template arguments for a function template are a C++11 extension}}
154*67e74705SXin Li #endif
155*67e74705SXin Li   template <typename T, typename T::type = 0> static void maybe_static();
156*67e74705SXin Li 
157*67e74705SXin Li   template <typename T>
instance_methodpr21923::UnresolvedTemplateNames158*67e74705SXin Li   void instance_method() { (void)maybe_static<T>(); }
159*67e74705SXin Li   template <typename T>
static_methodpr21923::UnresolvedTemplateNames160*67e74705SXin Li   static void static_method() {
161*67e74705SXin Li     // expected-error@+1 {{call to non-static member function without an object argument}}
162*67e74705SXin Li     (void)maybe_static<T>();
163*67e74705SXin Li   }
164*67e74705SXin Li };
force_instantiation(UnresolvedTemplateNames x)165*67e74705SXin Li void force_instantiation(UnresolvedTemplateNames x) {
166*67e74705SXin Li   x.instance_method<int>();
167*67e74705SXin Li   UnresolvedTemplateNames::static_method<int>(); // expected-note {{requested here}}
168*67e74705SXin Li }
169*67e74705SXin Li } // pr21923
170