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