OSDN Git Service

PR c++/7809
[pf3gnuchains/gcc-fork.git] / gcc / cp / friend.c
1 /* Help friends in C++.
2    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003
3    Free Software Foundation, Inc.
4
5 This file is part of GCC.
6
7 GCC is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2, or (at your option)
10 any later version.
11
12 GCC is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING.  If not, write to
19 the Free Software Foundation, 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "rtl.h"
28 #include "expr.h"
29 #include "cp-tree.h"
30 #include "flags.h"
31 #include "output.h"
32 #include "toplev.h"
33
34 /* Friend data structures are described in cp-tree.h.  */
35
36 /* Returns nonzero if SUPPLICANT is a friend of TYPE.  */
37
38 int
39 is_friend (tree type, tree supplicant)
40 {
41   int declp;
42   register tree list;
43   tree context;
44
45   if (supplicant == NULL_TREE || type == NULL_TREE)
46     return 0;
47
48   declp = DECL_P (supplicant);
49
50   if (declp)
51     /* It's a function decl.  */
52     {
53       tree list = DECL_FRIENDLIST (TYPE_MAIN_DECL (type));
54       tree name = DECL_NAME (supplicant);
55
56       for (; list ; list = TREE_CHAIN (list))
57         {
58           if (name == FRIEND_NAME (list))
59             {
60               tree friends = FRIEND_DECLS (list);
61               for (; friends ; friends = TREE_CHAIN (friends))
62                 {
63                   if (TREE_VALUE (friends) == NULL_TREE)
64                     continue;
65
66                   if (supplicant == TREE_VALUE (friends))
67                     return 1;
68
69                   /* Temporarily, we are more lenient to deal with
70                      nested friend functions, for which there can be
71                      more than one FUNCTION_DECL, despite being the
72                      same function.  When that's fixed, this bit can
73                      go.  */
74                   if (DECL_FUNCTION_MEMBER_P (supplicant)
75                       && same_type_p (TREE_TYPE (supplicant),
76                                       TREE_TYPE (TREE_VALUE (friends))))
77                     return 1;
78
79                   if (TREE_CODE (TREE_VALUE (friends)) == TEMPLATE_DECL
80                       && is_specialization_of (supplicant, 
81                                                TREE_VALUE (friends)))
82                     return 1;
83                 }
84               break;
85             }
86         }
87     }
88   else
89     /* It's a type.  */
90     {
91       /* Nested classes are implicitly friends of their enclosing types, as
92          per core issue 45 (this is a change from the standard).  */
93       for (context = supplicant;
94            context && TYPE_P (context);
95            context = TYPE_CONTEXT (context))
96         if (type == context)
97           return 1;
98       
99       list = CLASSTYPE_FRIEND_CLASSES (TREE_TYPE (TYPE_MAIN_DECL (type)));
100       for (; list ; list = TREE_CHAIN (list))
101         {
102           tree t = TREE_VALUE (list);
103
104           if (TREE_CODE (t) == TEMPLATE_DECL ? 
105               is_specialization_of (TYPE_MAIN_DECL (supplicant), t) :
106               same_type_p (supplicant, t))
107             return 1;
108         }
109     }      
110
111   if (declp && DECL_FUNCTION_MEMBER_P (supplicant))
112     context = DECL_CONTEXT (supplicant);
113   else if (! declp)
114     /* Local classes have the same access as the enclosing function.  */
115     context = decl_function_context (TYPE_MAIN_DECL (supplicant));
116   else
117     context = NULL_TREE;
118
119   /* A namespace is not friend to anybody.  */
120   if (context && TREE_CODE (context) == NAMESPACE_DECL)
121     context = NULL_TREE;
122
123   if (context)
124     return is_friend (type, context);
125
126   return 0;
127 }
128
129 /* Add a new friend to the friends of the aggregate type TYPE.
130    DECL is the FUNCTION_DECL of the friend being added.  */
131
132 void
133 add_friend (tree type, tree decl)
134 {
135   tree typedecl;
136   tree list;
137   tree name;
138
139   if (decl == error_mark_node)
140     return;
141
142   typedecl = TYPE_MAIN_DECL (type);
143   list = DECL_FRIENDLIST (typedecl);
144   name = DECL_NAME (decl);
145   type = TREE_TYPE (typedecl);
146
147   while (list)
148     {
149       if (name == FRIEND_NAME (list))
150         {
151           tree friends = FRIEND_DECLS (list);
152           for (; friends ; friends = TREE_CHAIN (friends))
153             {
154               if (decl == TREE_VALUE (friends))
155                 {
156                   warning ("`%D' is already a friend of class `%T'",
157                               decl, type);
158                   cp_warning_at ("previous friend declaration of `%D'",
159                                  TREE_VALUE (friends));
160                   return;
161                 }
162             }
163
164           maybe_add_class_template_decl_list (type, decl, /*friend_p=*/1);
165
166           TREE_VALUE (list) = tree_cons (NULL_TREE, decl,
167                                          TREE_VALUE (list));
168           return;
169         }
170       list = TREE_CHAIN (list);
171     }
172
173   if (DECL_CLASS_SCOPE_P (decl))
174     perform_or_defer_access_check (TYPE_BINFO (DECL_CONTEXT (decl)), decl);
175
176   maybe_add_class_template_decl_list (type, decl, /*friend_p=*/1);
177
178   DECL_FRIENDLIST (typedecl)
179     = tree_cons (DECL_NAME (decl), build_tree_list (NULL_TREE, decl),
180                  DECL_FRIENDLIST (typedecl));
181   if (!uses_template_parms (type))
182     DECL_BEFRIENDING_CLASSES (decl) 
183       = tree_cons (NULL_TREE, type,
184                    DECL_BEFRIENDING_CLASSES (decl));
185 }
186
187 /* Make FRIEND_TYPE a friend class to TYPE.  If FRIEND_TYPE has already
188    been defined, we make all of its member functions friends of
189    TYPE.  If not, we make it a pending friend, which can later be added
190    when its definition is seen.  If a type is defined, then its TYPE_DECL's
191    DECL_UNDEFINED_FRIENDS contains a (possibly empty) list of friend
192    classes that are not defined.  If a type has not yet been defined,
193    then the DECL_WAITING_FRIENDS contains a list of types
194    waiting to make it their friend.  Note that these two can both
195    be in use at the same time!  */
196
197 void
198 make_friend_class (tree type, tree friend_type)
199 {
200   tree classes;
201   int is_template_friend;
202
203   if (! IS_AGGR_TYPE (friend_type))
204     {
205       error ("invalid type `%T' declared `friend'", friend_type);
206       return;
207     }
208
209   if (processing_template_decl > template_class_depth (type))
210     /* If the TYPE is a template then it makes sense for it to be
211        friends with itself; this means that each instantiation is
212        friends with all other instantiations.  */
213     {
214       if (CLASS_TYPE_P (friend_type)
215           && CLASSTYPE_TEMPLATE_SPECIALIZATION (friend_type)
216           && uses_template_parms (friend_type))
217         {
218           /* [temp.friend]
219              Friend declarations shall not declare partial
220              specializations.  */
221           error ("partial specialization `%T' declared `friend'",
222                  friend_type);
223           return;
224         }
225   
226       is_template_friend = 1;
227     }
228   else if (same_type_p (type, friend_type))
229     {
230       pedwarn ("class `%T' is implicitly friends with itself",
231                   type);
232       return;
233     }
234   else
235     is_template_friend = 0;
236
237   /* [temp.friend]
238
239      A friend of a class or class template can be a function or
240      class template, a specialization of a function template or
241      class template, or an ordinary (nontemplate) function or
242      class.  */
243   if (!is_template_friend)
244     ;/* ok */
245   else if (TREE_CODE (friend_type) == TYPENAME_TYPE)
246     {
247       /* template <class T> friend typename S<T>::X; */
248       error ("typename type `%#T' declared `friend'", friend_type);
249       return;
250     }
251   else if (TREE_CODE (friend_type) == TEMPLATE_TYPE_PARM)
252     {
253       /* template <class T> friend class T; */
254       error ("template parameter type `%T' declared `friend'", friend_type);
255       return;
256     }
257   else if (!CLASSTYPE_TEMPLATE_INFO (friend_type))
258     {
259       /* template <class T> friend class A; where A is not a template */
260       error ("`%#T' is not a template", friend_type);
261       return;
262     }
263
264   if (is_template_friend)
265     friend_type = CLASSTYPE_TI_TEMPLATE (friend_type);
266
267   /* See if it is already a friend.  */
268   for (classes = CLASSTYPE_FRIEND_CLASSES (type);
269        classes;
270        classes = TREE_CHAIN (classes))
271     {
272       tree probe = TREE_VALUE (classes);
273
274       if (TREE_CODE (friend_type) == TEMPLATE_DECL)
275         {
276           if (friend_type == probe)
277             {
278               warning ("`%D' is already a friend of `%T'",
279                        probe, type);
280               break;
281             }
282         }
283       else if (TREE_CODE (probe) != TEMPLATE_DECL)
284         {
285           if (same_type_p (probe, friend_type))
286             {
287               warning ("`%T' is already a friend of `%T'",
288                        probe, type);
289               break;
290             }
291         }
292     }
293   
294   if (!classes) 
295     {
296       maybe_add_class_template_decl_list (type, friend_type, /*friend_p=*/1);
297
298       CLASSTYPE_FRIEND_CLASSES (type)
299         = tree_cons (NULL_TREE, friend_type, CLASSTYPE_FRIEND_CLASSES (type));
300       if (is_template_friend)
301         friend_type = TREE_TYPE (friend_type);
302       if (!uses_template_parms (type))
303         CLASSTYPE_BEFRIENDING_CLASSES (friend_type)
304           = tree_cons (NULL_TREE, type, 
305                        CLASSTYPE_BEFRIENDING_CLASSES (friend_type)); 
306     }
307 }
308
309 /* Main friend processor. 
310
311    CTYPE is the class this friend belongs to.
312
313    DECLARATOR is the name of the friend.
314
315    DECL is the FUNCTION_DECL that the friend is.
316
317    In case we are parsing a friend which is part of an inline
318    definition, we will need to store PARM_DECL chain that comes
319    with it into the DECL_ARGUMENTS slot of the FUNCTION_DECL.
320
321    FLAGS is just used for `grokclassfn'.
322
323    QUALS say what special qualifies should apply to the object
324    pointed to by `this'.  */
325
326 tree
327 do_friend (tree ctype, tree declarator, tree decl, tree parmdecls,
328            tree attrlist, enum overload_flags flags, tree quals,
329            int funcdef_flag)
330 {
331   int is_friend_template = 0;
332
333   /* Every decl that gets here is a friend of something.  */
334   DECL_FRIEND_P (decl) = 1;
335
336   if (TREE_CODE (declarator) == TEMPLATE_ID_EXPR)
337     {
338       declarator = TREE_OPERAND (declarator, 0);
339       if (is_overloaded_fn (declarator))
340         declarator = DECL_NAME (get_first_fn (declarator));
341     }
342
343   if (TREE_CODE (decl) != FUNCTION_DECL)
344     abort ();
345
346   is_friend_template = PROCESSING_REAL_TEMPLATE_DECL_P ();
347
348   if (ctype)
349     {
350       tree cname = TYPE_NAME (ctype);
351       if (TREE_CODE (cname) == TYPE_DECL)
352         cname = DECL_NAME (cname);
353
354       /* A method friend.  */
355       if (flags == NO_SPECIAL && ctype && declarator == cname)
356         DECL_CONSTRUCTOR_P (decl) = 1;
357
358       /* This will set up DECL_ARGUMENTS for us.  */
359       grokclassfn (ctype, decl, flags, quals);
360
361       if (is_friend_template)
362         decl = DECL_TI_TEMPLATE (push_template_decl (decl));
363       else if (DECL_TEMPLATE_INFO (decl))
364         ;
365       else if (template_class_depth (current_class_type))
366         decl = push_template_decl_real (decl, /*is_friend=*/1);
367
368       /* We can't do lookup in a type that involves template
369          parameters.  Instead, we rely on tsubst_friend_function
370          to check the validity of the declaration later.  */
371       if (processing_template_decl)
372         add_friend (current_class_type, decl);
373       /* A nested class may declare a member of an enclosing class
374          to be a friend, so we do lookup here even if CTYPE is in
375          the process of being defined.  */
376       else if (COMPLETE_TYPE_P (ctype) || TYPE_BEING_DEFINED (ctype))
377         {
378           decl = check_classfn (ctype, decl);
379
380           if (decl)
381             add_friend (current_class_type, decl);
382         }
383       else
384         error ("member `%D' declared as friend before type `%T' defined",
385                   decl, ctype);
386     }
387   /* A global friend.
388      @@ or possibly a friend from a base class ?!?  */
389   else if (TREE_CODE (decl) == FUNCTION_DECL)
390     {
391       /* Friends must all go through the overload machinery,
392          even though they may not technically be overloaded.
393
394          Note that because classes all wind up being top-level
395          in their scope, their friend wind up in top-level scope as well.  */
396       DECL_ARGUMENTS (decl) = parmdecls;
397       if (funcdef_flag)
398         SET_DECL_FRIEND_CONTEXT (decl, current_class_type);
399
400       if (! DECL_USE_TEMPLATE (decl))
401         {
402           /* We must check whether the decl refers to template
403              arguments before push_template_decl_real adds a
404              reference to the containing template class.  */
405           int warn = (warn_nontemplate_friend
406                       && ! funcdef_flag && ! is_friend_template
407                       && current_template_parms
408                       && uses_template_parms (decl));
409
410           if (is_friend_template
411               || template_class_depth (current_class_type) != 0)
412             /* We can't call pushdecl for a template class, since in
413                general, such a declaration depends on template
414                parameters.  Instead, we call pushdecl when the class
415                is instantiated.  */
416             decl = push_template_decl_real (decl, /*is_friend=*/1); 
417           else if (current_function_decl)
418             /* This must be a local class, so pushdecl will be ok, and
419                insert an unqualified friend into the local scope
420                (rather than the containing namespace scope, which the
421                next choice will do).  */
422             decl = pushdecl (decl);
423           else
424             {
425               /* We can't use pushdecl, as we might be in a template
426                  class specialization, and pushdecl will insert an
427                  unqualified friend decl into the template parameter
428                  scope, rather than the namespace containing it.  */
429               tree ns = decl_namespace_context (decl);
430               
431               push_nested_namespace (ns);
432               decl = pushdecl_namespace_level (decl);
433               pop_nested_namespace (ns);
434             }
435
436           if (warn)
437             {
438               static int explained;
439               warning ("friend declaration `%#D' declares a non-template function", decl);
440               if (! explained)
441                 {
442                   warning ("(if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning");
443                   explained = 1;
444                 }
445             }
446         }
447
448       add_friend (current_class_type, 
449                   is_friend_template ? DECL_TI_TEMPLATE (decl) : decl);
450       DECL_FRIEND_P (decl) = 1;
451     }
452
453   /* Unfortunately, we have to handle attributes here.  Normally we would
454      handle them in start_decl_1, but since this is a friend decl start_decl_1
455      never gets to see it.  */
456
457   /* Set attributes here so if duplicate decl, will have proper attributes.  */
458   cplus_decl_attributes (&decl, attrlist, 0);
459
460   return decl;
461 }