OSDN Git Service

* friend.c (add_friend): Deal gracefully with error_mark_node.
[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   GNU_xref_hier (type, friend_type, 0, 0, 1);
285
286   if (is_template_friend)
287     friend_type = CLASSTYPE_TI_TEMPLATE (friend_type);
288
289   classes = CLASSTYPE_FRIEND_CLASSES (type);
290   while (classes 
291          /* Stop if we find the same type on the list.  */
292          && !(TREE_CODE (TREE_VALUE (classes)) == TEMPLATE_DECL ?
293               friend_type == TREE_VALUE (classes) :
294               same_type_p (TREE_VALUE (classes), friend_type)))
295     classes = TREE_CHAIN (classes);
296   if (classes) 
297     cp_warning ("`%T' is already a friend of `%T'",
298                 TREE_VALUE (classes), type);
299   else
300     {
301       CLASSTYPE_FRIEND_CLASSES (type)
302         = tree_cons (NULL_TREE, friend_type, CLASSTYPE_FRIEND_CLASSES (type));
303       if (is_template_friend)
304         friend_type = TREE_TYPE (friend_type);
305       if (!uses_template_parms (type))
306         CLASSTYPE_BEFRIENDING_CLASSES (friend_type)
307           = tree_cons (NULL_TREE, type, 
308                        CLASSTYPE_BEFRIENDING_CLASSES (friend_type)); 
309     }
310 }
311
312 /* Main friend processor.  This is large, and for modularity purposes,
313    has been removed from grokdeclarator.  It returns `void_type_node'
314    to indicate that something happened, though a FIELD_DECL is
315    not returned.
316
317    CTYPE is the class this friend belongs to.
318
319    DECLARATOR is the name of the friend.
320
321    DECL is the FUNCTION_DECL that the friend is.
322
323    In case we are parsing a friend which is part of an inline
324    definition, we will need to store PARM_DECL chain that comes
325    with it into the DECL_ARGUMENTS slot of the FUNCTION_DECL.
326
327    FLAGS is just used for `grokclassfn'.
328
329    QUALS say what special qualifies should apply to the object
330    pointed to by `this'.  */
331
332 tree
333 do_friend (ctype, declarator, decl, parmdecls, flags, quals, funcdef_flag)
334      tree ctype, declarator, decl, parmdecls;
335      enum overload_flags flags;
336      tree quals;
337      int funcdef_flag;
338 {
339   int is_friend_template = 0;
340
341   /* Every decl that gets here is a friend of something.  */
342   DECL_FRIEND_P (decl) = 1;
343
344   if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR)
345     {
346       declarator = TREE_OPERAND (declarator, 0);
347       if (TREE_CODE (declarator) == LOOKUP_EXPR)
348         declarator = TREE_OPERAND (declarator, 0);
349       if (is_overloaded_fn (declarator))
350         declarator = DECL_NAME (get_first_fn (declarator));
351     }
352
353   if (TREE_CODE (decl) == FUNCTION_DECL)
354     is_friend_template = PROCESSING_REAL_TEMPLATE_DECL_P ();
355
356   if (ctype)
357     {
358       tree cname = TYPE_NAME (ctype);
359       if (TREE_CODE (cname) == TYPE_DECL)
360         cname = DECL_NAME (cname);
361
362       /* A method friend.  */
363       if (TREE_CODE (decl) == FUNCTION_DECL)
364         {
365           if (flags == NO_SPECIAL && ctype && declarator == cname)
366             DECL_CONSTRUCTOR_P (decl) = 1;
367
368           /* This will set up DECL_ARGUMENTS for us.  */
369           grokclassfn (ctype, decl, flags, quals);
370
371           if (is_friend_template)
372             decl = DECL_TI_TEMPLATE (push_template_decl (decl));
373           else if (template_class_depth (current_class_type))
374             decl = push_template_decl_real (decl, /*is_friend=*/1);
375
376           /* We can't do lookup in a type that involves template
377              parameters.  Instead, we rely on tsubst_friend_function
378              to check the validity of the declaration later.  */
379           if (uses_template_parms (ctype))
380             add_friend (current_class_type, decl);
381           /* A nested class may declare a member of an enclosing class
382              to be a friend, so we do lookup here even if CTYPE is in
383              the process of being defined.  */
384           else if (TYPE_SIZE (ctype) != 0 || TYPE_BEING_DEFINED (ctype))
385             {
386               decl = check_classfn (ctype, decl);
387
388               if (decl)
389                 add_friend (current_class_type, decl);
390             }
391           else
392             cp_error ("member `%D' declared as friend before type `%T' defined",
393                       decl, ctype);
394         }
395       else
396         {
397           /* Possibly a bunch of method friends.  */
398
399           /* Get the class they belong to.  */
400           tree ctype = IDENTIFIER_TYPE_VALUE (cname);
401           tree fields = lookup_fnfields (TYPE_BINFO (ctype), declarator, 0);
402
403           if (fields)
404             add_friends (current_class_type, declarator, ctype);
405           else
406             cp_error ("method `%D' is not a member of class `%T'",
407                       declarator, ctype);
408           decl = void_type_node;
409         }
410     }
411   /* A global friend.
412      @@ or possibly a friend from a base class ?!?  */
413   else if (TREE_CODE (decl) == FUNCTION_DECL)
414     {
415       /* Friends must all go through the overload machinery,
416          even though they may not technically be overloaded.
417
418          Note that because classes all wind up being top-level
419          in their scope, their friend wind up in top-level scope as well.  */
420       DECL_ARGUMENTS (decl) = parmdecls;
421       if (funcdef_flag)
422         DECL_CLASS_CONTEXT (decl) = current_class_type;
423
424       if (! DECL_USE_TEMPLATE (decl))
425         {
426           /* We can call pushdecl here, because the TREE_CHAIN of this
427              FUNCTION_DECL is not needed for other purposes.  Don't do
428              this for a template instantiation.  However, we don't
429              call pushdecl() for a friend function of a template
430              class, since in general, such a declaration depends on
431              template parameters.  Instead, we call pushdecl when the
432              class is instantiated.  */
433           if (!is_friend_template
434               && template_class_depth (current_class_type) == 0)
435             decl = pushdecl (decl);
436           else 
437             decl = push_template_decl_real (decl, /*is_friend=*/1); 
438
439           if (warn_nontemplate_friend
440               && ! funcdef_flag && ! flag_guiding_decls && ! is_friend_template
441               && current_template_parms && uses_template_parms (decl))
442             {
443               static int explained;
444               cp_warning ("friend declaration `%#D'", decl);
445               warning ("  declares a non-template function");
446               if (! explained)
447                 {
448                   warning ("  (if this is not what you intended, make sure");
449                   warning ("  the function template has already been declared,");
450                   warning ("  and add <> after the function name here)");
451                   warning ("  -Wno-non-template-friend disables this warning.");
452                   explained = 1;
453                 }
454             }
455         }
456
457       make_decl_rtl (decl, NULL_PTR, 1);
458       add_friend (current_class_type, 
459                   is_friend_template ? DECL_TI_TEMPLATE (decl) : decl);
460       DECL_FRIEND_P (decl) = 1;
461     }
462   else
463     {
464       /* @@ Should be able to ingest later definitions of this function
465          before use.  */
466       tree decl = lookup_name_nonclass (declarator);
467       if (decl == NULL_TREE)
468         {
469           cp_warning ("implicitly declaring `%T' as struct", declarator);
470           decl = xref_tag (record_type_node, declarator, 1);
471           decl = TYPE_MAIN_DECL (decl);
472         }
473
474       /* Allow abbreviated declarations of overloaded functions,
475          but not if those functions are really class names.  */
476       if (TREE_CODE (decl) == TREE_LIST && TREE_TYPE (TREE_PURPOSE (decl)))
477         {
478           cp_warning ("`friend %T' archaic, use `friend class %T' instead",
479                       declarator, declarator);
480           decl = TREE_TYPE (TREE_PURPOSE (decl));
481         }
482
483       if (TREE_CODE (decl) == TREE_LIST)
484         add_friends (current_class_type, TREE_PURPOSE (decl), NULL_TREE);
485       else
486         make_friend_class (current_class_type, TREE_TYPE (decl));
487       decl = void_type_node;
488     }
489   return decl;
490 }