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