OSDN Git Service

* decl.c (lookup_tag): Remove code no longer needed after
[pf3gnuchains/gcc-fork.git] / gcc / cp / friend.c
1 /* Help friends in C++.
2    Copyright (C) 1997, 1998, 1999 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 /* Friend data structures are described in cp-tree.h.  */
31
32 /* Returns non-zero if SUPPLICANT is a friend of TYPE.  */
33
34 int
35 is_friend (type, supplicant)
36      tree type, supplicant;
37 {
38   int declp;
39   register tree list;
40   tree context;
41
42   if (supplicant == NULL_TREE || type == NULL_TREE)
43     return 0;
44
45   declp = (TREE_CODE_CLASS (TREE_CODE (supplicant)) == 'd');
46
47   if (declp)
48     /* It's a function decl.  */
49     {
50       tree list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type));
51       tree name = DECL_NAME (supplicant);
52       tree ctype;
53
54       if (DECL_FUNCTION_MEMBER_P (supplicant))
55         ctype = DECL_CLASS_CONTEXT (supplicant);
56       else
57         ctype = NULL_TREE;
58
59       for (; list ; list = TREE_CHAIN (list))
60         {
61           if (name == FRIEND_NAME (list))
62             {
63               tree friends = FRIEND_DECLS (list);
64               for (; friends ; friends = TREE_CHAIN (friends))
65                 {
66                   if (same_type_p (ctype, TREE_PURPOSE (friends)))
67                     return 1;
68
69                   if (TREE_VALUE (friends) == NULL_TREE)
70                     continue;
71
72                   if (supplicant == TREE_VALUE (friends))
73                     return 1;
74
75                   /* With -fguiding-decls we are more lenient about
76                      friendship.  This is bogus in general since two
77                      specializations of a template with non-type
78                      template parameters may have the same type, but
79                      be different.  
80
81                      Temporarily, we are also more lenient to deal
82                      with nested friend functions, for which there can
83                      be more than one FUNCTION_DECL, despite being the
84                      same function.  When that's fixed, the
85                      FUNCTION_MEMBER_P bit can go.  */
86                   if ((flag_guiding_decls 
87                        || DECL_FUNCTION_MEMBER_P (supplicant))
88                       && same_type_p (TREE_TYPE (supplicant),
89                                       TREE_TYPE (TREE_VALUE (friends))))
90                     return 1;
91
92                   if (TREE_CODE (TREE_VALUE (friends)) == TEMPLATE_DECL
93                       && is_specialization_of (supplicant, 
94                                                TREE_VALUE (friends)))
95                     return 1;
96                 }
97               break;
98             }
99         }
100     }
101   else
102     /* It's a type.  */
103     {
104       if (type == supplicant)
105         return 1;
106       
107       list = CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (TYPE_MAIN_DECL (type)));
108       for (; list ; list = TREE_CHAIN (list))
109         {
110           tree t = TREE_VALUE (list);
111
112           if (TREE_CODE (t) == TEMPLATE_DECL ? 
113               is_specialization_of (TYPE_MAIN_DECL (supplicant), t) :
114               same_type_p (supplicant, t))
115             return 1;
116         }
117     }      
118
119   if (declp && DECL_FUNCTION_MEMBER_P (supplicant))
120     context = DECL_CLASS_CONTEXT (supplicant);
121   else if (! declp)
122     /* Local classes have the same access as the enclosing function.  */
123     context = hack_decl_function_context (TYPE_MAIN_DECL (supplicant));
124   else
125     context = NULL_TREE;
126
127   /* A namespace is not friend to anybody. */
128   if (context && TREE_CODE (context) == NAMESPACE_DECL)
129     context = NULL_TREE;
130
131   if (context)
132     return is_friend (type, context);
133
134   return 0;
135 }
136
137 /* Add a new friend to the friends of the aggregate type TYPE.
138    DECL is the FUNCTION_DECL of the friend being added.  */
139
140 void
141 add_friend (type, decl)
142      tree type, decl;
143 {
144   tree typedecl;
145   tree list;
146   tree name;
147
148   if (decl == error_mark_node)
149     return;
150
151   typedecl = TYPE_MAIN_DECL (type);
152   list = DECL_FRIENDLIST (typedecl);
153   name = DECL_NAME (decl);
154   type = TREE_TYPE (typedecl);
155
156   while (list)
157     {
158       if (name == FRIEND_NAME (list))
159         {
160           tree friends = FRIEND_DECLS (list);
161           for (; friends ; friends = TREE_CHAIN (friends))
162             {
163               if (decl == TREE_VALUE (friends))
164                 {
165                   cp_warning ("`%D' is already a friend of class `%T'",
166                               decl, type);
167                   cp_warning_at ("previous friend declaration of `%D'",
168                                  TREE_VALUE (friends));
169                   return;
170                 }
171             }
172           TREE_VALUE (list) = tree_cons (error_mark_node, decl,
173                                          TREE_VALUE (list));
174           return;
175         }
176       list = TREE_CHAIN (list);
177     }
178
179   DECL_FRIENDLIST (typedecl)
180     = tree_cons (DECL_NAME (decl), build_tree_list (error_mark_node, decl),
181                  DECL_FRIENDLIST (typedecl));
182   if (!uses_template_parms (type))
183     DECL_BEFRIENDING_CLASSES (decl) 
184       = tree_cons (NULL_TREE, type,
185                    DECL_BEFRIENDING_CLASSES (decl));
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 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 == FRIEND_NAME (list))
201         {
202           tree friends = FRIEND_DECLS (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 }
228
229 /* Make FRIEND_TYPE a friend class to TYPE.  If FRIEND_TYPE has already
230    been defined, we make all of its member functions friends of
231    TYPE.  If not, we make it a pending friend, which can later be added
232    when its definition is seen.  If a type is defined, then its TYPE_DECL's
233    DECL_UNDEFINED_FRIENDS contains a (possibly empty) list of friend
234    classes that are not defined.  If a type has not yet been defined,
235    then the DECL_WAITING_FRIENDS contains a list of types
236    waiting to make it their friend.  Note that these two can both
237    be in use at the same time!  */
238
239 void
240 make_friend_class (type, friend_type)
241      tree type, friend_type;
242 {
243   tree classes;
244   int is_template_friend;
245
246   if (IS_SIGNATURE (type))
247     {
248       error ("`friend' declaration in signature definition");
249       return;
250     }
251   if (IS_SIGNATURE (friend_type) || ! IS_AGGR_TYPE (friend_type))
252     {
253       cp_error ("invalid type `%T' declared `friend'", friend_type);
254       return;
255     }
256
257   if (CLASS_TYPE_P (friend_type)
258       && CLASSTYPE_TEMPLATE_SPECIALIZATION (friend_type)
259       && uses_template_parms (friend_type))
260     {
261       /* [temp.friend]
262          
263          Friend declarations shall not declare partial
264          specializations.  */
265       cp_error ("partial specialization `%T' declared `friend'",
266                 friend_type);
267       return;
268     }
269   
270   if (processing_template_decl > template_class_depth (type))
271     /* If the TYPE is a template then it makes sense for it to be
272        friends with itself; this means that each instantiation is
273        friends with all other instantiations.  */
274     is_template_friend = 1;
275   else if (same_type_p (type, friend_type))
276     {
277       pedwarn ("class `%s' is implicitly friends with itself",
278                TYPE_NAME_STRING (type));
279       return;
280     }
281   else
282     is_template_friend = 0;
283
284   if (is_template_friend 
285       && TREE_CODE (friend_type) == TYPENAME_TYPE)
286     {
287       /* [temp.friend]
288
289            A friend of a class or class template can be a function or
290            class template, a specialization of a function template or
291            class template, or an ordinary (nontemplate) function or
292            class. 
293            
294          But, we're looking at something like:
295
296            template <class T> friend typename S<T>::X;
297
298          which isn't any of these.  */
299       cp_error ("typename type `%T' declare `friend'",
300                 friend_type);
301       return;
302     }
303
304   GNU_xref_hier (type, friend_type, 0, 0, 1);
305
306   if (is_template_friend)
307     friend_type = CLASSTYPE_TI_TEMPLATE (friend_type);
308
309   classes = CLASSTYPE_FRIEND_CLASSES (type);
310   while (classes 
311          /* Stop if we find the same type on the list.  */
312          && !(TREE_CODE (TREE_VALUE (classes)) == TEMPLATE_DECL ?
313               friend_type == TREE_VALUE (classes) :
314               same_type_p (TREE_VALUE (classes), friend_type)))
315     classes = TREE_CHAIN (classes);
316   if (classes) 
317     cp_warning ("`%T' is already a friend of `%T'",
318                 TREE_VALUE (classes), type);
319   else
320     {
321       CLASSTYPE_FRIEND_CLASSES (type)
322         = tree_cons (NULL_TREE, friend_type, CLASSTYPE_FRIEND_CLASSES (type));
323       if (is_template_friend)
324         friend_type = TREE_TYPE (friend_type);
325       if (!uses_template_parms (type))
326         CLASSTYPE_BEFRIENDING_CLASSES (friend_type)
327           = tree_cons (NULL_TREE, type, 
328                        CLASSTYPE_BEFRIENDING_CLASSES (friend_type)); 
329     }
330 }
331
332 /* Main friend processor.  This is large, and for modularity purposes,
333    has been removed from grokdeclarator.  It returns `void_type_node'
334    to indicate that something happened, though a FIELD_DECL is
335    not returned.
336
337    CTYPE is the class this friend belongs to.
338
339    DECLARATOR is the name of the friend.
340
341    DECL is the FUNCTION_DECL that the friend is.
342
343    In case we are parsing a friend which is part of an inline
344    definition, we will need to store PARM_DECL chain that comes
345    with it into the DECL_ARGUMENTS slot of the FUNCTION_DECL.
346
347    FLAGS is just used for `grokclassfn'.
348
349    QUALS say what special qualifies should apply to the object
350    pointed to by `this'.  */
351
352 tree
353 do_friend (ctype, declarator, decl, parmdecls, attrlist,
354            flags, quals, funcdef_flag)
355      tree ctype, declarator, decl, parmdecls, attrlist;
356      enum overload_flags flags;
357      tree quals;
358      int funcdef_flag;
359 {
360   int is_friend_template = 0;
361   tree prefix_attributes, attributes;
362
363   /* Every decl that gets here is a friend of something.  */
364   DECL_FRIEND_P (decl) = 1;
365
366   if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR)
367     {
368       declarator = TREE_OPERAND (declarator, 0);
369       if (TREE_CODE (declarator) == LOOKUP_EXPR)
370         declarator = TREE_OPERAND (declarator, 0);
371       if (is_overloaded_fn (declarator))
372         declarator = DECL_NAME (get_first_fn (declarator));
373     }
374
375   if (TREE_CODE (decl) != FUNCTION_DECL)
376     my_friendly_abort (990513);
377
378   is_friend_template = PROCESSING_REAL_TEMPLATE_DECL_P ();
379
380   if (ctype)
381     {
382       tree cname = TYPE_NAME (ctype);
383       if (TREE_CODE (cname) == TYPE_DECL)
384         cname = DECL_NAME (cname);
385
386       /* A method friend.  */
387       if (flags == NO_SPECIAL && ctype && declarator == cname)
388         DECL_CONSTRUCTOR_P (decl) = 1;
389
390       /* This will set up DECL_ARGUMENTS for us.  */
391       grokclassfn (ctype, decl, flags, quals);
392
393       if (is_friend_template)
394         decl = DECL_TI_TEMPLATE (push_template_decl (decl));
395       else if (template_class_depth (current_class_type))
396         decl = push_template_decl_real (decl, /*is_friend=*/1);
397
398       /* We can't do lookup in a type that involves template
399          parameters.  Instead, we rely on tsubst_friend_function
400          to check the validity of the declaration later.  */
401       if (uses_template_parms (ctype))
402         add_friend (current_class_type, decl);
403       /* A nested class may declare a member of an enclosing class
404          to be a friend, so we do lookup here even if CTYPE is in
405          the process of being defined.  */
406       else if (TYPE_SIZE (ctype) != 0 || TYPE_BEING_DEFINED (ctype))
407         {
408           decl = check_classfn (ctype, decl);
409
410           if (decl)
411             add_friend (current_class_type, decl);
412         }
413       else
414         cp_error ("member `%D' declared as friend before type `%T' defined",
415                   decl, ctype);
416     }
417   /* A global friend.
418      @@ or possibly a friend from a base class ?!?  */
419   else if (TREE_CODE (decl) == FUNCTION_DECL)
420     {
421       /* Friends must all go through the overload machinery,
422          even though they may not technically be overloaded.
423
424          Note that because classes all wind up being top-level
425          in their scope, their friend wind up in top-level scope as well.  */
426       DECL_ARGUMENTS (decl) = parmdecls;
427       if (funcdef_flag)
428         DECL_CLASS_CONTEXT (decl) = current_class_type;
429
430       if (! DECL_USE_TEMPLATE (decl))
431         {
432           /* We can call pushdecl here, because the TREE_CHAIN of this
433              FUNCTION_DECL is not needed for other purposes.  Don't do
434              this for a template instantiation.  However, we don't
435              call pushdecl() for a friend function of a template
436              class, since in general, such a declaration depends on
437              template parameters.  Instead, we call pushdecl when the
438              class is instantiated.  */
439           if (!is_friend_template
440               && template_class_depth (current_class_type) == 0)
441             decl = pushdecl (decl);
442           else 
443             decl = push_template_decl_real (decl, /*is_friend=*/1); 
444
445           if (warn_nontemplate_friend
446               && ! funcdef_flag && ! flag_guiding_decls && ! is_friend_template
447               && current_template_parms && uses_template_parms (decl))
448             {
449               static int explained;
450               cp_warning ("friend declaration `%#D'", decl);
451               warning ("  declares a non-template function");
452               if (! explained)
453                 {
454                   warning ("  (if this is not what you intended, make sure");
455                   warning ("  the function template has already been declared,");
456                   warning ("  and add <> after the function name here)");
457                   warning ("  -Wno-non-template-friend disables this warning.");
458                   explained = 1;
459                 }
460             }
461         }
462
463       make_decl_rtl (decl, NULL_PTR, 1);
464       add_friend (current_class_type, 
465                   is_friend_template ? DECL_TI_TEMPLATE (decl) : decl);
466       DECL_FRIEND_P (decl) = 1;
467     }
468
469   /* Unfortunately, we have to handle attributes here.  Normally we would
470      handle them in start_decl_1, but since this is a friend decl start_decl_1
471      never gets to see it.  */
472
473   if (attrlist)
474     {
475       attributes = TREE_PURPOSE (attrlist);
476       prefix_attributes = TREE_VALUE (attrlist);
477     }
478   else
479     {
480       attributes = NULL_TREE;
481       prefix_attributes = NULL_TREE;
482     } 
483
484 #ifdef SET_DEFAULT_DECL_ATTRIBUTES
485   SET_DEFAULT_DECL_ATTRIBUTES (decl, attributes);
486 #endif
487   
488   /* Set attributes here so if duplicate decl, will have proper attributes.  */
489   cplus_decl_attributes (decl, attributes, prefix_attributes);
490
491   return decl;
492 }