cp-tree.def (PTRMEM_CST): New tree node.
[gcc.git] / gcc / cp / friend.c
1 /* Help friends in C++.
2 Copyright (C) 1997 Free Software Foundation, Inc.
3
4 This file is part of GNU CC.
5
6 GNU CC 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 2, or (at your option)
9 any later version.
10
11 GNU CC 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.
15
16 You should have received a copy of the GNU General Public License
17 along with GNU CC; see the file COPYING. If not, write to
18 the Free Software Foundation, 59 Temple Place - Suite 330,
19 Boston, MA 02111-1307, USA. */
20
21 #include "config.h"
22 #include "system.h"
23 #include "tree.h"
24 #include "rtl.h"
25 #include "cp-tree.h"
26 #include "flags.h"
27 #include "output.h"
28 #include "toplev.h"
29
30 static void add_friend PROTO((tree, tree));
31 static void add_friends PROTO((tree, tree, tree));
32
33 /* Friend data structures are described in cp-tree.h. */
34
35 int
36 is_friend (type, supplicant)
37 tree type, supplicant;
38 {
39 int declp;
40 register tree list;
41 tree context;
42
43 if (supplicant == NULL_TREE || type == NULL_TREE)
44 return 0;
45
46 declp = (TREE_CODE_CLASS (TREE_CODE (supplicant)) == 'd');
47
48 if (declp)
49 /* It's a function decl. */
50 {
51 tree list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type));
52 tree name = DECL_NAME (supplicant);
53 tree ctype;
54
55 if (DECL_FUNCTION_MEMBER_P (supplicant))
56 ctype = DECL_CLASS_CONTEXT (supplicant);
57 else
58 ctype = NULL_TREE;
59
60 for (; list ; list = TREE_CHAIN (list))
61 {
62 if (name == TREE_PURPOSE (list))
63 {
64 tree friends = TREE_VALUE (list);
65 for (; friends ; friends = TREE_CHAIN (friends))
66 {
67 if (comptypes (ctype, TREE_PURPOSE (friends), 1))
68 return 1;
69
70 if (TREE_VALUE (friends) == NULL_TREE)
71 continue;
72
73 if (supplicant == TREE_VALUE (friends))
74 return 1;
75
76 /* With -fguiding-decls we are more lenient about
77 friendship. This is bogus in general since two
78 specializations of a template with non-type
79 template parameters may have the same type, but
80 be different.
81
82 Temporarily, we are also more lenient to deal
83 with nested friend functions, for which there can
84 be more than one FUNCTION_DECL, despite being the
85 same function. When that's fixed, the
86 FUNCTION_MEMBER_P bit can go. */
87 if ((flag_guiding_decls
88 || DECL_FUNCTION_MEMBER_P (supplicant))
89 && comptypes (TREE_TYPE (supplicant),
90 TREE_TYPE (TREE_VALUE (friends)), 1))
91 return 1;
92
93 if (TREE_CODE (TREE_VALUE (friends)) == TEMPLATE_DECL
94 && is_specialization_of (supplicant,
95 TREE_VALUE (friends)))
96 return 1;
97 }
98 break;
99 }
100 }
101 }
102 else
103 /* It's a type. */
104 {
105 if (type == supplicant)
106 return 1;
107
108 list = CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (TYPE_MAIN_DECL (type)));
109 for (; list ; list = TREE_CHAIN (list))
110 {
111 tree t = TREE_VALUE (list);
112
113 if (TREE_CODE (t) == TEMPLATE_DECL ?
114 is_specialization_of (TYPE_MAIN_DECL (supplicant), t) :
115 comptypes (supplicant, t, 1))
116 return 1;
117 }
118 }
119
120 if (declp && DECL_FUNCTION_MEMBER_P (supplicant))
121 context = DECL_CLASS_CONTEXT (supplicant);
122 else if (! declp)
123 /* Local classes have the same access as the enclosing function. */
124 context = hack_decl_function_context (TYPE_MAIN_DECL (supplicant));
125 else
126 context = NULL_TREE;
127
128 /* A namespace is not friend to anybody. */
129 if (context && TREE_CODE (context) == NAMESPACE_DECL)
130 context = NULL_TREE;
131
132 if (context)
133 return is_friend (type, context);
134
135 return 0;
136 }
137
138 /* Add a new friend to the friends of the aggregate type TYPE.
139 DECL is the FUNCTION_DECL of the friend being added. */
140
141 static void
142 add_friend (type, decl)
143 tree type, decl;
144 {
145 tree typedecl = TYPE_MAIN_DECL (type);
146 tree list = DECL_FRIENDLIST (typedecl);
147 tree name = DECL_NAME (decl);
148
149 while (list)
150 {
151 if (name == TREE_PURPOSE (list))
152 {
153 tree friends = TREE_VALUE (list);
154 for (; friends ; friends = TREE_CHAIN (friends))
155 {
156 if (decl == TREE_VALUE (friends))
157 {
158 cp_warning ("`%D' is already a friend of class `%T'",
159 decl, type);
160 cp_warning_at ("previous friend declaration of `%D'",
161 TREE_VALUE (friends));
162 return;
163 }
164 }
165 TREE_VALUE (list) = tree_cons (error_mark_node, decl,
166 TREE_VALUE (list));
167 return;
168 }
169 list = TREE_CHAIN (list);
170 }
171 DECL_FRIENDLIST (typedecl)
172 = tree_cons (DECL_NAME (decl), build_tree_list (error_mark_node, decl),
173 DECL_FRIENDLIST (typedecl));
174 if (DECL_NAME (decl) == ansi_opname[(int) MODIFY_EXPR])
175 {
176 tree parmtypes = TYPE_ARG_TYPES (TREE_TYPE (decl));
177 TYPE_HAS_ASSIGNMENT (TREE_TYPE (typedecl)) = 1;
178 if (parmtypes && TREE_CHAIN (parmtypes))
179 {
180 tree parmtype = TREE_VALUE (TREE_CHAIN (parmtypes));
181 if (TREE_CODE (parmtype) == REFERENCE_TYPE
182 && TREE_TYPE (parmtypes) == TREE_TYPE (typedecl))
183 TYPE_HAS_ASSIGN_REF (TREE_TYPE (typedecl)) = 1;
184 }
185 }
186 }
187
188 /* Declare that every member function NAME in FRIEND_TYPE
189 (which may be NULL_TREE) is a friend of type TYPE. */
190
191 static void
192 add_friends (type, name, friend_type)
193 tree type, name, friend_type;
194 {
195 tree typedecl = TYPE_MAIN_DECL (type);
196 tree list = DECL_FRIENDLIST (typedecl);
197
198 while (list)
199 {
200 if (name == TREE_PURPOSE (list))
201 {
202 tree friends = TREE_VALUE (list);
203 while (friends && TREE_PURPOSE (friends) != friend_type)
204 friends = TREE_CHAIN (friends);
205 if (friends)
206 {
207 if (friend_type)
208 warning ("method `%s::%s' is already a friend of class",
209 TYPE_NAME_STRING (friend_type),
210 IDENTIFIER_POINTER (name));
211 else
212 warning ("function `%s' is already a friend of class `%s'",
213 IDENTIFIER_POINTER (name),
214 IDENTIFIER_POINTER (DECL_NAME (typedecl)));
215 }
216 else
217 TREE_VALUE (list) = tree_cons (friend_type, NULL_TREE,
218 TREE_VALUE (list));
219 return;
220 }
221 list = TREE_CHAIN (list);
222 }
223 DECL_FRIENDLIST (typedecl)
224 = tree_cons (name,
225 build_tree_list (friend_type, NULL_TREE),
226 DECL_FRIENDLIST (typedecl));
227 if (! strncmp (IDENTIFIER_POINTER (name),
228 IDENTIFIER_POINTER (ansi_opname[(int) MODIFY_EXPR]),
229 strlen (IDENTIFIER_POINTER (ansi_opname[(int) MODIFY_EXPR]))))
230 {
231 TYPE_HAS_ASSIGNMENT (TREE_TYPE (typedecl)) = 1;
232 sorry ("declaring \"friend operator =\" will not find \"operator = (X&)\" if it exists");
233 }
234 }
235
236 /* Make FRIEND_TYPE a friend class to TYPE. If FRIEND_TYPE has already
237 been defined, we make all of its member functions friends of
238 TYPE. If not, we make it a pending friend, which can later be added
239 when its definition is seen. If a type is defined, then its TYPE_DECL's
240 DECL_UNDEFINED_FRIENDS contains a (possibly empty) list of friend
241 classes that are not defined. If a type has not yet been defined,
242 then the DECL_WAITING_FRIENDS contains a list of types
243 waiting to make it their friend. Note that these two can both
244 be in use at the same time! */
245
246 void
247 make_friend_class (type, friend_type)
248 tree type, friend_type;
249 {
250 tree classes;
251 int is_template_friend;
252
253 if (IS_SIGNATURE (type))
254 {
255 error ("`friend' declaration in signature definition");
256 return;
257 }
258 if (IS_SIGNATURE (friend_type))
259 {
260 error ("signature type `%s' declared `friend'",
261 IDENTIFIER_POINTER (TYPE_IDENTIFIER (friend_type)));
262 return;
263 }
264
265 if (CLASSTYPE_TEMPLATE_SPECIALIZATION (friend_type)
266 && uses_template_parms (friend_type))
267 {
268 /* [temp.friend]
269
270 Friend declarations shall not declare partial
271 specializations. */
272 cp_error ("partial specialization `%T' declared `friend'",
273 friend_type);
274 return;
275 }
276
277 if (processing_template_decl > template_class_depth (type))
278 /* If the TYPE is a template then it makes sense for it to be
279 friends with itself; this means that each instantiation is
280 friends with all other instantiations. */
281 is_template_friend = 1;
282 else if (comptypes (type, friend_type, 1))
283 {
284 pedwarn ("class `%s' is implicitly friends with itself",
285 TYPE_NAME_STRING (type));
286 return;
287 }
288 else
289 is_template_friend = 0;
290
291 GNU_xref_hier (type, friend_type, 0, 0, 1);
292
293 if (is_template_friend)
294 friend_type = CLASSTYPE_TI_TEMPLATE (friend_type);
295
296 classes = CLASSTYPE_FRIEND_CLASSES (type);
297 while (classes
298 /* Stop if we find the same type on the list. */
299 && !(TREE_CODE (TREE_VALUE (classes)) == TEMPLATE_DECL ?
300 friend_type == TREE_VALUE (classes) :
301 comptypes (TREE_VALUE (classes), friend_type, 1)))
302 classes = TREE_CHAIN (classes);
303 if (classes)
304 cp_warning ("`%T' is already a friend of `%T'",
305 TREE_VALUE (classes), type);
306 else
307 {
308 CLASSTYPE_FRIEND_CLASSES (type)
309 = tree_cons (NULL_TREE, friend_type, CLASSTYPE_FRIEND_CLASSES (type));
310 }
311 }
312
313 /* Main friend processor. This is large, and for modularity purposes,
314 has been removed from grokdeclarator. It returns `void_type_node'
315 to indicate that something happened, though a FIELD_DECL is
316 not returned.
317
318 CTYPE is the class this friend belongs to.
319
320 DECLARATOR is the name of the friend.
321
322 DECL is the FUNCTION_DECL that the friend is.
323
324 In case we are parsing a friend which is part of an inline
325 definition, we will need to store PARM_DECL chain that comes
326 with it into the DECL_ARGUMENTS slot of the FUNCTION_DECL.
327
328 FLAGS is just used for `grokclassfn'.
329
330 QUALS say what special qualifies should apply to the object
331 pointed to by `this'. */
332
333 tree
334 do_friend (ctype, declarator, decl, parmdecls, flags, quals, funcdef_flag)
335 tree ctype, declarator, decl, parmdecls;
336 enum overload_flags flags;
337 tree quals;
338 int funcdef_flag;
339 {
340 int is_friend_template = 0;
341
342 /* Every decl that gets here is a friend of something. */
343 DECL_FRIEND_P (decl) = 1;
344
345 if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR)
346 {
347 declarator = TREE_OPERAND (declarator, 0);
348 if (TREE_CODE (declarator) == LOOKUP_EXPR)
349 declarator = TREE_OPERAND (declarator, 0);
350 if (is_overloaded_fn (declarator))
351 declarator = DECL_NAME (get_first_fn (declarator));
352 }
353
354 if (TREE_CODE (decl) == FUNCTION_DECL)
355 is_friend_template = PROCESSING_REAL_TEMPLATE_DECL_P ();
356
357 if (ctype)
358 {
359 tree cname = TYPE_NAME (ctype);
360 if (TREE_CODE (cname) == TYPE_DECL)
361 cname = DECL_NAME (cname);
362
363 /* A method friend. */
364 if (TREE_CODE (decl) == FUNCTION_DECL)
365 {
366 if (flags == NO_SPECIAL && ctype && declarator == cname)
367 DECL_CONSTRUCTOR_P (decl) = 1;
368
369 /* This will set up DECL_ARGUMENTS for us. */
370 grokclassfn (ctype, decl, flags, quals);
371
372 if (is_friend_template)
373 decl = DECL_TI_TEMPLATE (push_template_decl (decl));
374
375 /* A nested class may declare a member of an enclosing class
376 to be a friend, so we do lookup here even if CTYPE is in
377 the process of being defined. */
378 if (TYPE_SIZE (ctype) != 0 || TYPE_BEING_DEFINED (ctype))
379 {
380 /* But, we defer looup in template specializations until
381 they are fully specialized. */
382 if (template_class_depth (ctype) == 0)
383 decl = check_classfn (ctype, decl);
384
385 if (decl)
386 add_friend (current_class_type, decl);
387 }
388 else
389 cp_error ("member `%D' declared as friend before type `%T' defined",
390 decl, ctype);
391 }
392 else
393 {
394 /* Possibly a bunch of method friends. */
395
396 /* Get the class they belong to. */
397 tree ctype = IDENTIFIER_TYPE_VALUE (cname);
398 tree fields = lookup_fnfields (TYPE_BINFO (ctype), declarator, 0);
399
400 if (fields)
401 add_friends (current_class_type, declarator, ctype);
402 else
403 cp_error ("method `%D' is not a member of class `%T'",
404 declarator, ctype);
405 decl = void_type_node;
406 }
407 }
408 else if (TREE_CODE (decl) == FUNCTION_DECL
409 && (MAIN_NAME_P (declarator)
410 || (IDENTIFIER_LENGTH (declarator) > 10
411 && IDENTIFIER_POINTER (declarator)[0] == '_'
412 && IDENTIFIER_POINTER (declarator)[1] == '_'
413 && strncmp (IDENTIFIER_POINTER (declarator)+2,
414 "builtin_", 8) == 0)))
415 {
416 /* raw "main", and builtin functions never gets overloaded,
417 but they can become friends. */
418 add_friend (current_class_type, decl);
419 DECL_FRIEND_P (decl) = 1;
420 decl = void_type_node;
421 }
422 /* A global friend.
423 @@ or possibly a friend from a base class ?!? */
424 else if (TREE_CODE (decl) == FUNCTION_DECL)
425 {
426 /* Friends must all go through the overload machinery,
427 even though they may not technically be overloaded.
428
429 Note that because classes all wind up being top-level
430 in their scope, their friend wind up in top-level scope as well. */
431 set_mangled_name_for_decl (decl);
432 DECL_ARGUMENTS (decl) = parmdecls;
433 if (funcdef_flag)
434 DECL_CLASS_CONTEXT (decl) = current_class_type;
435
436 if (! DECL_USE_TEMPLATE (decl))
437 {
438 /* We can call pushdecl here, because the TREE_CHAIN of this
439 FUNCTION_DECL is not needed for other purposes. Don't do
440 this for a template instantiation. However, we don't
441 call pushdecl() for a friend function of a template
442 class, since in general, such a declaration depends on
443 template parameters. Instead, we call pushdecl when the
444 class is instantiated. */
445 if (!is_friend_template
446 && template_class_depth (current_class_type) == 0)
447 decl = pushdecl (decl);
448 else
449 decl = push_template_decl_real (decl, /*is_friend=*/1);
450
451 if (warn_nontemplate_friend
452 && ! funcdef_flag && ! flag_guiding_decls && ! is_friend_template
453 && current_template_parms && uses_template_parms (decl))
454 {
455 static int explained;
456 cp_warning ("friend declaration `%#D'", decl);
457 warning (" declares a non-template function");
458 if (! explained)
459 {
460 warning (" (if this is not what you intended, make sure");
461 warning (" the function template has already been declared,");
462 warning (" and add <> after the function name here)");
463 warning (" -Wno-non-template-friend disables this warning.");
464 explained = 1;
465 }
466 }
467 }
468
469 make_decl_rtl (decl, NULL_PTR, 1);
470 add_friend (current_class_type,
471 is_friend_template ? DECL_TI_TEMPLATE (decl) : decl);
472 DECL_FRIEND_P (decl) = 1;
473 }
474 else
475 {
476 /* @@ Should be able to ingest later definitions of this function
477 before use. */
478 tree decl = lookup_name_nonclass (declarator);
479 if (decl == NULL_TREE)
480 {
481 cp_warning ("implicitly declaring `%T' as struct", declarator);
482 decl = xref_tag (record_type_node, declarator, 1);
483 decl = TYPE_MAIN_DECL (decl);
484 }
485
486 /* Allow abbreviated declarations of overloaded functions,
487 but not if those functions are really class names. */
488 if (TREE_CODE (decl) == TREE_LIST && TREE_TYPE (TREE_PURPOSE (decl)))
489 {
490 cp_warning ("`friend %T' archaic, use `friend class %T' instead",
491 declarator, declarator);
492 decl = TREE_TYPE (TREE_PURPOSE (decl));
493 }
494
495 if (TREE_CODE (decl) == TREE_LIST)
496 add_friends (current_class_type, TREE_PURPOSE (decl), NULL_TREE);
497 else
498 make_friend_class (current_class_type, TREE_TYPE (decl));
499 decl = void_type_node;
500 }
501 return decl;
502 }