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 |
170 | |