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