friend.cc revision 1.1 1 1.1 mrg /* Help friends in C++.
2 1.1 mrg Copyright (C) 1997-2022 Free Software Foundation, Inc.
3 1.1 mrg
4 1.1 mrg This file is part of GCC.
5 1.1 mrg
6 1.1 mrg GCC is free software; you can redistribute it and/or modify
7 1.1 mrg it under the terms of the GNU General Public License as published by
8 1.1 mrg the Free Software Foundation; either version 3, or (at your option)
9 1.1 mrg any later version.
10 1.1 mrg
11 1.1 mrg GCC is distributed in the hope that it will be useful,
12 1.1 mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 1.1 mrg GNU General Public License for more details.
15 1.1 mrg
16 1.1 mrg You should have received a copy of the GNU General Public License
17 1.1 mrg along with GCC; see the file COPYING3. If not see
18 1.1 mrg <http://www.gnu.org/licenses/>. */
19 1.1 mrg
20 1.1 mrg #include "config.h"
21 1.1 mrg #include "system.h"
22 1.1 mrg #include "coretypes.h"
23 1.1 mrg #include "cp-tree.h"
24 1.1 mrg
25 1.1 mrg /* Friend data structures are described in cp-tree.h. */
26 1.1 mrg
27 1.1 mrg
28 1.1 mrg /* The GLOBAL_FRIEND scope (functions, classes, or templates) is
29 1.1 mrg regarded as a friend of every class. This is only used by libcc1,
30 1.1 mrg to enable GDB's code snippets to access private members without
31 1.1 mrg disabling access control in general, which could cause different
32 1.1 mrg template overload resolution results when accessibility matters
33 1.1 mrg (e.g. tests for an accessible member). */
34 1.1 mrg
35 1.1 mrg static GTY(()) tree global_friend;
36 1.1 mrg
37 1.1 mrg /* Set the GLOBAL_FRIEND for this compilation session. It might be
38 1.1 mrg set multiple times, but always to the same scope. */
39 1.1 mrg
40 1.1 mrg void
41 1.1 mrg set_global_friend (tree scope)
42 1.1 mrg {
43 1.1 mrg gcc_checking_assert (scope != NULL_TREE);
44 1.1 mrg gcc_assert (!global_friend || global_friend == scope);
45 1.1 mrg global_friend = scope;
46 1.1 mrg }
47 1.1 mrg
48 1.1 mrg /* Return TRUE if SCOPE is the global friend. */
49 1.1 mrg
50 1.1 mrg bool
51 1.1 mrg is_global_friend (tree scope)
52 1.1 mrg {
53 1.1 mrg gcc_checking_assert (scope != NULL_TREE);
54 1.1 mrg
55 1.1 mrg if (global_friend == scope)
56 1.1 mrg return true;
57 1.1 mrg
58 1.1 mrg if (!global_friend)
59 1.1 mrg return false;
60 1.1 mrg
61 1.1 mrg if (is_specialization_of_friend (global_friend, scope))
62 1.1 mrg return true;
63 1.1 mrg
64 1.1 mrg return false;
65 1.1 mrg }
66 1.1 mrg
67 1.1 mrg /* Returns nonzero if SUPPLICANT is a friend of TYPE. */
68 1.1 mrg
69 1.1 mrg int
70 1.1 mrg is_friend (tree type, tree supplicant)
71 1.1 mrg {
72 1.1 mrg int declp;
73 1.1 mrg tree list;
74 1.1 mrg tree context;
75 1.1 mrg
76 1.1 mrg if (supplicant == NULL_TREE || type == NULL_TREE)
77 1.1 mrg return 0;
78 1.1 mrg
79 1.1 mrg if (is_global_friend (supplicant))
80 1.1 mrg return 1;
81 1.1 mrg
82 1.1 mrg declp = DECL_P (supplicant);
83 1.1 mrg
84 1.1 mrg if (declp)
85 1.1 mrg /* It's a function decl. */
86 1.1 mrg {
87 1.1 mrg tree list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type));
88 1.1 mrg tree name = DECL_NAME (supplicant);
89 1.1 mrg
90 1.1 mrg for (; list ; list = TREE_CHAIN (list))
91 1.1 mrg {
92 1.1 mrg if (name == FRIEND_NAME (list))
93 1.1 mrg {
94 1.1 mrg tree friends = FRIEND_DECLS (list);
95 1.1 mrg for (; friends ; friends = TREE_CHAIN (friends))
96 1.1 mrg {
97 1.1 mrg tree this_friend = TREE_VALUE (friends);
98 1.1 mrg
99 1.1 mrg if (this_friend == NULL_TREE)
100 1.1 mrg continue;
101 1.1 mrg
102 1.1 mrg if (supplicant == this_friend)
103 1.1 mrg return 1;
104 1.1 mrg
105 1.1 mrg if (is_specialization_of_friend (supplicant, this_friend))
106 1.1 mrg return 1;
107 1.1 mrg }
108 1.1 mrg break;
109 1.1 mrg }
110 1.1 mrg }
111 1.1 mrg }
112 1.1 mrg else
113 1.1 mrg /* It's a type. */
114 1.1 mrg {
115 1.1 mrg if (same_type_p (supplicant, type))
116 1.1 mrg return 1;
117 1.1 mrg
118 1.1 mrg list = CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (TYPE_MAIN_DECL (type)));
119 1.1 mrg for (; list ; list = TREE_CHAIN (list))
120 1.1 mrg {
121 1.1 mrg tree t = TREE_VALUE (list);
122 1.1 mrg
123 1.1 mrg if (TREE_CODE (t) == TEMPLATE_DECL ?
124 1.1 mrg is_specialization_of_friend (TYPE_MAIN_DECL (supplicant), t) :
125 1.1 mrg same_type_p (supplicant, t))
126 1.1 mrg return 1;
127 1.1 mrg }
128 1.1 mrg }
129 1.1 mrg
130 1.1 mrg if (declp)
131 1.1 mrg {
132 1.1 mrg if (DECL_FUNCTION_MEMBER_P (supplicant))
133 1.1 mrg context = DECL_CONTEXT (supplicant);
134 1.1 mrg else
135 1.1 mrg context = NULL_TREE;
136 1.1 mrg }
137 1.1 mrg else
138 1.1 mrg {
139 1.1 mrg if (TYPE_CLASS_SCOPE_P (supplicant))
140 1.1 mrg /* Nested classes get the same access as their enclosing types, as
141 1.1 mrg per DR 45 (this is a change from the standard). */
142 1.1 mrg context = TYPE_CONTEXT (supplicant);
143 1.1 mrg else
144 1.1 mrg /* Local classes have the same access as the enclosing function. */
145 1.1 mrg context = decl_function_context (TYPE_MAIN_DECL (supplicant));
146 1.1 mrg }
147 1.1 mrg
148 1.1 mrg /* A namespace is not friend to anybody. */
149 1.1 mrg if (context && TREE_CODE (context) == NAMESPACE_DECL)
150 1.1 mrg context = NULL_TREE;
151 1.1 mrg
152 1.1 mrg if (context)
153 1.1 mrg return is_friend (type, context);
154 1.1 mrg
155 1.1 mrg return 0;
156 1.1 mrg }
157 1.1 mrg
158 1.1 mrg /* Add a new friend to the friends of the aggregate type TYPE.
159 1.1 mrg DECL is the FUNCTION_DECL of the friend being added.
160 1.1 mrg
161 1.1 mrg If COMPLAIN is true, warning about duplicate friend is issued.
162 1.1 mrg We want to have this diagnostics during parsing but not
163 1.1 mrg when a template is being instantiated. */
164 1.1 mrg
165 1.1 mrg void
166 1.1 mrg add_friend (tree type, tree decl, bool complain)
167 1.1 mrg {
168 1.1 mrg tree typedecl;
169 1.1 mrg tree list;
170 1.1 mrg tree name;
171 1.1 mrg tree ctx;
172 1.1 mrg
173 1.1 mrg if (decl == error_mark_node)
174 1.1 mrg return;
175 1.1 mrg
176 1.1 mrg typedecl = TYPE_MAIN_DECL (type);
177 1.1 mrg list = DECL_FRIENDLIST (typedecl);
178 1.1 mrg name = DECL_NAME (decl);
179 1.1 mrg type = TREE_TYPE (typedecl);
180 1.1 mrg
181 1.1 mrg while (list)
182 1.1 mrg {
183 1.1 mrg if (name == FRIEND_NAME (list))
184 1.1 mrg {
185 1.1 mrg tree friends = FRIEND_DECLS (list);
186 1.1 mrg for (; friends ; friends = TREE_CHAIN (friends))
187 1.1 mrg {
188 1.1 mrg if (decl == TREE_VALUE (friends))
189 1.1 mrg {
190 1.1 mrg if (complain)
191 1.1 mrg warning (OPT_Wredundant_decls,
192 1.1 mrg "%qD is already a friend of class %qT",
193 1.1 mrg decl, type);
194 1.1 mrg return;
195 1.1 mrg }
196 1.1 mrg }
197 1.1 mrg
198 1.1 mrg TREE_VALUE (list) = tree_cons (NULL_TREE, decl,
199 1.1 mrg TREE_VALUE (list));
200 1.1 mrg break;
201 1.1 mrg }
202 1.1 mrg list = TREE_CHAIN (list);
203 1.1 mrg }
204 1.1 mrg
205 1.1 mrg ctx = DECL_CONTEXT (decl);
206 1.1 mrg if (ctx && CLASS_TYPE_P (ctx) && !uses_template_parms (ctx))
207 1.1 mrg perform_or_defer_access_check (TYPE_BINFO (ctx), decl, decl,
208 1.1 mrg tf_warning_or_error);
209 1.1 mrg
210 1.1 mrg maybe_add_class_template_decl_list (type, decl, /*friend_p=*/1);
211 1.1 mrg
212 1.1 mrg if (!list)
213 1.1 mrg DECL_FRIENDLIST (typedecl)
214 1.1 mrg = tree_cons (DECL_NAME (decl), build_tree_list (NULL_TREE, decl),
215 1.1 mrg DECL_FRIENDLIST (typedecl));
216 1.1 mrg if (!uses_template_parms (type))
217 1.1 mrg DECL_BEFRIENDING_CLASSES (decl)
218 1.1 mrg = tree_cons (NULL_TREE, type,
219 1.1 mrg DECL_BEFRIENDING_CLASSES (decl));
220 1.1 mrg }
221 1.1 mrg
222 1.1 mrg /* Make FRIEND_TYPE a friend class to TYPE. If FRIEND_TYPE has already
223 1.1 mrg been defined, we make all of its member functions friends of
224 1.1 mrg TYPE. If not, we make it a pending friend, which can later be added
225 1.1 mrg when its definition is seen. If a type is defined, then its TYPE_DECL's
226 1.1 mrg DECL_UNDEFINED_FRIENDS contains a (possibly empty) list of friend
227 1.1 mrg classes that are not defined. If a type has not yet been defined,
228 1.1 mrg then the DECL_WAITING_FRIENDS contains a list of types
229 1.1 mrg waiting to make it their friend. Note that these two can both
230 1.1 mrg be in use at the same time!
231 1.1 mrg
232 1.1 mrg If COMPLAIN is true, warning about duplicate friend is issued.
233 1.1 mrg We want to have this diagnostics during parsing but not
234 1.1 mrg when a template is being instantiated. */
235 1.1 mrg
236 1.1 mrg void
237 1.1 mrg make_friend_class (tree type, tree friend_type, bool complain)
238 1.1 mrg {
239 1.1 mrg tree classes;
240 1.1 mrg
241 1.1 mrg /* CLASS_TEMPLATE_DEPTH counts the number of template headers for
242 1.1 mrg the enclosing class. FRIEND_DEPTH counts the number of template
243 1.1 mrg headers used for this friend declaration. TEMPLATE_MEMBER_P,
244 1.1 mrg defined inside the `if' block for TYPENAME_TYPE case, is true if
245 1.1 mrg a template header in FRIEND_DEPTH is intended for DECLARATOR.
246 1.1 mrg For example, the code
247 1.1 mrg
248 1.1 mrg template <class T> struct A {
249 1.1 mrg template <class U> struct B {
250 1.1 mrg template <class V> template <class W>
251 1.1 mrg friend class C<V>::D;
252 1.1 mrg };
253 1.1 mrg };
254 1.1 mrg
255 1.1 mrg will eventually give the following results
256 1.1 mrg
257 1.1 mrg 1. CLASS_TEMPLATE_DEPTH equals 2 (for `T' and `U').
258 1.1 mrg 2. FRIEND_DEPTH equals 2 (for `V' and `W').
259 1.1 mrg 3. TEMPLATE_MEMBER_P is true (for `W').
260 1.1 mrg
261 1.1 mrg The friend is a template friend iff FRIEND_DEPTH is nonzero. */
262 1.1 mrg
263 1.1 mrg int class_template_depth = template_class_depth (type);
264 1.1 mrg int friend_depth = 0;
265 1.1 mrg if (current_template_depth)
266 1.1 mrg /* When processing a friend declaration at parse time, just compare the
267 1.1 mrg current depth to that of the class template. */
268 1.1 mrg friend_depth = current_template_depth - class_template_depth;
269 1.1 mrg else
270 1.1 mrg {
271 1.1 mrg /* Otherwise, we got here from instantiate_class_template. Determine
272 1.1 mrg the friend depth by looking at the template parameters used within
273 1.1 mrg FRIEND_TYPE. */
274 1.1 mrg gcc_checking_assert (class_template_depth == 0);
275 1.1 mrg while (uses_template_parms_level (friend_type, friend_depth + 1))
276 1.1 mrg ++friend_depth;
277 1.1 mrg }
278 1.1 mrg
279 1.1 mrg if (! MAYBE_CLASS_TYPE_P (friend_type)
280 1.1 mrg && TREE_CODE (friend_type) != TEMPLATE_TEMPLATE_PARM)
281 1.1 mrg {
282 1.1 mrg /* N1791: If the type specifier in a friend declaration designates a
283 1.1 mrg (possibly cv-qualified) class type, that class is declared as a
284 1.1 mrg friend; otherwise, the friend declaration is ignored.
285 1.1 mrg
286 1.1 mrg So don't complain in C++11 mode. */
287 1.1 mrg if (cxx_dialect < cxx11)
288 1.1 mrg pedwarn (input_location, complain ? 0 : OPT_Wpedantic,
289 1.1 mrg "invalid type %qT declared %<friend%>", friend_type);
290 1.1 mrg return;
291 1.1 mrg }
292 1.1 mrg
293 1.1 mrg friend_type = cv_unqualified (friend_type);
294 1.1 mrg
295 1.1 mrg if (check_for_bare_parameter_packs (friend_type))
296 1.1 mrg return;
297 1.1 mrg
298 1.1 mrg if (friend_depth)
299 1.1 mrg {
300 1.1 mrg /* [temp.friend] Friend declarations shall not declare partial
301 1.1 mrg specializations. */
302 1.1 mrg if (CLASS_TYPE_P (friend_type)
303 1.1 mrg && CLASSTYPE_TEMPLATE_SPECIALIZATION (friend_type)
304 1.1 mrg && uses_template_parms (friend_type))
305 1.1 mrg {
306 1.1 mrg error ("partial specialization %qT declared %<friend%>",
307 1.1 mrg friend_type);
308 1.1 mrg return;
309 1.1 mrg }
310 1.1 mrg
311 1.1 mrg if (TYPE_TEMPLATE_INFO (friend_type)
312 1.1 mrg && !PRIMARY_TEMPLATE_P (TYPE_TI_TEMPLATE (friend_type)))
313 1.1 mrg {
314 1.1 mrg auto_diagnostic_group d;
315 1.1 mrg error ("%qT is not a template", friend_type);
316 1.1 mrg inform (location_of (friend_type), "previous declaration here");
317 1.1 mrg if (TYPE_CLASS_SCOPE_P (friend_type)
318 1.1 mrg && CLASSTYPE_TEMPLATE_INFO (TYPE_CONTEXT (friend_type))
319 1.1 mrg && currently_open_class (TYPE_CONTEXT (friend_type)))
320 1.1 mrg inform (input_location, "perhaps you need explicit template "
321 1.1 mrg "arguments in your nested-name-specifier");
322 1.1 mrg return;
323 1.1 mrg }
324 1.1 mrg }
325 1.1 mrg
326 1.1 mrg /* It makes sense for a template class to be friends with itself,
327 1.1 mrg that means the instantiations can be friendly. Other cases are
328 1.1 mrg not so meaningful. */
329 1.1 mrg if (!friend_depth && same_type_p (type, friend_type))
330 1.1 mrg {
331 1.1 mrg if (complain)
332 1.1 mrg warning (0, "class %qT is implicitly friends with itself",
333 1.1 mrg type);
334 1.1 mrg return;
335 1.1 mrg }
336 1.1 mrg
337 1.1 mrg /* [temp.friend]
338 1.1 mrg
339 1.1 mrg A friend of a class or class template can be a function or
340 1.1 mrg class template, a specialization of a function template or
341 1.1 mrg class template, or an ordinary (nontemplate) function or
342 1.1 mrg class. */
343 1.1 mrg if (!friend_depth)
344 1.1 mrg ;/* ok */
345 1.1 mrg else if (TREE_CODE (friend_type) == TYPENAME_TYPE)
346 1.1 mrg {
347 1.1 mrg if (TREE_CODE (TYPENAME_TYPE_FULLNAME (friend_type))
348 1.1 mrg == TEMPLATE_ID_EXPR)
349 1.1 mrg {
350 1.1 mrg /* template <class U> friend class T::X<U>; */
351 1.1 mrg /* [temp.friend]
352 1.1 mrg Friend declarations shall not declare partial
353 1.1 mrg specializations. */
354 1.1 mrg error ("partial specialization %qT declared %<friend%>",
355 1.1 mrg friend_type);
356 1.1 mrg return;
357 1.1 mrg }
358 1.1 mrg else
359 1.1 mrg {
360 1.1 mrg /* We will figure this out later. */
361 1.1 mrg bool template_member_p = false;
362 1.1 mrg
363 1.1 mrg tree ctype = TYPE_CONTEXT (friend_type);
364 1.1 mrg tree name = TYPE_IDENTIFIER (friend_type);
365 1.1 mrg tree decl;
366 1.1 mrg
367 1.1 mrg /* We need to distinguish a TYPENAME_TYPE for the non-template
368 1.1 mrg class B in
369 1.1 mrg template<class T> friend class A<T>::B;
370 1.1 mrg vs for the class template B in
371 1.1 mrg template<class T> template<class U> friend class A<T>::B; */
372 1.1 mrg if (current_template_depth
373 1.1 mrg && !uses_template_parms_level (ctype, current_template_depth))
374 1.1 mrg template_member_p = true;
375 1.1 mrg
376 1.1 mrg if (class_template_depth)
377 1.1 mrg {
378 1.1 mrg /* We rely on tsubst_friend_class to check the
379 1.1 mrg validity of the declaration later. */
380 1.1 mrg if (template_member_p)
381 1.1 mrg friend_type
382 1.1 mrg = make_unbound_class_template (ctype,
383 1.1 mrg name,
384 1.1 mrg current_template_parms,
385 1.1 mrg tf_error);
386 1.1 mrg else
387 1.1 mrg friend_type
388 1.1 mrg = make_typename_type (ctype, name, class_type, tf_error);
389 1.1 mrg }
390 1.1 mrg else
391 1.1 mrg {
392 1.1 mrg decl = lookup_member (ctype, name, 0, true, tf_warning_or_error);
393 1.1 mrg if (!decl)
394 1.1 mrg {
395 1.1 mrg error ("%qT is not a member of %qT", name, ctype);
396 1.1 mrg return;
397 1.1 mrg }
398 1.1 mrg if (template_member_p && !DECL_CLASS_TEMPLATE_P (decl))
399 1.1 mrg {
400 1.1 mrg auto_diagnostic_group d;
401 1.1 mrg error ("%qT is not a member class template of %qT",
402 1.1 mrg name, ctype);
403 1.1 mrg inform (DECL_SOURCE_LOCATION (decl),
404 1.1 mrg "%qD declared here", decl);
405 1.1 mrg return;
406 1.1 mrg }
407 1.1 mrg if (!template_member_p && (TREE_CODE (decl) != TYPE_DECL
408 1.1 mrg || !CLASS_TYPE_P (TREE_TYPE (decl))))
409 1.1 mrg {
410 1.1 mrg auto_diagnostic_group d;
411 1.1 mrg error ("%qT is not a nested class of %qT",
412 1.1 mrg name, ctype);
413 1.1 mrg inform (DECL_SOURCE_LOCATION (decl),
414 1.1 mrg "%qD declared here", decl);
415 1.1 mrg return;
416 1.1 mrg }
417 1.1 mrg
418 1.1 mrg friend_type = CLASSTYPE_TI_TEMPLATE (TREE_TYPE (decl));
419 1.1 mrg }
420 1.1 mrg }
421 1.1 mrg }
422 1.1 mrg else if (TREE_CODE (friend_type) == TEMPLATE_TYPE_PARM)
423 1.1 mrg {
424 1.1 mrg /* template <class T> friend class T; */
425 1.1 mrg error ("template parameter type %qT declared %<friend%>", friend_type);
426 1.1 mrg return;
427 1.1 mrg }
428 1.1 mrg else if (TREE_CODE (friend_type) == TEMPLATE_TEMPLATE_PARM)
429 1.1 mrg friend_type = TYPE_NAME (friend_type);
430 1.1 mrg else if (!CLASSTYPE_TEMPLATE_INFO (friend_type))
431 1.1 mrg {
432 1.1 mrg /* template <class T> friend class A; where A is not a template */
433 1.1 mrg error ("%q#T is not a template", friend_type);
434 1.1 mrg return;
435 1.1 mrg }
436 1.1 mrg else
437 1.1 mrg /* template <class T> friend class A; where A is a template */
438 1.1 mrg friend_type = CLASSTYPE_TI_TEMPLATE (friend_type);
439 1.1 mrg
440 1.1 mrg if (friend_type == error_mark_node)
441 1.1 mrg return;
442 1.1 mrg
443 1.1 mrg /* See if it is already a friend. */
444 1.1 mrg for (classes = CLASSTYPE_FRIEND_CLASSES (type);
445 1.1 mrg classes;
446 1.1 mrg classes = TREE_CHAIN (classes))
447 1.1 mrg {
448 1.1 mrg tree probe = TREE_VALUE (classes);
449 1.1 mrg
450 1.1 mrg if (TREE_CODE (friend_type) == TEMPLATE_DECL)
451 1.1 mrg {
452 1.1 mrg if (friend_type == probe)
453 1.1 mrg {
454 1.1 mrg if (complain)
455 1.1 mrg warning (OPT_Wredundant_decls,
456 1.1 mrg "%qD is already a friend of %qT", probe, type);
457 1.1 mrg break;
458 1.1 mrg }
459 1.1 mrg }
460 1.1 mrg else if (TREE_CODE (probe) != TEMPLATE_DECL)
461 1.1 mrg {
462 1.1 mrg if (same_type_p (probe, friend_type))
463 1.1 mrg {
464 1.1 mrg if (complain)
465 1.1 mrg warning (OPT_Wredundant_decls,
466 1.1 mrg "%qT is already a friend of %qT", probe, type);
467 1.1 mrg break;
468 1.1 mrg }
469 1.1 mrg }
470 1.1 mrg }
471 1.1 mrg
472 1.1 mrg if (!classes)
473 1.1 mrg {
474 1.1 mrg maybe_add_class_template_decl_list (type, friend_type, /*friend_p=*/1);
475 1.1 mrg
476 1.1 mrg CLASSTYPE_FRIEND_CLASSES (type)
477 1.1 mrg = tree_cons (NULL_TREE, friend_type, CLASSTYPE_FRIEND_CLASSES (type));
478 1.1 mrg if (TREE_CODE (friend_type) == TEMPLATE_DECL)
479 1.1 mrg friend_type = TREE_TYPE (friend_type);
480 1.1 mrg if (!uses_template_parms (type))
481 1.1 mrg CLASSTYPE_BEFRIENDING_CLASSES (friend_type)
482 1.1 mrg = tree_cons (NULL_TREE, type,
483 1.1 mrg CLASSTYPE_BEFRIENDING_CLASSES (friend_type));
484 1.1 mrg }
485 1.1 mrg }
486 1.1 mrg
487 1.1 mrg /* Record DECL (a FUNCTION_DECL) as a friend of the
488 1.1 mrg CURRENT_CLASS_TYPE. If DECL is a member function, SCOPE is the
489 1.1 mrg class of which it is a member, as named in the friend declaration.
490 1.1 mrg If the friend declaration was explicitly namespace-qualified, SCOPE
491 1.1 mrg is that namespace.
492 1.1 mrg DECLARATOR is the name of the friend. FUNCDEF_FLAG is true if the
493 1.1 mrg friend declaration is a definition of the function. FLAGS is as
494 1.1 mrg for grokclass fn. */
495 1.1 mrg
496 1.1 mrg tree
497 1.1 mrg do_friend (tree scope, tree declarator, tree decl,
498 1.1 mrg enum overload_flags flags,
499 1.1 mrg bool funcdef_flag)
500 1.1 mrg {
501 1.1 mrg gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
502 1.1 mrg
503 1.1 mrg tree ctype = NULL_TREE;
504 1.1 mrg tree in_namespace = NULL_TREE;
505 1.1 mrg if (!scope)
506 1.1 mrg ;
507 1.1 mrg else if (MAYBE_CLASS_TYPE_P (scope))
508 1.1 mrg ctype = scope;
509 1.1 mrg else
510 1.1 mrg {
511 1.1 mrg gcc_checking_assert (TREE_CODE (scope) == NAMESPACE_DECL);
512 1.1 mrg in_namespace = scope;
513 1.1 mrg }
514 1.1 mrg
515 1.1 mrg /* Friend functions are unique, until proved otherwise. */
516 1.1 mrg DECL_UNIQUE_FRIEND_P (decl) = 1;
517 1.1 mrg
518 1.1 mrg if (DECL_OVERRIDE_P (decl) || DECL_FINAL_P (decl))
519 1.1 mrg error ("friend declaration %qD may not have virt-specifiers",
520 1.1 mrg decl);
521 1.1 mrg
522 1.1 mrg if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR)
523 1.1 mrg {
524 1.1 mrg declarator = TREE_OPERAND (declarator, 0);
525 1.1 mrg if (!identifier_p (declarator))
526 1.1 mrg declarator = OVL_NAME (declarator);
527 1.1 mrg }
528 1.1 mrg
529 1.1 mrg if (ctype)
530 1.1 mrg {
531 1.1 mrg /* CLASS_TEMPLATE_DEPTH counts the number of template headers for
532 1.1 mrg the enclosing class. FRIEND_DEPTH counts the number of template
533 1.1 mrg headers used for this friend declaration. TEMPLATE_MEMBER_P is
534 1.1 mrg true if a template header in FRIEND_DEPTH is intended for
535 1.1 mrg DECLARATOR. For example, the code
536 1.1 mrg
537 1.1 mrg template <class T> struct A {
538 1.1 mrg template <class U> struct B {
539 1.1 mrg template <class V> template <class W>
540 1.1 mrg friend void C<V>::f(W);
541 1.1 mrg };
542 1.1 mrg };
543 1.1 mrg
544 1.1 mrg will eventually give the following results
545 1.1 mrg
546 1.1 mrg 1. CLASS_TEMPLATE_DEPTH equals 2 (for `T' and `U').
547 1.1 mrg 2. FRIEND_DEPTH equals 2 (for `V' and `W').
548 1.1 mrg 3. TEMPLATE_MEMBER_P is true (for `W'). */
549 1.1 mrg
550 1.1 mrg int class_template_depth = template_class_depth (current_class_type);
551 1.1 mrg int friend_depth = current_template_depth - class_template_depth;
552 1.1 mrg /* We will figure this out later. */
553 1.1 mrg bool template_member_p = false;
554 1.1 mrg
555 1.1 mrg tree cname = TYPE_NAME (ctype);
556 1.1 mrg if (TREE_CODE (cname) == TYPE_DECL)
557 1.1 mrg cname = DECL_NAME (cname);
558 1.1 mrg
559 1.1 mrg /* A method friend. */
560 1.1 mrg if (flags == NO_SPECIAL && declarator == cname)
561 1.1 mrg DECL_CXX_CONSTRUCTOR_P (decl) = 1;
562 1.1 mrg
563 1.1 mrg grokclassfn (ctype, decl, flags);
564 1.1 mrg
565 1.1 mrg if (friend_depth)
566 1.1 mrg {
567 1.1 mrg if (!uses_template_parms_level (ctype, class_template_depth
568 1.1 mrg + friend_depth))
569 1.1 mrg template_member_p = true;
570 1.1 mrg }
571 1.1 mrg
572 1.1 mrg /* A nested class may declare a member of an enclosing class
573 1.1 mrg to be a friend, so we do lookup here even if CTYPE is in
574 1.1 mrg the process of being defined. */
575 1.1 mrg if (class_template_depth
576 1.1 mrg || COMPLETE_OR_OPEN_TYPE_P (ctype))
577 1.1 mrg {
578 1.1 mrg if (DECL_TEMPLATE_INFO (decl))
579 1.1 mrg /* DECL is a template specialization. No need to
580 1.1 mrg build a new TEMPLATE_DECL. */
581 1.1 mrg ;
582 1.1 mrg else if (class_template_depth)
583 1.1 mrg /* We rely on tsubst_friend_function to check the
584 1.1 mrg validity of the declaration later. */
585 1.1 mrg decl = push_template_decl (decl, /*is_friend=*/true);
586 1.1 mrg else
587 1.1 mrg decl = check_classfn (ctype, decl,
588 1.1 mrg template_member_p
589 1.1 mrg ? current_template_parms
590 1.1 mrg : NULL_TREE);
591 1.1 mrg
592 1.1 mrg if ((template_member_p
593 1.1 mrg /* Always pull out the TEMPLATE_DECL if we have a friend
594 1.1 mrg template in a class template so that it gets tsubsted
595 1.1 mrg properly later on (59956). tsubst_friend_function knows
596 1.1 mrg how to tell this apart from a member template. */
597 1.1 mrg || (class_template_depth && friend_depth))
598 1.1 mrg && decl && TREE_CODE (decl) == FUNCTION_DECL)
599 1.1 mrg decl = DECL_TI_TEMPLATE (decl);
600 1.1 mrg
601 1.1 mrg if (decl)
602 1.1 mrg add_friend (current_class_type, decl, /*complain=*/true);
603 1.1 mrg }
604 1.1 mrg else
605 1.1 mrg error ("member %qD declared as friend before type %qT defined",
606 1.1 mrg decl, ctype);
607 1.1 mrg }
608 1.1 mrg else
609 1.1 mrg {
610 1.1 mrg /* Namespace-scope friend function. */
611 1.1 mrg int is_friend_template = PROCESSING_REAL_TEMPLATE_DECL_P ();
612 1.1 mrg
613 1.1 mrg if (funcdef_flag)
614 1.1 mrg SET_DECL_FRIEND_CONTEXT (decl, current_class_type);
615 1.1 mrg
616 1.1 mrg if (! DECL_USE_TEMPLATE (decl))
617 1.1 mrg {
618 1.1 mrg /* We must check whether the decl refers to template
619 1.1 mrg arguments before push_template_decl adds a reference to
620 1.1 mrg the containing template class. */
621 1.1 mrg int warn = (warn_nontemplate_friend
622 1.1 mrg && ! funcdef_flag && ! is_friend_template
623 1.1 mrg && current_template_parms
624 1.1 mrg && uses_template_parms (decl));
625 1.1 mrg
626 1.1 mrg if (is_friend_template
627 1.1 mrg || template_class_depth (current_class_type) != 0)
628 1.1 mrg /* We can't call pushdecl for a template class, since in
629 1.1 mrg general, such a declaration depends on template
630 1.1 mrg parameters. Instead, we call pushdecl when the class
631 1.1 mrg is instantiated. */
632 1.1 mrg decl = push_template_decl (decl, /*is_friend=*/true);
633 1.1 mrg else if (current_function_decl && !in_namespace)
634 1.1 mrg /* pushdecl will check there's a local decl already. */
635 1.1 mrg decl = pushdecl (decl, /*hiding=*/true);
636 1.1 mrg else
637 1.1 mrg {
638 1.1 mrg /* We can't use pushdecl, as we might be in a template
639 1.1 mrg class specialization, and pushdecl will insert an
640 1.1 mrg unqualified friend decl into the template parameter
641 1.1 mrg scope, rather than the namespace containing it. */
642 1.1 mrg tree ns = decl_namespace_context (decl);
643 1.1 mrg
644 1.1 mrg push_nested_namespace (ns);
645 1.1 mrg decl = pushdecl_namespace_level (decl, /*hiding=*/true);
646 1.1 mrg pop_nested_namespace (ns);
647 1.1 mrg }
648 1.1 mrg
649 1.1 mrg if (warn)
650 1.1 mrg {
651 1.1 mrg static int explained;
652 1.1 mrg bool warned;
653 1.1 mrg
654 1.1 mrg auto_diagnostic_group d;
655 1.1 mrg warned = warning (OPT_Wnon_template_friend, "friend declaration "
656 1.1 mrg "%q#D declares a non-template function", decl);
657 1.1 mrg if (! explained && warned)
658 1.1 mrg {
659 1.1 mrg inform (input_location, "(if this is not what you intended, "
660 1.1 mrg "make sure the function template has already been "
661 1.1 mrg "declared and add %<<>%> after the function name "
662 1.1 mrg "here)");
663 1.1 mrg explained = 1;
664 1.1 mrg }
665 1.1 mrg }
666 1.1 mrg }
667 1.1 mrg
668 1.1 mrg if (decl == error_mark_node)
669 1.1 mrg return error_mark_node;
670 1.1 mrg
671 1.1 mrg add_friend (current_class_type,
672 1.1 mrg is_friend_template ? DECL_TI_TEMPLATE (decl) : decl,
673 1.1 mrg /*complain=*/true);
674 1.1 mrg }
675 1.1 mrg
676 1.1 mrg return decl;
677 1.1 mrg }
678 1.1 mrg
679 1.1 mrg #include "gt-cp-friend.h"
680