annotate clang/test/SemaTemplate/instantiate-using-decl.cpp @ 207:2e18cbf3894f

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