OSDN Git Service

* function.c (diddle_return_value): Examine
[pf3gnuchains/gcc-fork.git] / gcc / cp / semantics.c
1 /* Perform the semantic phase of parsing, i.e., the process of
2    building tree structure, checking semantic consistency, and
3    building RTL.  These routines are used both during actual parsing
4    and during the instantiation of template functions. 
5
6    Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc.
7    Written by Mark Mitchell (mmitchell@usa.net) based on code found
8    formerly in parse.y and pt.c.  
9
10    This file is part of GNU CC.
11
12    GNU CC is free software; you can redistribute it and/or modify it
13    under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 2, or (at your option)
15    any later version.
16    
17    GNU CC is distributed in the hope that it will be useful, but
18    WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20    General Public License for more details.
21    
22    You should have received a copy of the GNU General Public License
23    along with GNU CC; see the file COPYING.  If not, write to the Free
24    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
25    02111-1307, USA.  */
26
27 #include "config.h"
28 #include "system.h"
29 #include "tree.h"
30 #include "cp-tree.h"
31 #include "except.h"
32 #include "lex.h"
33 #include "toplev.h"
34 #include "flags.h"
35 #include "ggc.h"
36 #include "rtl.h"
37 #include "output.h"
38 #include "timevar.h"
39
40 /* There routines provide a modular interface to perform many parsing
41    operations.  They may therefore be used during actual parsing, or
42    during template instantiation, which may be regarded as a
43    degenerate form of parsing.  Since the current g++ parser is
44    lacking in several respects, and will be reimplemented, we are
45    attempting to move most code that is not directly related to
46    parsing into this file; that will make implementing the new parser
47    much easier since it will be able to make use of these routines.  */
48
49 static tree maybe_convert_cond PARAMS ((tree));
50 static tree simplify_aggr_init_exprs_r PARAMS ((tree *, int *, void *));
51 static void deferred_type_access_control PARAMS ((void));
52 static void emit_associated_thunks PARAMS ((tree));
53 static void genrtl_try_block PARAMS ((tree));
54 static void genrtl_handler PARAMS ((tree));
55 static void genrtl_catch_block PARAMS ((tree));
56 static void genrtl_ctor_stmt PARAMS ((tree));
57 static void genrtl_subobject PARAMS ((tree));
58 static void genrtl_named_return_value PARAMS ((void));
59 static void cp_expand_stmt PARAMS ((tree));
60 static void genrtl_start_function PARAMS ((tree));
61 static void genrtl_finish_function PARAMS ((tree));
62
63 /* Finish processing the COND, the SUBSTMT condition for STMT.  */
64
65 #define FINISH_COND(cond, stmt, substmt)                \
66   do {                                                  \
67     if (last_tree != stmt)                              \
68       {                                                 \
69         RECHAIN_STMTS (stmt, substmt);                  \
70         if (!processing_template_decl)                  \
71           {                                             \
72             cond = build_tree_list (substmt, cond);     \
73             substmt = cond;                             \
74           }                                             \
75       }                                                 \
76     else                                                \
77       substmt = cond;                                   \
78   } while (0)
79
80 /* Returns non-zero if the current statement is a full expression,
81    i.e. temporaries created during that statement should be destroyed
82    at the end of the statement.  */
83
84 int
85 stmts_are_full_exprs_p ()
86 {
87   return current_stmt_tree ()->stmts_are_full_exprs_p;
88 }
89
90 /* Returns the stmt_tree (if any) to which statements are currently
91    being added.  If there is no active statement-tree, NULL is
92    returned.  */
93
94 stmt_tree
95 current_stmt_tree ()
96 {
97   return (cfun 
98           ? &cfun->language->x_stmt_tree 
99           : &scope_chain->x_stmt_tree);
100 }
101
102 /* Nonzero if TYPE is an anonymous union or struct type.  We have to use a
103    flag for this because "A union for which objects or pointers are
104    declared is not an anonymous union" [class.union].  */
105
106 int
107 anon_aggr_type_p (node)
108      tree node;
109 {
110   return (CLASS_TYPE_P (node) && TYPE_LANG_SPECIFIC(node)->anon_aggr);
111 }
112
113 /* Finish a scope.  */
114
115 tree
116 do_poplevel ()
117 {
118   tree block = NULL_TREE;
119
120   if (stmts_are_full_exprs_p ())
121     {
122       tree scope_stmts = NULL_TREE;
123
124       if (!processing_template_decl)
125         scope_stmts = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
126
127       block = poplevel (kept_level_p (), 1, 0);
128       if (block && !processing_template_decl)
129         {
130           SCOPE_STMT_BLOCK (TREE_PURPOSE (scope_stmts)) = block;
131           SCOPE_STMT_BLOCK (TREE_VALUE (scope_stmts)) = block;
132         }
133     }
134
135   return block;
136 }
137
138 /* Begin a new scope.  */ 
139
140 void
141 do_pushlevel ()
142 {
143   if (stmts_are_full_exprs_p ())
144     {
145       pushlevel (0);
146       if (!processing_template_decl)
147         add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
148     }
149 }
150
151 /* Finish a goto-statement.  */
152
153 void
154 finish_goto_stmt (destination)
155      tree destination;
156 {
157   if (TREE_CODE (destination) == IDENTIFIER_NODE)
158     destination = lookup_label (destination);
159
160   /* We warn about unused labels with -Wunused.  That means we have to
161      mark the used labels as used.  */
162   if (TREE_CODE (destination) == LABEL_DECL)
163     TREE_USED (destination) = 1;
164     
165   if (TREE_CODE (destination) != LABEL_DECL)
166     /* We don't inline calls to functions with computed gotos.
167        Those functions are typically up to some funny business,
168        and may be depending on the labels being at particular
169        addresses, or some such.  */
170     DECL_UNINLINABLE (current_function_decl) = 1;
171   
172   check_goto (destination);
173
174   add_stmt (build_stmt (GOTO_STMT, destination));
175 }
176
177 /* COND is the condition-expression for an if, while, etc.,
178    statement.  Convert it to a boolean value, if appropriate.  */
179
180 tree
181 maybe_convert_cond (cond)
182      tree cond;
183 {
184   /* Empty conditions remain empty.  */
185   if (!cond)
186     return NULL_TREE;
187
188   /* Wait until we instantiate templates before doing conversion.  */
189   if (processing_template_decl)
190     return cond;
191
192   /* Do the conversion.  */
193   cond = convert_from_reference (cond);
194   return condition_conversion (cond);
195 }
196
197 /* Finish an expression-statement, whose EXPRESSION is as indicated.  */
198
199 void 
200 finish_expr_stmt (expr)
201      tree expr;
202 {
203   if (expr != NULL_TREE)
204     {
205       if (!processing_template_decl
206           && !(stmts_are_full_exprs_p ())
207           && ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
208                && lvalue_p (expr))
209               || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE))
210         expr = default_conversion (expr);
211       
212       if (stmts_are_full_exprs_p ())
213         expr = convert_to_void (expr, "statement");
214       
215       if (!processing_template_decl)
216         expr = break_out_cleanups (expr);
217       
218       add_stmt (build_stmt (EXPR_STMT, expr));
219     }
220
221   finish_stmt ();
222
223   /* This was an expression-statement, so we save the type of the
224      expression.  */
225   last_expr_type = expr ? TREE_TYPE (expr) : NULL_TREE;
226 }
227
228
229 /* Begin an if-statement.  Returns a newly created IF_STMT if
230    appropriate.  */
231
232 tree
233 begin_if_stmt ()
234 {
235   tree r;
236   do_pushlevel ();
237   r = build_stmt (IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
238   add_stmt (r);
239   return r;
240 }
241
242 /* Process the COND of an if-statement, which may be given by
243    IF_STMT.  */
244
245 void 
246 finish_if_stmt_cond (cond, if_stmt)
247      tree cond;
248      tree if_stmt;
249 {
250   cond = maybe_convert_cond (cond);
251   FINISH_COND (cond, if_stmt, IF_COND (if_stmt));
252 }
253
254 /* Finish the then-clause of an if-statement, which may be given by
255    IF_STMT.  */
256
257 tree
258 finish_then_clause (if_stmt)
259      tree if_stmt;
260 {
261   RECHAIN_STMTS (if_stmt, THEN_CLAUSE (if_stmt));
262   last_tree = if_stmt;
263   return if_stmt;
264 }
265
266 /* Begin the else-clause of an if-statement.  */
267
268 void 
269 begin_else_clause ()
270 {
271 }
272
273 /* Finish the else-clause of an if-statement, which may be given by
274    IF_STMT.  */
275
276 void
277 finish_else_clause (if_stmt)
278      tree if_stmt;
279 {
280   RECHAIN_STMTS (if_stmt, ELSE_CLAUSE (if_stmt));
281 }
282
283 /* Finsh an if-statement.  */
284
285 void 
286 finish_if_stmt ()
287 {
288   do_poplevel ();
289   finish_stmt ();
290 }
291
292 void
293 clear_out_block ()
294 {
295   /* If COND wasn't a declaration, clear out the
296      block we made for it and start a new one here so the
297      optimization in expand_end_loop will work.  */
298   if (getdecls () == NULL_TREE)
299     {
300       do_poplevel ();
301       do_pushlevel ();
302     }
303 }
304
305 /* Begin a while-statement.  Returns a newly created WHILE_STMT if
306    appropriate.  */
307
308 tree
309 begin_while_stmt ()
310 {
311   tree r;
312   r = build_stmt (WHILE_STMT, NULL_TREE, NULL_TREE);
313   add_stmt (r);
314   do_pushlevel ();
315   return r;
316 }
317
318 /* Process the COND of a while-statement, which may be given by
319    WHILE_STMT.  */
320
321 void 
322 finish_while_stmt_cond (cond, while_stmt)
323      tree cond;
324      tree while_stmt;
325 {
326   cond = maybe_convert_cond (cond);
327   FINISH_COND (cond, while_stmt, WHILE_COND (while_stmt));
328   clear_out_block ();
329 }
330
331 /* Finish a while-statement, which may be given by WHILE_STMT.  */
332
333 void 
334 finish_while_stmt (while_stmt)
335      tree while_stmt;
336 {
337   do_poplevel ();
338   RECHAIN_STMTS (while_stmt, WHILE_BODY (while_stmt));
339   finish_stmt ();
340 }
341
342 /* Begin a do-statement.  Returns a newly created DO_STMT if
343    appropriate.  */
344
345 tree
346 begin_do_stmt ()
347 {
348   tree r = build_stmt (DO_STMT, NULL_TREE, NULL_TREE);
349   add_stmt (r);
350   return r;
351 }
352
353 /* Finish the body of a do-statement, which may be given by DO_STMT.  */
354
355 void
356 finish_do_body (do_stmt)
357      tree do_stmt;
358 {
359   RECHAIN_STMTS (do_stmt, DO_BODY (do_stmt));
360 }
361
362 /* Finish a do-statement, which may be given by DO_STMT, and whose
363    COND is as indicated.  */
364
365 void
366 finish_do_stmt (cond, do_stmt)
367      tree cond;
368      tree do_stmt;
369 {
370   cond = maybe_convert_cond (cond);
371   DO_COND (do_stmt) = cond;
372   finish_stmt ();
373 }
374
375 /* Finish a return-statement.  The EXPRESSION returned, if any, is as
376    indicated.  */
377
378 void
379 finish_return_stmt (expr)
380      tree expr;
381 {
382   if (!processing_template_decl)
383     expr = check_return_expr (expr);
384   if (!processing_template_decl)
385     {
386       if (DECL_CONSTRUCTOR_P (current_function_decl) && ctor_label)
387         {
388           /* Even returns without a value in a constructor must return
389              `this'.  We accomplish this by sending all returns in a
390              constructor to the CTOR_LABEL; finish_function emits code to
391              return a value there.  When we finally generate the real
392              return statement, CTOR_LABEL is no longer set, and we fall
393              through into the normal return-processing code below.  */
394           finish_goto_stmt (ctor_label);
395           return;
396         }
397       else if (DECL_DESTRUCTOR_P (current_function_decl))
398         {
399           /* Similarly, all destructors must run destructors for
400              base-classes before returning.  So, all returns in a
401              destructor get sent to the DTOR_LABEL; finsh_function emits
402              code to return a value there.  */
403           finish_goto_stmt (dtor_label);
404           return;
405         }
406     }
407   add_stmt (build_stmt (RETURN_STMT, expr));
408   finish_stmt ();
409 }
410
411 /* Begin a for-statement.  Returns a new FOR_STMT if appropriate.  */
412
413 tree
414 begin_for_stmt ()
415 {
416   tree r;
417
418   r = build_stmt (FOR_STMT, NULL_TREE, NULL_TREE, 
419                   NULL_TREE, NULL_TREE);
420   NEW_FOR_SCOPE_P (r) = flag_new_for_scope > 0;
421   add_stmt (r);
422   if (NEW_FOR_SCOPE_P (r))
423     {
424       do_pushlevel ();
425       note_level_for_for ();
426     }
427
428   return r;
429 }
430
431 /* Finish the for-init-statement of a for-statement, which may be
432    given by FOR_STMT.  */
433
434 void
435 finish_for_init_stmt (for_stmt)
436      tree for_stmt;
437 {
438   if (last_tree != for_stmt)
439     RECHAIN_STMTS (for_stmt, FOR_INIT_STMT (for_stmt));
440   do_pushlevel ();
441 }
442
443 /* Finish the COND of a for-statement, which may be given by
444    FOR_STMT.  */
445
446 void
447 finish_for_cond (cond, for_stmt)
448      tree cond;
449      tree for_stmt;
450 {
451   cond = maybe_convert_cond (cond);
452   FINISH_COND (cond, for_stmt, FOR_COND (for_stmt));
453   clear_out_block ();
454 }
455
456 /* Finish the increment-EXPRESSION in a for-statement, which may be
457    given by FOR_STMT.  */
458
459 void
460 finish_for_expr (expr, for_stmt)
461      tree expr;
462      tree for_stmt;
463 {
464   FOR_EXPR (for_stmt) = expr;
465 }
466
467 /* Finish the body of a for-statement, which may be given by
468    FOR_STMT.  The increment-EXPR for the loop must be
469    provided.  */
470
471 void
472 finish_for_stmt (for_stmt)
473      tree for_stmt;
474 {
475   /* Pop the scope for the body of the loop.  */
476   do_poplevel ();
477   RECHAIN_STMTS (for_stmt, FOR_BODY (for_stmt));
478   if (NEW_FOR_SCOPE_P (for_stmt))
479     do_poplevel ();
480   finish_stmt (); 
481 }
482
483 /* Finish a break-statement.  */
484
485 void
486 finish_break_stmt ()
487 {
488   add_stmt (build_break_stmt ());
489 }
490
491 /* Finish a continue-statement.  */
492
493 void
494 finish_continue_stmt ()
495 {
496   add_stmt (build_continue_stmt ());
497 }
498
499 /* Begin a switch-statement.  Returns a new SWITCH_STMT if
500    appropriate.  */
501
502 tree
503 begin_switch_stmt ()
504 {
505   tree r;
506   r = build_stmt (SWITCH_STMT, NULL_TREE, NULL_TREE);
507   add_stmt (r);
508   do_pushlevel ();
509   return r;
510 }
511
512 /* Finish the cond of a switch-statement.  */
513
514 void
515 finish_switch_cond (cond, switch_stmt)
516      tree cond;
517      tree switch_stmt;
518 {
519   if (!processing_template_decl)
520     {
521       tree type;
522       tree index;
523
524       /* Convert the condition to an integer or enumeration type.  */
525       cond = build_expr_type_conversion (WANT_INT | WANT_ENUM, cond, 1);
526       if (cond == NULL_TREE)
527         {
528           error ("switch quantity not an integer");
529           cond = error_mark_node;
530         }
531       if (cond != error_mark_node)
532         {
533           cond = default_conversion (cond);
534           cond = fold (build1 (CLEANUP_POINT_EXPR, TREE_TYPE (cond), cond));
535         }
536
537       type = TREE_TYPE (cond);
538       index = get_unwidened (cond, NULL_TREE);
539       /* We can't strip a conversion from a signed type to an unsigned,
540          because if we did, int_fits_type_p would do the wrong thing
541          when checking case values for being in range,
542          and it's too hard to do the right thing.  */
543       if (TREE_UNSIGNED (TREE_TYPE (cond))
544           == TREE_UNSIGNED (TREE_TYPE (index)))
545         cond = index;
546     }
547   FINISH_COND (cond, switch_stmt, SWITCH_COND (switch_stmt));
548   push_switch (switch_stmt);
549 }
550
551 /* Finish the body of a switch-statement, which may be given by
552    SWITCH_STMT.  The COND to switch on is indicated.  */
553
554 void
555 finish_switch_stmt (switch_stmt)
556      tree switch_stmt;
557 {
558   RECHAIN_STMTS (switch_stmt, SWITCH_BODY (switch_stmt));
559   pop_switch (); 
560   do_poplevel ();
561   finish_stmt ();
562 }
563
564 /* Generate the RTL for T, which is a TRY_BLOCK. */
565
566 static void 
567 genrtl_try_block (t)
568      tree t;
569 {
570   if (CLEANUP_P (t))
571     {
572       expand_eh_region_start ();
573       expand_stmt (TRY_STMTS (t));
574       expand_eh_region_end (protect_with_terminate (TRY_HANDLERS (t)));
575     }
576   else
577     {
578       if (!FN_TRY_BLOCK_P (t)) 
579         emit_line_note (input_filename, lineno);
580       expand_start_try_stmts ();
581
582       expand_stmt (TRY_STMTS (t));
583
584       if (FN_TRY_BLOCK_P (t))
585         {
586           end_protect_partials ();
587           expand_start_all_catch ();
588           in_function_try_handler = 1;
589           expand_stmt (TRY_HANDLERS (t));
590           in_function_try_handler = 0;
591           expand_end_all_catch ();
592         }
593       else 
594         {
595           expand_start_all_catch ();  
596           expand_stmt (TRY_HANDLERS (t));
597           expand_end_all_catch ();
598         }
599     }
600 }
601
602 /* Begin a try-block.  Returns a newly-created TRY_BLOCK if
603    appropriate.  */
604
605 tree
606 begin_try_block ()
607 {
608   tree r = build_stmt (TRY_BLOCK, NULL_TREE, NULL_TREE);
609   add_stmt (r);
610   return r;
611 }
612
613 /* Likewise, for a function-try-block.  */
614
615 tree
616 begin_function_try_block ()
617 {
618   tree r = build_stmt (TRY_BLOCK, NULL_TREE, NULL_TREE);
619   FN_TRY_BLOCK_P (r) = 1;
620   add_stmt (r);
621   return r;
622 }
623
624 /* Finish a try-block, which may be given by TRY_BLOCK.  */
625
626 void
627 finish_try_block (try_block)
628      tree try_block;
629 {
630   RECHAIN_STMTS (try_block, TRY_STMTS (try_block));
631 }
632
633 /* Finish the body of a cleanup try-block, which may be given by
634    TRY_BLOCK.  */
635
636 void
637 finish_cleanup_try_block (try_block)
638      tree try_block;
639 {
640   RECHAIN_STMTS (try_block, TRY_STMTS (try_block));
641 }
642
643 /* Finish an implicitly generated try-block, with a cleanup is given
644    by CLEANUP.  */
645
646 void
647 finish_cleanup (cleanup, try_block)
648      tree cleanup;
649      tree try_block;
650 {
651   TRY_HANDLERS (try_block) = cleanup;
652   CLEANUP_P (try_block) = 1;
653 }
654
655 /* Likewise, for a function-try-block.  */
656
657 void
658 finish_function_try_block (try_block)
659      tree try_block; 
660 {
661   if (TREE_CHAIN (try_block) 
662       && TREE_CODE (TREE_CHAIN (try_block)) == CTOR_INITIALIZER)
663     {
664       /* Chain the compound statement after the CTOR_INITIALIZER.  */
665       TREE_CHAIN (TREE_CHAIN (try_block)) = last_tree;
666       /* And make the CTOR_INITIALIZER the body of the try-block.  */
667       RECHAIN_STMTS (try_block, TRY_STMTS (try_block));
668     }
669   else
670     RECHAIN_STMTS (try_block, TRY_STMTS (try_block));
671   in_function_try_handler = 1;
672 }
673
674 /* Finish a handler-sequence for a try-block, which may be given by
675    TRY_BLOCK.  */
676
677 void
678 finish_handler_sequence (try_block)
679      tree try_block;
680 {
681   RECHAIN_STMTS (try_block, TRY_HANDLERS (try_block));
682   check_handlers (TRY_HANDLERS (try_block));
683 }
684
685 /* Likewise, for a function-try-block.  */
686
687 void
688 finish_function_handler_sequence (try_block)
689      tree try_block;
690 {
691   in_function_try_handler = 0;
692   RECHAIN_STMTS (try_block, TRY_HANDLERS (try_block));
693   check_handlers (TRY_HANDLERS (try_block));
694 }
695
696 /* Generate the RTL for T, which is a HANDLER. */
697
698 static void
699 genrtl_handler (t)
700      tree t;
701 {
702   genrtl_do_pushlevel ();
703   expand_stmt (HANDLER_BODY (t));
704   if (!processing_template_decl)
705     {
706       /* Fall to outside the try statement when done executing
707          handler and we fall off end of handler.  This is jump
708          Lresume in the documentation.  */
709       expand_goto (top_label_entry (&caught_return_label_stack));
710       end_catch_handler ();
711     }
712 }
713
714 /* Begin a handler.  Returns a HANDLER if appropriate.  */
715
716 tree
717 begin_handler ()
718 {
719   tree r;
720   r = build_stmt (HANDLER, NULL_TREE, NULL_TREE);
721   add_stmt (r);
722   do_pushlevel ();
723   return r;
724 }
725
726 /* Finish the handler-parameters for a handler, which may be given by
727    HANDLER.  DECL is the declaration for the catch parameter, or NULL
728    if this is a `catch (...)' clause.  */
729
730 tree
731 finish_handler_parms (decl, handler)
732      tree decl;
733      tree handler;
734 {
735   tree blocks = NULL_TREE;
736
737   if (processing_template_decl)
738     {
739       if (decl)
740         {
741           decl = pushdecl (decl);
742           decl = push_template_decl (decl);
743           add_decl_stmt (decl);
744           RECHAIN_STMTS (handler, HANDLER_PARMS (handler));
745         }
746     }
747   else
748     blocks = expand_start_catch_block (decl);
749
750   if (decl)
751     TREE_TYPE (handler) = TREE_TYPE (decl);
752
753   return blocks;
754 }
755
756 /* Generate the RTL for a CATCH_BLOCK. */
757
758 static void
759 genrtl_catch_block (type)
760      tree type;
761 {
762   start_catch_handler (type);
763 }
764
765 /* Note the beginning of a handler for TYPE.  This function is called
766    at the point to which control should be transferred when an
767    appropriately-typed exception is thrown.  */
768
769 void
770 begin_catch_block (type)
771      tree type;
772 {
773   add_stmt (build (START_CATCH_STMT, type));
774 }
775
776 /* Finish a handler, which may be given by HANDLER.  The BLOCKs are
777    the return value from the matching call to finish_handler_parms.  */
778
779 void
780 finish_handler (blocks, handler)
781      tree blocks;
782      tree handler;
783 {
784   if (!processing_template_decl)
785       expand_end_catch_block (blocks);
786   do_poplevel ();
787   RECHAIN_STMTS (handler, HANDLER_BODY (handler));
788 }
789
790 /* Generate the RTL for T, which is a CTOR_STMT. */
791
792 static void
793 genrtl_ctor_stmt (t)
794      tree t;
795 {
796   if (CTOR_BEGIN_P (t))
797     begin_protect_partials ();
798   else
799     /* After this point, any exceptions will cause the
800        destructor to be executed, so we no longer need to worry
801        about destroying the various subobjects ourselves.  */
802     end_protect_partials ();
803 }
804
805 /* Begin a compound-statement.  If HAS_NO_SCOPE is non-zero, the
806    compound-statement does not define a scope.  Returns a new
807    COMPOUND_STMT if appropriate.  */
808
809 tree
810 begin_compound_stmt (has_no_scope)
811      int has_no_scope;
812 {
813   tree r; 
814   int is_try = 0;
815
816   r = build_stmt (COMPOUND_STMT, NULL_TREE);
817
818   if (last_tree && TREE_CODE (last_tree) == TRY_BLOCK)
819     is_try = 1;
820
821   add_stmt (r);
822   if (has_no_scope)
823     COMPOUND_STMT_NO_SCOPE (r) = 1;
824
825   last_expr_type = NULL_TREE;
826
827   if (!has_no_scope)
828     {
829       do_pushlevel ();
830       if (is_try)
831         note_level_for_eh ();
832     }
833   else
834     /* Normally, we try hard to keep the BLOCK for a
835        statement-expression.  But, if it's a statement-expression with
836        a scopeless block, there's nothing to keep, and we don't want
837        to accidentally keep a block *inside* the scopeless block.  */ 
838     keep_next_level (0);
839
840   /* If this is the outermost block of the function, declare the
841      variables __FUNCTION__, __PRETTY_FUNCTION__, and so forth.  */
842   if (cfun
843       && !function_name_declared_p
844       && !has_no_scope)
845     {
846       function_name_declared_p = 1;
847       declare_function_name ();
848     }
849
850   return r;
851 }
852
853 /* Finish a compound-statement, which may be given by COMPOUND_STMT.
854    If HAS_NO_SCOPE is non-zero, the compound statement does not define
855    a scope.  */
856
857 tree
858 finish_compound_stmt (has_no_scope, compound_stmt)
859      int has_no_scope;
860      tree compound_stmt;
861 {
862   tree r;
863   tree t;
864
865   if (!has_no_scope)
866     r = do_poplevel ();
867   else
868     r = NULL_TREE;
869
870   RECHAIN_STMTS (compound_stmt, COMPOUND_BODY (compound_stmt));
871
872   /* When we call finish_stmt we will lose LAST_EXPR_TYPE.  But, since
873      the precise purpose of that variable is store the type of the
874      last expression statement within the last compound statement, we
875      preserve the value.  */
876   t = last_expr_type;
877   finish_stmt ();
878   last_expr_type = t;
879
880   return r;
881 }
882
883 /* Finish an asm-statement, whose components are a CV_QUALIFIER, a
884    STRING, some OUTPUT_OPERANDS, some INPUT_OPERANDS, and some
885    CLOBBERS.  */
886
887 void
888 finish_asm_stmt (cv_qualifier, string, output_operands,
889                  input_operands, clobbers)
890      tree cv_qualifier;
891      tree string;
892      tree output_operands;
893      tree input_operands;
894      tree clobbers;
895 {
896   tree r;
897   tree t;
898
899   if (TREE_CHAIN (string))
900     string = combine_strings (string);
901
902   if (cv_qualifier != NULL_TREE
903       && cv_qualifier != ridpointers[(int) RID_VOLATILE])
904     {
905       cp_warning ("%s qualifier ignored on asm",
906                   IDENTIFIER_POINTER (cv_qualifier));
907       cv_qualifier = NULL_TREE;
908     }
909
910   if (!processing_template_decl)
911     for (t = input_operands; t; t = TREE_CHAIN (t))
912       TREE_VALUE (t) = decay_conversion (TREE_VALUE (t));
913
914   r = build_stmt (ASM_STMT, cv_qualifier, string,
915                   output_operands, input_operands,
916                   clobbers);
917   add_stmt (r);
918 }
919
920 /* Finish a label with the indicated NAME.  */
921
922 void
923 finish_label_stmt (name)
924      tree name;
925 {
926   tree decl = define_label (input_filename, lineno, name);
927   add_stmt (build_stmt (LABEL_STMT, decl));
928 }
929
930 /* Finish a series of declarations for local labels.  G++ allows users
931    to declare "local" labels, i.e., labels with scope.  This extension
932    is useful when writing code involving statement-expressions.  */
933
934 void
935 finish_label_decl (name)
936      tree name;
937 {
938   tree decl = declare_local_label (name);
939   add_decl_stmt (decl);
940 }
941
942 /* Generate the RTL for a SUBOBJECT. */
943
944 static void 
945 genrtl_subobject (cleanup)
946      tree cleanup;
947 {
948   add_partial_entry (cleanup);
949 }
950
951 /* We're in a constructor, and have just constructed a a subobject of
952    *THIS.  CLEANUP is code to run if an exception is thrown before the
953    end of the current function is reached.   */
954
955 void 
956 finish_subobject (cleanup)
957      tree cleanup;
958 {
959   tree r = build_stmt (SUBOBJECT, cleanup);
960   add_stmt (r);
961 }
962
963 /* When DECL goes out of scope, make sure that CLEANUP is executed.  */
964
965 void 
966 finish_decl_cleanup (decl, cleanup)
967      tree decl;
968      tree cleanup;
969 {
970   add_stmt (build_stmt (CLEANUP_STMT, decl, cleanup));
971 }
972
973 /* Generate the RTL for a RETURN_INIT. */
974
975 static void
976 genrtl_named_return_value ()
977 {
978   tree decl;
979
980   decl = DECL_RESULT (current_function_decl);
981
982   emit_local_var (decl);
983
984   /* If this named return value comes in a register, put it in a
985      pseudo-register.  */
986   if (DECL_REGISTER (decl))
987     {
988       original_result_rtx = DECL_RTL (decl);
989       /* Note that the mode of the old DECL_RTL may be wider than the
990          mode of DECL_RESULT, depending on the calling conventions for
991          the processor.  For example, on the Alpha, a 32-bit integer
992          is returned in a DImode register -- the DECL_RESULT has
993          SImode but the DECL_RTL for the DECL_RESULT has DImode.  So,
994          here, we use the mode the back-end has already assigned for
995          the return value.  */
996       DECL_RTL (decl) = gen_reg_rtx (GET_MODE (original_result_rtx));
997       if (TREE_ADDRESSABLE (decl))
998         put_var_into_stack (decl);
999     }
1000 }
1001
1002 /* Bind a name and initialization to the return value of
1003    the current function.  */
1004
1005 void
1006 finish_named_return_value (return_id, init)
1007      tree return_id, init;
1008 {
1009   tree decl = DECL_RESULT (current_function_decl);
1010
1011   /* Give this error as many times as there are occurrences, so that
1012      users can use Emacs compilation buffers to find and fix all such
1013      places.  */
1014   if (pedantic)
1015     pedwarn ("ISO C++ does not permit named return values");
1016   cp_deprecated ("the named return value extension");
1017
1018   if (return_id != NULL_TREE)
1019     {
1020       if (DECL_NAME (decl) == NULL_TREE)
1021         {
1022           DECL_NAME (decl) = return_id;
1023           DECL_ASSEMBLER_NAME (decl) = return_id;
1024         }
1025       else
1026         {
1027           cp_error ("return identifier `%D' already in place", return_id);
1028           return;
1029         }
1030     }
1031
1032   /* Can't let this happen for constructors.  */
1033   if (DECL_CONSTRUCTOR_P (current_function_decl))
1034     {
1035       error ("can't redefine default return value for constructors");
1036       return;
1037     }
1038
1039   /* If we have a named return value, put that in our scope as well.  */
1040   if (DECL_NAME (decl) != NULL_TREE)
1041     {
1042       /* Let `cp_finish_decl' know that this initializer is ok.  */
1043       DECL_INITIAL (decl) = init;
1044       if (doing_semantic_analysis_p ())
1045         pushdecl (decl);
1046       if (!processing_template_decl) 
1047         {
1048           cp_finish_decl (decl, init, NULL_TREE, 0);
1049           add_stmt (build_stmt (RETURN_INIT, NULL_TREE, NULL_TREE));
1050         }
1051       else
1052         add_stmt (build_stmt (RETURN_INIT, return_id, init));
1053     }
1054
1055   /* Don't use tree-inlining for functions with named return values.
1056      That doesn't work properly because we don't do any translation of
1057      the RETURN_INITs when they are copied.  */
1058   DECL_UNINLINABLE (current_function_decl) = 1;
1059 }
1060
1061 /* The INIT_LIST is a list of mem-initializers, in the order they were
1062    written by the user.  The TREE_VALUE of each node is a list of
1063    initializers for a particular subobject.  The TREE_PURPOSE is a
1064    FIELD_DECL is the initializer is for a non-static data member, and
1065    a class type if the initializer is for a base class.  */
1066
1067 void
1068 finish_mem_initializers (init_list)
1069      tree init_list;
1070 {
1071   tree member_init_list;
1072   tree base_init_list;
1073   tree last_base_warned_about;
1074   tree next; 
1075   tree init;
1076
1077   member_init_list = NULL_TREE;
1078   base_init_list = NULL_TREE;
1079   last_base_warned_about = NULL_TREE;
1080
1081   for (init = init_list; init; init = next)
1082     {
1083       next = TREE_CHAIN (init);
1084       if (TREE_CODE (TREE_PURPOSE (init)) == FIELD_DECL)
1085         {
1086           TREE_CHAIN (init) = member_init_list;
1087           member_init_list = init;
1088
1089           /* We're running through the initializers from right to left
1090              as we process them here.  So, if we see a data member
1091              initializer after we see a base initializer, that
1092              actually means that the base initializer preceeded the
1093              data member initializer.  */
1094           if (warn_reorder && last_base_warned_about != base_init_list)
1095             {
1096               tree base;
1097
1098               for (base = base_init_list; 
1099                    base != last_base_warned_about; 
1100                    base = TREE_CHAIN (base))
1101                 {
1102                   cp_warning ("base initializer for `%T'",
1103                               TREE_PURPOSE (base));
1104                   warning ("   will be re-ordered to precede member initializations");
1105                 }
1106
1107               last_base_warned_about = base_init_list;
1108             }
1109         }
1110       else
1111         {
1112           TREE_CHAIN (init) = base_init_list;
1113           base_init_list = init;
1114         }
1115     }
1116
1117   setup_vtbl_ptr (member_init_list, base_init_list);
1118 }
1119
1120 /* Cache the value of this class's main virtual function table pointer
1121    in a register variable.  This will save one indirection if a
1122    more than one virtual function call is made this function.  */
1123
1124 void
1125 setup_vtbl_ptr (member_init_list, base_init_list)
1126      tree member_init_list;
1127      tree base_init_list;
1128 {
1129   my_friendly_assert (doing_semantic_analysis_p (), 19990919);
1130
1131   /* If we've already done this, there's no need to do it again.  */
1132   if (vtbls_set_up_p)
1133     return;
1134
1135   if (DECL_CONSTRUCTOR_P (current_function_decl))
1136     {
1137       if (processing_template_decl)
1138         add_stmt (build_min_nt
1139                   (CTOR_INITIALIZER,
1140                    member_init_list, base_init_list));
1141       else
1142         {
1143           tree ctor_stmt;
1144
1145           /* Mark the beginning of the constructor.  */
1146           ctor_stmt = build_stmt (CTOR_STMT);
1147           CTOR_BEGIN_P (ctor_stmt) = 1;
1148           add_stmt (ctor_stmt);
1149           
1150           /* And actually initialize the base-classes and members.  */
1151           emit_base_init (member_init_list, base_init_list);
1152         }
1153     }
1154   else if (DECL_DESTRUCTOR_P (current_function_decl)
1155            && !processing_template_decl)
1156     {
1157       tree if_stmt;
1158       tree compound_stmt;
1159       int saved_cfnd;
1160
1161       /* If the dtor is empty, and we know there is not any possible
1162          way we could use any vtable entries, before they are possibly
1163          set by a base class dtor, we don't have to setup the vtables,
1164          as we know that any base class dtor will set up any vtables
1165          it needs.  We avoid MI, because one base class dtor can do a
1166          virtual dispatch to an overridden function that would need to
1167          have a non-related vtable set up, we cannot avoid setting up
1168          vtables in that case.  We could change this to see if there
1169          is just one vtable.  */
1170       if_stmt = begin_if_stmt ();
1171
1172       /* If it is not safe to avoid setting up the vtables, then
1173          someone will change the condition to be boolean_true_node.  
1174          (Actually, for now, we do not have code to set the condition
1175          appropriately, so we just assume that we always need to
1176          initialize the vtables.)  */
1177       finish_if_stmt_cond (boolean_true_node, if_stmt);
1178       current_vcalls_possible_p = &IF_COND (if_stmt);
1179
1180       /* Don't declare __PRETTY_FUNCTION__ and friends here when we
1181          open the block for the if-body.  */
1182       saved_cfnd = function_name_declared_p;
1183       function_name_declared_p = 1;
1184       compound_stmt = begin_compound_stmt (/*has_no_scope=*/0);
1185       function_name_declared_p = saved_cfnd;
1186
1187       /* Make all virtual function table pointers in non-virtual base
1188          classes point to CURRENT_CLASS_TYPE's virtual function
1189          tables.  */
1190       initialize_vtbl_ptrs (current_class_ptr);
1191
1192       finish_compound_stmt (/*has_no_scope=*/0, compound_stmt);
1193       finish_then_clause (if_stmt);
1194       finish_if_stmt ();
1195     }
1196
1197   /* Always keep the BLOCK node associated with the outermost pair of
1198      curly braces of a function.  These are needed for correct
1199      operation of dwarfout.c.  */
1200   keep_next_level (1);
1201
1202   /* The virtual function tables are set up now.  */
1203   vtbls_set_up_p = 1;
1204 }
1205
1206 /* Returns the stack of SCOPE_STMTs for the current function.  */
1207
1208 tree *
1209 current_scope_stmt_stack ()
1210 {
1211   return &cfun->language->x_scope_stmt_stack;
1212 }
1213
1214 /* Finish a parenthesized expression EXPR.  */
1215
1216 tree
1217 finish_parenthesized_expr (expr)
1218      tree expr;
1219 {
1220   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (expr))))
1221     /* This inhibits warnings in truthvalue_conversion.  */
1222     C_SET_EXP_ORIGINAL_CODE (expr, ERROR_MARK); 
1223
1224   if (TREE_CODE (expr) == OFFSET_REF)
1225     /* [expr.unary.op]/3 The qualified id of a pointer-to-member must not be
1226        enclosed in parentheses.  */
1227     PTRMEM_OK_P (expr) = 0;
1228   return expr;
1229 }
1230
1231 /* Begin a statement-expression.  The value returned must be passed to
1232    finish_stmt_expr.  */
1233
1234 tree 
1235 begin_stmt_expr ()
1236 {
1237   /* If we're outside a function, we won't have a statement-tree to
1238      work with.  But, if we see a statement-expression we need to
1239      create one.  */
1240   if (! cfun && !last_tree)
1241     begin_stmt_tree (&scope_chain->x_saved_tree);
1242
1243   keep_next_level (1);
1244   /* If we're building a statement tree, then the upcoming compound
1245      statement will be chained onto the tree structure, starting at
1246      last_tree.  We return last_tree so that we can later unhook the
1247      compound statement.  */
1248   return last_tree; 
1249 }
1250
1251 /* Used when beginning a statement-expression outside function scope.
1252    For example, when handling a file-scope initializer, we use this
1253    function.  */
1254
1255 tree
1256 begin_global_stmt_expr ()
1257 {
1258   if (! cfun && !last_tree)
1259     begin_stmt_tree (&scope_chain->x_saved_tree);
1260
1261   keep_next_level (1);
1262   
1263   return (last_tree != NULL_TREE) ? last_tree : expand_start_stmt_expr(); 
1264 }
1265
1266 /* Finish the STMT_EXPR last begun with begin_global_stmt_expr.  */
1267
1268 tree 
1269 finish_global_stmt_expr (stmt_expr)
1270      tree stmt_expr;
1271 {
1272   stmt_expr = expand_end_stmt_expr (stmt_expr);
1273   
1274   if (! cfun
1275       && TREE_CHAIN (scope_chain->x_saved_tree) == NULL_TREE)
1276     finish_stmt_tree (&scope_chain->x_saved_tree);
1277
1278   return stmt_expr;
1279 }
1280
1281 /* Finish a statement-expression.  RTL_EXPR should be the value
1282    returned by the previous begin_stmt_expr; EXPR is the
1283    statement-expression.  Returns an expression representing the
1284    statement-expression.  */
1285
1286 tree 
1287 finish_stmt_expr (rtl_expr)
1288      tree rtl_expr;
1289 {
1290   tree result;
1291
1292   /* If the last thing in the statement-expression was not an
1293      expression-statement, then it has type `void'.  */
1294   if (!last_expr_type)
1295     last_expr_type = void_type_node;
1296   result = build_min (STMT_EXPR, last_expr_type, last_tree);
1297   TREE_SIDE_EFFECTS (result) = 1;
1298   
1299   /* Remove the compound statement from the tree structure; it is
1300      now saved in the STMT_EXPR.  */
1301   last_tree = rtl_expr;
1302   TREE_CHAIN (last_tree) = NULL_TREE;
1303
1304   /* If we created a statement-tree for this statement-expression,
1305      remove it now.  */ 
1306   if (! cfun
1307       && TREE_CHAIN (scope_chain->x_saved_tree) == NULL_TREE)
1308     finish_stmt_tree (&scope_chain->x_saved_tree);
1309
1310   return result;
1311 }
1312
1313 /* Finish a call to FN with ARGS.  Returns a representation of the
1314    call.  */
1315
1316 tree 
1317 finish_call_expr (fn, args, koenig)
1318      tree fn;
1319      tree args;
1320      int koenig;
1321 {
1322   tree result;
1323
1324   if (koenig)
1325     {
1326       if (TREE_CODE (fn) == BIT_NOT_EXPR)
1327         fn = build_x_unary_op (BIT_NOT_EXPR, TREE_OPERAND (fn, 0));
1328       else if (TREE_CODE (fn) != TEMPLATE_ID_EXPR)
1329         fn = do_identifier (fn, 2, args);
1330     }
1331   result = build_x_function_call (fn, args, current_class_ref);
1332
1333   if (TREE_CODE (result) == CALL_EXPR
1334       && (! TREE_TYPE (result)
1335           || TREE_CODE (TREE_TYPE (result)) != VOID_TYPE))
1336     result = require_complete_type (result);
1337
1338   return result;
1339 }
1340
1341 /* Finish a call to a postfix increment or decrement or EXPR.  (Which
1342    is indicated by CODE, which should be POSTINCREMENT_EXPR or
1343    POSTDECREMENT_EXPR.)  */
1344
1345 tree 
1346 finish_increment_expr (expr, code)
1347      tree expr;
1348      enum tree_code code;
1349 {
1350   /* If we get an OFFSET_REF, turn it into what it really means (e.g.,
1351      a COMPONENT_REF).  This way if we've got, say, a reference to a
1352      static member that's being operated on, we don't end up trying to
1353      find a member operator for the class it's in.  */
1354
1355   if (TREE_CODE (expr) == OFFSET_REF)
1356     expr = resolve_offset_ref (expr);
1357   return build_x_unary_op (code, expr);  
1358 }
1359
1360 /* Finish a use of `this'.  Returns an expression for `this'.  */
1361
1362 tree 
1363 finish_this_expr ()
1364 {
1365   tree result;
1366
1367   if (current_class_ptr)
1368     {
1369 #ifdef WARNING_ABOUT_CCD
1370       TREE_USED (current_class_ptr) = 1;
1371 #endif
1372       result = current_class_ptr;
1373     }
1374   else if (current_function_decl
1375            && DECL_STATIC_FUNCTION_P (current_function_decl))
1376     {
1377       error ("`this' is unavailable for static member functions");
1378       result = error_mark_node;
1379     }
1380   else
1381     {
1382       if (current_function_decl)
1383         error ("invalid use of `this' in non-member function");
1384       else
1385         error ("invalid use of `this' at top level");
1386       result = error_mark_node;
1387     }
1388
1389   return result;
1390 }
1391
1392 /* Finish a member function call using OBJECT and ARGS as arguments to
1393    FN.  Returns an expression for the call.  */
1394
1395 tree 
1396 finish_object_call_expr (fn, object, args)
1397      tree fn;
1398      tree object;
1399      tree args;
1400 {
1401 #if 0
1402   /* This is a future direction of this code, but because
1403      build_x_function_call cannot always undo what is done in
1404      build_component_ref entirely yet, we cannot do this.  */
1405
1406   tree real_fn = build_component_ref (object, fn, NULL_TREE, 1);
1407   return finish_call_expr (real_fn, args);
1408 #else
1409   if (DECL_DECLARES_TYPE_P (fn))
1410     {
1411       if (processing_template_decl)
1412         /* This can happen on code like:
1413
1414            class X;
1415            template <class T> void f(T t) {
1416              t.X();
1417            }  
1418
1419            We just grab the underlying IDENTIFIER.  */
1420         fn = DECL_NAME (fn);
1421       else
1422         {
1423           cp_error ("calling type `%T' like a method", fn);
1424           return error_mark_node;
1425         }
1426     }
1427
1428   return build_method_call (object, fn, args, NULL_TREE, LOOKUP_NORMAL);
1429 #endif
1430 }
1431
1432 /* Finish a qualified member function call using OBJECT and ARGS as
1433    arguments to FN.  Returns an expression for the call.  */
1434
1435 tree 
1436 finish_qualified_object_call_expr (fn, object, args)
1437      tree fn;
1438      tree object;
1439      tree args;
1440 {
1441   return build_scoped_method_call (object, TREE_OPERAND (fn, 0),
1442                                    TREE_OPERAND (fn, 1), args);
1443 }
1444
1445 /* Finish a pseudo-destructor call expression of OBJECT, with SCOPE
1446    being the scope, if any, of DESTRUCTOR.  Returns an expression for
1447    the call.  */
1448
1449 tree 
1450 finish_pseudo_destructor_call_expr (object, scope, destructor)
1451      tree object;
1452      tree scope;
1453      tree destructor;
1454 {
1455   if (processing_template_decl)
1456     return build_min_nt (PSEUDO_DTOR_EXPR, object, scope, destructor);
1457
1458   if (scope && scope != destructor)
1459     cp_error ("destructor specifier `%T::~%T()' must have matching names", 
1460               scope, destructor);
1461
1462   if ((scope == NULL_TREE || IDENTIFIER_GLOBAL_VALUE (destructor))
1463       && (TREE_CODE (TREE_TYPE (object)) !=
1464           TREE_CODE (TREE_TYPE (IDENTIFIER_GLOBAL_VALUE (destructor)))))
1465     cp_error ("`%E' is not of type `%T'", object, destructor);
1466
1467   return cp_convert (void_type_node, object);
1468 }
1469
1470 /* Finish a call to a globally qualified member function FN using
1471    ARGS.  Returns an expression for the call.  */
1472
1473 tree 
1474 finish_qualified_call_expr (fn, args)
1475      tree fn;
1476      tree args;
1477 {
1478   if (processing_template_decl)
1479     return build_min_nt (CALL_EXPR, fn, args, NULL_TREE);
1480   else
1481     return build_member_call (TREE_OPERAND (fn, 0),
1482                               TREE_OPERAND (fn, 1),
1483                               args);
1484 }
1485
1486 /* Finish an expression taking the address of LABEL.  Returns an
1487    expression for the address.  */
1488
1489 tree 
1490 finish_label_address_expr (label)
1491      tree label;
1492 {
1493   tree result;
1494
1495   label = lookup_label (label);
1496   if (label == NULL_TREE)
1497     result = null_pointer_node;
1498   else
1499     {
1500       TREE_USED (label) = 1;
1501       result = build1 (ADDR_EXPR, ptr_type_node, label);
1502       TREE_CONSTANT (result) = 1;
1503       /* This function cannot be inlined.  All jumps to the addressed
1504          label should wind up at the same point.  */
1505       DECL_UNINLINABLE (current_function_decl) = 1;
1506     }
1507
1508   return result;
1509 }
1510
1511 /* Finish an expression of the form CODE EXPR.  */
1512
1513 tree
1514 finish_unary_op_expr (code, expr)
1515      enum tree_code code;
1516      tree expr;
1517 {
1518   tree result = build_x_unary_op (code, expr);
1519   /* Inside a template, build_x_unary_op does not fold the
1520      expression. So check whether the result is folded before
1521      setting TREE_NEGATED_INT.  */
1522   if (code == NEGATE_EXPR && TREE_CODE (expr) == INTEGER_CST
1523       && TREE_CODE (result) == INTEGER_CST
1524       && !TREE_UNSIGNED (TREE_TYPE (result))
1525       && INT_CST_LT (result, integer_zero_node))
1526     TREE_NEGATED_INT (result) = 1;
1527   overflow_warning (result);
1528   return result;
1529 }
1530
1531 /* Finish an id-expression.  */
1532
1533 tree
1534 finish_id_expr (expr)
1535      tree expr;
1536 {
1537   if (TREE_CODE (expr) == IDENTIFIER_NODE)
1538     expr = do_identifier (expr, 1, NULL_TREE);
1539
1540   return expr;
1541 }
1542
1543 static tree current_type_lookups;
1544
1545 /* Perform deferred access control for types used in the type of a
1546    declaration.  */
1547
1548 static void
1549 deferred_type_access_control ()
1550 {
1551   tree lookup = type_lookups;
1552
1553   if (lookup == error_mark_node)
1554     return;
1555
1556   for (; lookup; lookup = TREE_CHAIN (lookup))
1557     enforce_access (TREE_PURPOSE (lookup), TREE_VALUE (lookup));
1558 }
1559
1560 void
1561 decl_type_access_control (decl)
1562      tree decl;
1563 {
1564   tree save_fn;
1565
1566   if (type_lookups == error_mark_node)
1567     return;
1568
1569   save_fn = current_function_decl;
1570
1571   if (decl && TREE_CODE (decl) == FUNCTION_DECL)
1572     current_function_decl = decl;
1573
1574   deferred_type_access_control ();
1575
1576   current_function_decl = save_fn;
1577   
1578   /* Now strip away the checks for the current declarator; they were
1579      added to type_lookups after typed_declspecs saved the copy that
1580      ended up in current_type_lookups.  */
1581   type_lookups = current_type_lookups;
1582 }
1583
1584 void
1585 save_type_access_control (lookups)
1586      tree lookups;
1587 {
1588   current_type_lookups = lookups;
1589 }
1590
1591 /* Begin a function definition declared with DECL_SPECS and
1592    DECLARATOR.  Returns non-zero if the function-declaration is
1593    legal.  */
1594
1595 int
1596 begin_function_definition (decl_specs, declarator)
1597      tree decl_specs;
1598      tree declarator;
1599 {
1600   tree specs;
1601   tree attrs;
1602
1603   split_specs_attrs (decl_specs, &specs, &attrs);
1604   if (!start_function (specs, declarator, attrs, SF_DEFAULT))
1605     return 0;
1606
1607   deferred_type_access_control ();
1608   type_lookups = error_mark_node;
1609
1610   /* The things we're about to see are not directly qualified by any
1611      template headers we've seen thus far.  */
1612   reset_specialization ();
1613
1614   return 1;
1615 }
1616
1617 /* Begin a constructor declarator of the form `SCOPE::NAME'.  Returns
1618    a SCOPE_REF.  */
1619
1620 tree 
1621 begin_constructor_declarator (scope, name)
1622      tree scope;
1623      tree name;
1624 {
1625   tree result = build_parse_node (SCOPE_REF, scope, name);
1626   enter_scope_of (result);
1627   return result;
1628 }
1629
1630 /* Finish an init-declarator.  Returns a DECL.  */
1631
1632 tree
1633 finish_declarator (declarator, declspecs, attributes,
1634                    prefix_attributes, initialized)
1635      tree declarator;
1636      tree declspecs;
1637      tree attributes;
1638      tree prefix_attributes;
1639      int initialized;
1640 {
1641   return start_decl (declarator, declspecs, initialized, attributes,
1642                      prefix_attributes); 
1643 }
1644
1645 /* Finish a translation unit.  */
1646
1647 void 
1648 finish_translation_unit ()
1649 {
1650   /* In case there were missing closebraces,
1651      get us back to the global binding level.  */
1652   pop_everything ();
1653   while (current_namespace != global_namespace)
1654     pop_namespace ();
1655   finish_file ();
1656 }
1657
1658 /* Finish a template type parameter, specified as AGGR IDENTIFIER.
1659    Returns the parameter.  */
1660
1661 tree 
1662 finish_template_type_parm (aggr, identifier)
1663      tree aggr;
1664      tree identifier;
1665 {
1666   if (aggr != class_type_node)
1667     {
1668       pedwarn ("template type parameters must use the keyword `class' or `typename'");
1669       aggr = class_type_node;
1670     }
1671
1672   return build_tree_list (aggr, identifier);
1673 }
1674
1675 /* Finish a template template parameter, specified as AGGR IDENTIFIER.
1676    Returns the parameter.  */
1677
1678 tree 
1679 finish_template_template_parm (aggr, identifier)
1680      tree aggr;
1681      tree identifier;
1682 {
1683   tree decl = build_decl (TYPE_DECL, identifier, NULL_TREE);
1684   tree tmpl = build_lang_decl (TEMPLATE_DECL, identifier, NULL_TREE);
1685   DECL_TEMPLATE_PARMS (tmpl) = current_template_parms;
1686   DECL_TEMPLATE_RESULT (tmpl) = decl;
1687   DECL_ARTIFICIAL (decl) = 1;
1688   end_template_decl ();
1689
1690   return finish_template_type_parm (aggr, tmpl);
1691 }
1692
1693 /* Finish a parameter list, indicated by PARMS.  If ELLIPSIS is
1694    non-zero, the parameter list was terminated by a `...'.  */
1695
1696 tree
1697 finish_parmlist (parms, ellipsis)
1698      tree parms;
1699      int ellipsis;
1700 {
1701   if (!ellipsis)
1702     chainon (parms, void_list_node);
1703   /* We mark the PARMS as a parmlist so that declarator processing can
1704      disambiguate certain constructs.  */
1705   if (parms != NULL_TREE)
1706     TREE_PARMLIST (parms) = 1;
1707
1708   return parms;
1709 }
1710
1711 /* Begin a class definition, as indicated by T.  */
1712
1713 tree
1714 begin_class_definition (t)
1715      tree t;
1716 {
1717   if (t == error_mark_node
1718       || ! IS_AGGR_TYPE (t))
1719     {
1720       t = make_aggr_type (RECORD_TYPE);
1721       pushtag (make_anon_name (), t, 0);
1722     }
1723
1724   /* In a definition of a member class template, we will get here with an
1725      implicit typename, a TYPENAME_TYPE with a type.  */
1726   if (TREE_CODE (t) == TYPENAME_TYPE)
1727     t = TREE_TYPE (t);
1728   
1729   /* If we generated a partial instantiation of this type, but now
1730      we're seeing a real definition, we're actually looking at a
1731      partial specialization.  Consider:
1732
1733        template <class T, class U>
1734        struct Y {};
1735
1736        template <class T>
1737        struct X {};
1738
1739        template <class T, class U>
1740        void f()
1741        {
1742          typename X<Y<T, U> >::A a;
1743        }
1744
1745        template <class T, class U>
1746        struct X<Y<T, U> >
1747        {
1748        };
1749
1750      We have to undo the effects of the previous partial
1751      instantiation.  */
1752   if (PARTIAL_INSTANTIATION_P (t))
1753     {
1754       if (!pedantic) 
1755         {
1756           /* Unfortunately, when we're not in pedantic mode, we
1757              attempt to actually fill in some of the fields of the
1758              partial instantiation, in order to support the implicit
1759              typename extension.  Clear those fields now, in
1760              preparation for the definition here.  The fields cleared
1761              here must match those set in instantiate_class_template.
1762              Look for a comment mentioning begin_class_definition
1763              there.  */
1764           TYPE_BINFO_BASETYPES (t) = NULL_TREE;
1765           TYPE_FIELDS (t) = NULL_TREE;
1766           TYPE_METHODS (t) = NULL_TREE;
1767           CLASSTYPE_TAGS (t) = NULL_TREE;
1768           CLASSTYPE_VBASECLASSES (t) = NULL_TREE;
1769           TYPE_SIZE (t) = NULL_TREE;
1770         }
1771
1772       /* This isn't a partial instantiation any more.  */
1773       PARTIAL_INSTANTIATION_P (t) = 0;
1774     }
1775   /* If this type was already complete, and we see another definition,
1776      that's an error.  */
1777   else if (COMPLETE_TYPE_P (t))
1778     duplicate_tag_error (t);
1779
1780   /* Update the location of the decl.  */
1781   DECL_SOURCE_FILE (TYPE_NAME (t)) = input_filename;
1782   DECL_SOURCE_LINE (TYPE_NAME (t)) = lineno;
1783   
1784   if (TYPE_BEING_DEFINED (t))
1785     {
1786       t = make_aggr_type (TREE_CODE (t));
1787       pushtag (TYPE_IDENTIFIER (t), t, 0);
1788     }
1789   maybe_process_partial_specialization (t);
1790   pushclass (t, 1);
1791   TYPE_BEING_DEFINED (t) = 1;
1792   TYPE_PACKED (t) = flag_pack_struct;
1793   /* Reset the interface data, at the earliest possible
1794      moment, as it might have been set via a class foo;
1795      before.  */
1796   {
1797     tree name = TYPE_IDENTIFIER (t);
1798     
1799     if (! ANON_AGGRNAME_P (name))
1800       {
1801         CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
1802         SET_CLASSTYPE_INTERFACE_UNKNOWN_X
1803           (t, interface_unknown);
1804       }
1805     
1806     /* Only leave this bit clear if we know this
1807        class is part of an interface-only specification.  */
1808     if (! CLASSTYPE_INTERFACE_KNOWN (t)
1809         || ! CLASSTYPE_INTERFACE_ONLY (t))
1810       CLASSTYPE_VTABLE_NEEDS_WRITING (t) = 1;
1811   }
1812   reset_specialization();
1813   
1814   /* Make a declaration for this class in its own scope.  */
1815   build_self_reference ();
1816
1817   return t;
1818 }
1819
1820 /* Finish the member declaration given by DECL.  */
1821
1822 void
1823 finish_member_declaration (decl)
1824      tree decl;
1825 {
1826   if (decl == error_mark_node || decl == NULL_TREE)
1827     return;
1828
1829   if (decl == void_type_node)
1830     /* The COMPONENT was a friend, not a member, and so there's
1831        nothing for us to do.  */
1832     return;
1833
1834   /* We should see only one DECL at a time.  */
1835   my_friendly_assert (TREE_CHAIN (decl) == NULL_TREE, 0);
1836
1837   /* Set up access control for DECL.  */
1838   TREE_PRIVATE (decl) 
1839     = (current_access_specifier == access_private_node);
1840   TREE_PROTECTED (decl) 
1841     = (current_access_specifier == access_protected_node);
1842   if (TREE_CODE (decl) == TEMPLATE_DECL)
1843     {
1844       TREE_PRIVATE (DECL_TEMPLATE_RESULT (decl)) = TREE_PRIVATE (decl);
1845       TREE_PROTECTED (DECL_TEMPLATE_RESULT (decl)) = TREE_PROTECTED (decl);
1846     }
1847
1848   /* Mark the DECL as a member of the current class.  */
1849   DECL_CONTEXT (decl) = current_class_type;
1850
1851   /* [dcl.link]
1852
1853      A C language linkage is ignored for the names of class members
1854      and the member function type of class member functions.  */
1855   if (DECL_LANG_SPECIFIC (decl) && DECL_LANGUAGE (decl) == lang_c)
1856     DECL_LANGUAGE (decl) = lang_cplusplus;
1857
1858   /* Put functions on the TYPE_METHODS list and everything else on the
1859      TYPE_FIELDS list.  Note that these are built up in reverse order.
1860      We reverse them (to obtain declaration order) in finish_struct.  */
1861   if (TREE_CODE (decl) == FUNCTION_DECL 
1862       || DECL_FUNCTION_TEMPLATE_P (decl))
1863     {
1864       /* We also need to add this function to the
1865          CLASSTYPE_METHOD_VEC.  */
1866       add_method (current_class_type, decl, /*error_p=*/0);
1867
1868       TREE_CHAIN (decl) = TYPE_METHODS (current_class_type);
1869       TYPE_METHODS (current_class_type) = decl;
1870     }
1871   else
1872     {
1873       /* All TYPE_DECLs go at the end of TYPE_FIELDS.  Ordinary fields
1874          go at the beginning.  The reason is that lookup_field_1
1875          searches the list in order, and we want a field name to
1876          override a type name so that the "struct stat hack" will
1877          work.  In particular:
1878
1879            struct S { enum E { }; int E } s;
1880            s.E = 3;
1881
1882          is legal.  In addition, the FIELD_DECLs must be maintained in
1883          declaration order so that class layout works as expected.
1884          However, we don't need that order until class layout, so we
1885          save a little time by putting FIELD_DECLs on in reverse order
1886          here, and then reversing them in finish_struct_1.  (We could
1887          also keep a pointer to the correct insertion points in the
1888          list.)  */
1889
1890       if (TREE_CODE (decl) == TYPE_DECL)
1891         TYPE_FIELDS (current_class_type) 
1892           = chainon (TYPE_FIELDS (current_class_type), decl);
1893       else
1894         {
1895           TREE_CHAIN (decl) = TYPE_FIELDS (current_class_type);
1896           TYPE_FIELDS (current_class_type) = decl;
1897         }
1898
1899       /* Enter the DECL into the scope of the class.  */
1900       if (TREE_CODE (decl) != USING_DECL)
1901         pushdecl_class_level (decl);
1902     }
1903 }
1904
1905 /* Finish a class definition T with the indicate ATTRIBUTES.  If SEMI,
1906    the definition is immediately followed by a semicolon.  Returns the
1907    type.  */
1908
1909 tree
1910 finish_class_definition (t, attributes, semi, pop_scope_p)
1911      tree t;
1912      tree attributes;
1913      int semi;
1914      int pop_scope_p;
1915 {
1916   /* finish_struct nukes this anyway; if finish_exception does too,
1917      then it can go.  */
1918   if (semi)
1919     note_got_semicolon (t);
1920
1921   /* If we got any attributes in class_head, xref_tag will stick them in
1922      TREE_TYPE of the type.  Grab them now.  */
1923   attributes = chainon (TREE_TYPE (t), attributes);
1924   TREE_TYPE (t) = NULL_TREE;
1925
1926   if (TREE_CODE (t) == ENUMERAL_TYPE)
1927     ;
1928   else
1929     {
1930       t = finish_struct (t, attributes);
1931       if (semi) 
1932         note_got_semicolon (t);
1933     }
1934
1935   if (! semi)
1936     check_for_missing_semicolon (t); 
1937   if (pop_scope_p)
1938     pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (t)));
1939   if (current_scope () == current_function_decl)
1940     do_pending_defargs ();
1941
1942   return t;
1943 }
1944
1945 /* Finish processing the default argument expressions cached during
1946    the processing of a class definition.  */
1947
1948 void
1949 begin_inline_definitions ()
1950 {
1951   if (current_scope () == current_function_decl)
1952     do_pending_inlines ();
1953 }
1954
1955 /* Finish processing the inline function definitions cached during the
1956    processing of a class definition.  */
1957
1958 void
1959 finish_inline_definitions ()
1960 {
1961   if (current_class_type == NULL_TREE)
1962     clear_inline_text_obstack (); 
1963 }
1964
1965 /* Finish processing the declaration of a member class template
1966    TYPES whose template parameters are given by PARMS.  */
1967
1968 tree
1969 finish_member_class_template (types)
1970      tree types;
1971 {
1972   tree t;
1973
1974   /* If there are declared, but undefined, partial specializations
1975      mixed in with the typespecs they will not yet have passed through
1976      maybe_process_partial_specialization, so we do that here.  */
1977   for (t = types; t != NULL_TREE; t = TREE_CHAIN (t))
1978     if (IS_AGGR_TYPE_CODE (TREE_CODE (TREE_VALUE (t))))
1979       maybe_process_partial_specialization (TREE_VALUE (t));
1980
1981   note_list_got_semicolon (types);
1982   grok_x_components (types);
1983   if (TYPE_CONTEXT (TREE_VALUE (types)) != current_class_type)
1984     /* The component was in fact a friend declaration.  We avoid
1985        finish_member_template_decl performing certain checks by
1986        unsetting TYPES.  */
1987     types = NULL_TREE;
1988   
1989   finish_member_template_decl (types);
1990
1991   /* As with other component type declarations, we do
1992      not store the new DECL on the list of
1993      component_decls.  */
1994   return NULL_TREE;
1995 }
1996
1997 /* Finish processsing a complete template declaration.  The PARMS are
1998    the template parameters.  */
1999
2000 void
2001 finish_template_decl (parms)
2002      tree parms;
2003 {
2004   if (parms)
2005     end_template_decl ();
2006   else
2007     end_specialization ();
2008 }
2009
2010 /* Finish processing a template-id (which names a type) of the form
2011    NAME < ARGS >.  Return the TYPE_DECL for the type named by the
2012    template-id.  If ENTERING_SCOPE is non-zero we are about to enter
2013    the scope of template-id indicated.  */
2014
2015 tree
2016 finish_template_type (name, args, entering_scope)
2017      tree name;
2018      tree args;
2019      int entering_scope;
2020 {
2021   tree decl;
2022
2023   decl = lookup_template_class (name, args,
2024                                 NULL_TREE, NULL_TREE, entering_scope);
2025   if (decl != error_mark_node)
2026     decl = TYPE_STUB_DECL (decl);
2027
2028   return decl;
2029 }
2030
2031 /* SR is a SCOPE_REF node.  Enter the scope of SR, whether it is a
2032    namespace scope or a class scope.  */
2033
2034 void
2035 enter_scope_of (sr)
2036      tree sr;
2037 {
2038   tree scope = TREE_OPERAND (sr, 0);
2039
2040   if (TREE_CODE (scope) == NAMESPACE_DECL)
2041     {
2042       push_decl_namespace (scope);
2043       TREE_COMPLEXITY (sr) = -1;
2044     }
2045   else if (scope != current_class_type)
2046     {
2047       if (TREE_CODE (scope) == TYPENAME_TYPE)
2048         {
2049           /* In a declarator for a template class member, the scope will
2050              get here as an implicit typename, a TYPENAME_TYPE with a type.  */
2051           scope = TREE_TYPE (scope);
2052           TREE_OPERAND (sr, 0) = scope;
2053         }
2054       push_nested_class (scope, 3);
2055       TREE_COMPLEXITY (sr) = current_class_depth;
2056     }
2057 }
2058
2059 /* Finish processing a BASE_CLASS with the indicated ACCESS_SPECIFIER.
2060    Return a TREE_LIST containing the ACCESS_SPECIFIER and the
2061    BASE_CLASS, or NULL_TREE if an error occurred.  The
2062    ACCESSS_SPECIFIER is one of
2063    access_{default,public,protected_private}[_virtual]_node.*/
2064
2065 tree 
2066 finish_base_specifier (access_specifier, base_class)
2067      tree access_specifier;
2068      tree base_class;
2069 {
2070   tree type;
2071   tree result;
2072
2073   if (base_class == NULL_TREE)
2074     {
2075       error ("invalid base class");
2076       type = error_mark_node;
2077     }
2078   else
2079     type = TREE_TYPE (base_class);
2080
2081   if (! is_aggr_type (type, 1))
2082     result = NULL_TREE;
2083   else
2084     result = build_tree_list (access_specifier, type);
2085
2086   return result;
2087 }
2088
2089 /* Called when multiple declarators are processed.  If that is not
2090    premitted in this context, an error is issued.  */
2091
2092 void
2093 check_multiple_declarators ()
2094 {
2095   /* [temp]
2096      
2097      In a template-declaration, explicit specialization, or explicit
2098      instantiation the init-declarator-list in the declaration shall
2099      contain at most one declarator.  
2100
2101      We don't just use PROCESSING_TEMPLATE_DECL for the first
2102      condition since that would disallow the perfectly legal code, 
2103      like `template <class T> struct S { int i, j; };'.  */
2104   tree scope = current_scope ();
2105
2106   if (scope && TREE_CODE (scope) == FUNCTION_DECL)
2107     /* It's OK to write `template <class T> void f() { int i, j;}'.  */
2108     return;
2109      
2110   if (PROCESSING_REAL_TEMPLATE_DECL_P () 
2111       || processing_explicit_instantiation
2112       || processing_specialization)
2113     cp_error ("multiple declarators in template declaration");
2114 }
2115
2116 tree
2117 finish_typeof (expr)
2118      tree expr;
2119 {
2120   if (processing_template_decl)
2121     {
2122       tree t;
2123
2124       t = make_aggr_type (TYPEOF_TYPE);
2125       TYPE_FIELDS (t) = expr;
2126
2127       return t;
2128     }
2129
2130   return TREE_TYPE (expr);
2131 }
2132
2133 /* Generate RTL for the statement T, and its substatements, and any
2134    other statements at its nesting level.  */
2135
2136 static void
2137 cp_expand_stmt (t)
2138      tree t;
2139 {
2140   switch (TREE_CODE (t))
2141     {
2142     case CLEANUP_STMT:
2143       genrtl_decl_cleanup (CLEANUP_DECL (t), CLEANUP_EXPR (t));
2144       break;
2145
2146     case START_CATCH_STMT:
2147       genrtl_catch_block (TREE_TYPE (t));
2148       break;
2149
2150     case CTOR_STMT:
2151       genrtl_ctor_stmt (t);
2152       break;
2153
2154     case TRY_BLOCK:
2155       genrtl_try_block (t);
2156       break;
2157
2158     case HANDLER:
2159       genrtl_handler (t);
2160       break;
2161
2162     case SUBOBJECT:
2163       genrtl_subobject (SUBOBJECT_CLEANUP (t));
2164       break;
2165
2166     case RETURN_INIT:
2167       genrtl_named_return_value ();
2168       break;
2169
2170     default:
2171       my_friendly_abort (19990810);
2172       break;
2173     }
2174 }
2175
2176 /* Called from expand_body via walk_tree.  Replace all AGGR_INIT_EXPRs
2177    will equivalent CALL_EXPRs.  */
2178
2179 static tree
2180 simplify_aggr_init_exprs_r (tp, walk_subtrees, data)
2181      tree *tp;
2182      int *walk_subtrees ATTRIBUTE_UNUSED;
2183      void *data ATTRIBUTE_UNUSED;
2184 {
2185   tree aggr_init_expr;
2186   tree call_expr;
2187   tree fn;
2188   tree args;
2189   tree slot;
2190   tree type;
2191   tree call_type;
2192   int copy_from_buffer_p;
2193
2194   aggr_init_expr = *tp;
2195   /* We don't need to walk into types; there's nothing in a type that
2196      needs simplification.  (And, furthermore, there are places we
2197      actively don't want to go.  For example, we don't want to wander
2198      into the default arguments for a FUNCTION_DECL that appears in a
2199      CALL_EXPR.)  */
2200   if (TYPE_P (aggr_init_expr))
2201     {
2202       *walk_subtrees = 0;
2203       return NULL_TREE;
2204     }
2205   /* Only AGGR_INIT_EXPRs are interesting.  */
2206   else if (TREE_CODE (aggr_init_expr) != AGGR_INIT_EXPR)
2207     return NULL_TREE;
2208
2209   /* Form an appropriate CALL_EXPR.  */
2210   fn = TREE_OPERAND (aggr_init_expr, 0);
2211   args = TREE_OPERAND (aggr_init_expr, 1);
2212   slot = TREE_OPERAND (aggr_init_expr, 2);
2213   type = TREE_TYPE (aggr_init_expr);
2214   call_type = type;
2215   if (AGGR_INIT_VIA_CTOR_P (aggr_init_expr))
2216     {
2217       /* Replace the first argument with the address of the third
2218          argument to the AGGR_INIT_EXPR.  */
2219       call_type = build_pointer_type (type);
2220       mark_addressable (slot);
2221       args = tree_cons (NULL_TREE, build1 (ADDR_EXPR, call_type, slot),
2222                         TREE_CHAIN (args));
2223     }
2224   call_expr = build (CALL_EXPR, call_type, fn, args, NULL_TREE);
2225   TREE_SIDE_EFFECTS (call_expr) = 1;
2226
2227   /* If we're using the non-reentrant PCC calling convention, then we
2228      need to copy the returned value out of the static buffer into the
2229      SLOT.  */
2230   copy_from_buffer_p = 0;
2231 #ifdef PCC_STATIC_STRUCT_RETURN  
2232   if (!AGGR_INIT_VIA_CTOR_P (aggr_init_expr) && aggregate_value_p (type))
2233     {
2234       int old_ac;
2235
2236       flag_access_control = 0;
2237       call_expr = build_aggr_init (slot, call_expr, LOOKUP_ONLYCONVERTING);
2238       flag_access_control = old_ac;
2239       copy_from_buffer_p = 1;
2240     }
2241 #endif
2242
2243   /* If this AGGR_INIT_EXPR indicates the value returned by a
2244      function, then we want to use the value of the initialized
2245      location as the result.  */
2246   if (AGGR_INIT_VIA_CTOR_P (aggr_init_expr) || copy_from_buffer_p)
2247     {
2248       call_expr = build (COMPOUND_EXPR, type,
2249                          call_expr, slot);
2250       TREE_SIDE_EFFECTS (call_expr) = 1;
2251     }
2252
2253   /* Replace the AGGR_INIT_EXPR with the CALL_EXPR.  */
2254   TREE_CHAIN (call_expr) = TREE_CHAIN (aggr_init_expr);
2255   *tp = call_expr;
2256
2257   /* Keep iterating.  */
2258   return NULL_TREE;
2259 }
2260
2261 /* Emit all thunks to FN that should be emitted when FN is emitted.  */
2262
2263 static void
2264 emit_associated_thunks (fn)
2265      tree fn;
2266 {
2267   /* When we use vcall offsets, we emit thunks with the virtual
2268      functions to which they thunk. The whole point of vcall offsets
2269      is so that you can know statically the entire set of thunks that
2270      will ever be needed for a given virtual function, thereby
2271      enabling you to output all the thunks with the function itself.  */
2272   if (vcall_offsets_in_vtable_p () && DECL_VIRTUAL_P (fn))
2273     {
2274       tree binfo;
2275       tree v;
2276
2277       for (binfo = TYPE_BINFO (DECL_CONTEXT (fn));
2278            binfo;
2279            binfo = TREE_CHAIN (binfo))
2280         for (v = BINFO_VIRTUALS (binfo); v; v = TREE_CHAIN (v))
2281           if (BV_FN (v) == fn
2282               && (!integer_zerop (BV_DELTA (v))
2283                   || BV_VCALL_INDEX (v)))
2284             {
2285               tree thunk;
2286               tree vcall_index;
2287
2288               if (BV_USE_VCALL_INDEX_P (v))
2289                 {
2290                   vcall_index = BV_VCALL_INDEX (v);
2291                   my_friendly_assert (vcall_index != NULL_TREE, 20000621);
2292                 }
2293               else
2294                 vcall_index = NULL_TREE;
2295
2296               thunk = make_thunk (build1 (ADDR_EXPR,
2297                                           vfunc_ptr_type_node,
2298                                           fn),
2299                                   BV_DELTA (v),
2300                                   vcall_index,
2301                                   /*generate_with_vtable_p=*/0);
2302               use_thunk (thunk, /*emit_p=*/1);
2303             }
2304     }
2305 }
2306
2307 /* Generate RTL for FN.  */
2308
2309 void
2310 expand_body (fn)
2311      tree fn;
2312 {
2313   int saved_lineno;
2314   const char *saved_input_filename;
2315
2316   /* When the parser calls us after finishing the body of a template
2317      function, we don't really want to expand the body.  When we're
2318      processing an in-class definition of an inline function,
2319      PROCESSING_TEMPLATE_DECL will no longer be set here, so we have
2320      to look at the function itself.  */
2321   if (processing_template_decl
2322       || (DECL_LANG_SPECIFIC (fn) 
2323           && DECL_TEMPLATE_INFO (fn)
2324           && uses_template_parms (DECL_TI_ARGS (fn))))
2325     {
2326       /* Normally, collection only occurs in rest_of_compilation.  So,
2327          if we don't collect here, we never collect junk generated
2328          during the processing of templates until we hit a
2329          non-template function.  */
2330       ggc_collect ();
2331       return;
2332     }
2333
2334   /* Replace AGGR_INIT_EXPRs with appropriate CALL_EXPRs.  */
2335   walk_tree_without_duplicates (&DECL_SAVED_TREE (fn),
2336                                 simplify_aggr_init_exprs_r,
2337                                 NULL);
2338
2339   /* If this is a constructor or destructor body, we have to clone it
2340      under the new ABI.  */
2341   if (maybe_clone_body (fn))
2342     {
2343       /* We don't want to process FN again, so pretend we've written
2344          it out, even though we haven't.  */
2345       TREE_ASM_WRITTEN (fn) = 1;
2346       return;
2347     }
2348
2349   /* There's no reason to do any of the work here if we're only doing
2350      semantic analysis; this code just generates RTL.  */
2351   if (flag_syntax_only)
2352     return;
2353
2354   /* If possible, avoid generating RTL for this function.  Instead,
2355      just record it as an inline function, and wait until end-of-file
2356      to decide whether to write it out or not.  */
2357   if (/* We have to generate RTL if it's not an inline function.  */
2358       (DECL_INLINE (fn) || DECL_COMDAT (fn))
2359       /* Or if we have to keep all inline functions anyhow.  */
2360       && !flag_keep_inline_functions
2361       /* Or if we actually have a reference to the function.  */
2362       && !DECL_NEEDED_P (fn)
2363       /* Or if this is a nested function.  */
2364       && !decl_function_context (fn))
2365     {
2366       /* Give the function RTL now so that we can assign it to a
2367          function pointer, etc.  */
2368       make_function_rtl (fn);
2369       /* Set DECL_EXTERNAL so that assemble_external will be called as
2370          necessary.  We'll clear it again in finish_file.  */
2371       if (!DECL_EXTERNAL (fn))
2372         {
2373           DECL_NOT_REALLY_EXTERN (fn) = 1;
2374           DECL_EXTERNAL (fn) = 1;
2375         }
2376       /* Remember this function.  In finish_file we'll decide if
2377          we actually need to write this function out.  */
2378       defer_fn (fn);
2379       /* Let the back-end know that this funtion exists.  */
2380       note_deferral_of_defined_inline_function (fn);
2381       return;
2382     }
2383
2384   /* Emit any thunks that should be emitted at the same time as FN.  */
2385   emit_associated_thunks (fn);
2386
2387   timevar_push (TV_INTEGRATION);
2388
2389   /* Optimize the body of the function before expanding it.  */
2390   optimize_function (fn);
2391
2392   timevar_pop (TV_INTEGRATION);
2393   timevar_push (TV_EXPAND);
2394
2395   /* Save the current file name and line number.  When we expand the
2396      body of the function, we'll set LINENO and INPUT_FILENAME so that
2397      error-mesages come out in the right places.  */
2398   saved_lineno = lineno;
2399   saved_input_filename = input_filename;
2400   lineno = DECL_SOURCE_LINE (fn);
2401   input_filename = DECL_SOURCE_FILE (fn);
2402
2403   genrtl_start_function (fn);
2404   current_function_is_thunk = DECL_THUNK_P (fn);
2405
2406   /* We don't need to redeclare __FUNCTION__, __PRETTY_FUNCTION__, or
2407      any of the other magic variables we set up when starting a
2408      function body.  */
2409   function_name_declared_p = 1;
2410
2411   /* Expand the body.  */
2412   expand_stmt (DECL_SAVED_TREE (fn));
2413
2414   /* Statements should always be full-expressions at the outermost set
2415      of curly braces for a function.  */
2416   my_friendly_assert (stmts_are_full_exprs_p (), 19990831);
2417
2418   /* The outermost statement for a function contains the line number
2419      recorded when we finished processing the function.  */
2420   lineno = STMT_LINENO (DECL_SAVED_TREE (fn));
2421
2422   /* Generate code for the function.  */
2423   genrtl_finish_function (fn);
2424
2425   /* If possible, obliterate the body of the function so that it can
2426      be garbage collected.  */
2427   if (flag_dump_translation_unit)
2428     /* Keep the body; we're going to dump it.  */
2429     ;
2430   else if (DECL_INLINE (fn) && flag_inline_trees)
2431     /* We might need the body of this function so that we can expand
2432        it inline somewhere else.  */
2433     ;
2434   else
2435     /* We don't need the body; blow it away.  */
2436     DECL_SAVED_TREE (fn) = NULL_TREE;
2437
2438   /* And restore the current source position.  */
2439   lineno = saved_lineno;
2440   input_filename = saved_input_filename;
2441   extract_interface_info ();
2442
2443   timevar_pop (TV_EXPAND);
2444 }
2445
2446 /* Start generating the RTL for FN.  */
2447
2448 static void
2449 genrtl_start_function (fn)
2450      tree fn;
2451 {
2452   tree parm;
2453
2454   /* Tell everybody what function we're processing.  */
2455   current_function_decl = fn;
2456   /* Get the RTL machinery going for this function.  */
2457   init_function_start (fn, DECL_SOURCE_FILE (fn), DECL_SOURCE_LINE (fn));
2458   /* Let everybody know that we're expanding this function, not doing
2459      semantic analysis.  */
2460   expanding_p = 1;
2461
2462   /* Even though we're inside a function body, we still don't want to
2463      call expand_expr to calculate the size of a variable-sized array.
2464      We haven't necessarily assigned RTL to all variables yet, so it's
2465      not safe to try to expand expressions involving them.  */
2466   immediate_size_expand = 0;
2467   cfun->x_dont_save_pending_sizes_p = 1;
2468
2469   /* Let the user know we're compiling this function.  */
2470   announce_function (fn);
2471
2472   /* Initialize the per-function data.  */
2473   my_friendly_assert (!DECL_PENDING_INLINE_P (fn), 20000911);
2474   if (DECL_SAVED_FUNCTION_DATA (fn))
2475     {
2476       /* If we already parsed this function, and we're just expanding it
2477          now, restore saved state.  */
2478       *cp_function_chain = *DECL_SAVED_FUNCTION_DATA (fn);
2479
2480       /* This function is being processed in whole-function mode; we
2481          already did semantic analysis.  */
2482       cfun->x_whole_function_mode_p = 1;
2483
2484       /* If we decided that we didn't want to inline this function,
2485          make sure the back-end knows that.  */
2486       if (!current_function_cannot_inline)
2487         current_function_cannot_inline = cp_function_chain->cannot_inline;
2488
2489       /* We don't need the saved data anymore.  */
2490       free (DECL_SAVED_FUNCTION_DATA (fn));
2491       DECL_SAVED_FUNCTION_DATA (fn) = NULL;
2492     }
2493
2494   /* Tell the cross-reference machinery that we're defining this
2495      function.  */
2496   GNU_xref_function (fn, DECL_ARGUMENTS (fn));
2497
2498   /* Keep track of how many functions we're presently expanding.  */
2499   ++function_depth;
2500
2501   /* Create a binding level for the parameters.  */
2502   expand_start_bindings (2);
2503   /* Clear out any previously saved instructions for this function, in
2504      case it was defined more than once.  */
2505   DECL_SAVED_INSNS (fn) = NULL;
2506   /* Go through the PARM_DECLs for this function to see if any need
2507      cleanups.  */
2508   for (parm = DECL_ARGUMENTS (fn); parm; parm = TREE_CHAIN (parm))
2509     if (TREE_TYPE (parm) != error_mark_node
2510         && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TREE_TYPE (parm)))
2511       {
2512         expand_function_start (fn, /*parms_have_cleanups=*/1);
2513         break;
2514       }
2515   if (!parm)
2516     expand_function_start (fn, /*parms_have_cleanups=*/0);
2517   /* If this function is `main'.  */
2518   if (DECL_MAIN_P (fn))
2519     expand_main_function ();
2520   /* Create a binding contour which can be used to catch
2521      cleanup-generated temporaries.  */
2522   expand_start_bindings (2);
2523 }
2524
2525 /* Finish generating the RTL for FN.  */
2526
2527 static void
2528 genrtl_finish_function (fn)
2529      tree fn;
2530 {
2531   tree no_return_label = NULL_TREE;
2532
2533 #if 0
2534   if (write_symbols != NO_DEBUG)
2535     {
2536       /* Keep this code around in case we later want to control debug info
2537          based on whether a type is "used".  (jason 1999-11-11) */
2538
2539       tree ttype = target_type (fntype);
2540       tree parmdecl;
2541
2542       if (IS_AGGR_TYPE (ttype))
2543         /* Let debugger know it should output info for this type.  */
2544         note_debug_info_needed (ttype);
2545
2546       for (parmdecl = DECL_ARGUMENTS (fndecl); parmdecl; parmdecl = TREE_CHAIN (parmdecl))
2547         {
2548           ttype = target_type (TREE_TYPE (parmdecl));
2549           if (IS_AGGR_TYPE (ttype))
2550             /* Let debugger know it should output info for this type.  */
2551             note_debug_info_needed (ttype);
2552         }
2553     }
2554 #endif
2555
2556   /* Clean house because we will need to reorder insns here.  */
2557   do_pending_stack_adjust ();
2558
2559   if (!dtor_label && !DECL_CONSTRUCTOR_P (fn)
2560       && return_label != NULL_RTX
2561       && current_function_return_value == NULL_TREE
2562       && ! DECL_NAME (DECL_RESULT (current_function_decl)))
2563     no_return_label = build_decl (LABEL_DECL, NULL_TREE, NULL_TREE);
2564
2565   if (flag_exceptions)
2566     expand_exception_blocks ();
2567
2568   /* If this function is supposed to return a value, ensure that
2569      we do not fall into the cleanups by mistake.  The end of our
2570      function will look like this:
2571
2572      user code (may have return stmt somewhere)
2573      goto no_return_label
2574      cleanup_label:
2575      cleanups
2576      goto return_label
2577      no_return_label:
2578      NOTE_INSN_FUNCTION_END
2579      return_label:
2580      things for return
2581
2582      If the user omits a return stmt in the USER CODE section, we
2583      will have a control path which reaches NOTE_INSN_FUNCTION_END.
2584      Otherwise, we won't.  */
2585   if (no_return_label)
2586     {
2587       DECL_CONTEXT (no_return_label) = fn;
2588       DECL_INITIAL (no_return_label) = error_mark_node;
2589       DECL_SOURCE_FILE (no_return_label) = input_filename;
2590       DECL_SOURCE_LINE (no_return_label) = lineno;
2591       expand_goto (no_return_label);
2592     }
2593
2594   if (cleanup_label)
2595     {
2596       /* Remove the binding contour which is used to catch
2597          cleanup-generated temporaries.  */
2598       expand_end_bindings (0, 0, 0);
2599       poplevel (0, 0, 0);
2600
2601       /* Emit label at beginning of cleanup code for parameters.  */
2602       emit_label (cleanup_label);
2603     }
2604
2605   /* Get return value into register if that's where it's supposed to
2606      be.  */
2607   if (original_result_rtx)
2608     fixup_result_decl (DECL_RESULT (fn), original_result_rtx);
2609
2610   /* Finish building code that will trigger warnings if users forget
2611      to make their functions return values.  */
2612   if (no_return_label || cleanup_label)
2613     emit_jump (return_label);
2614   if (no_return_label)
2615     {
2616       /* We don't need to call `expand_*_return' here because we don't
2617          need any cleanups here--this path of code is only for error
2618          checking purposes.  */
2619       expand_label (no_return_label);
2620     }
2621
2622   /* We hard-wired immediate_size_expand to zero in start_function.
2623      Expand_function_end will decrement this variable.  So, we set the
2624      variable to one here, so that after the decrement it will remain
2625      zero.  */
2626   immediate_size_expand = 1;
2627
2628   /* Generate rtl for function exit.  */
2629   expand_function_end (input_filename, lineno, 1);
2630
2631   /* If this is a nested function (like a template instantiation that
2632      we're compiling in the midst of compiling something else), push a
2633      new GC context.  That will keep local variables on the stack from
2634      being collected while we're doing the compilation of this
2635      function.  */
2636   if (function_depth > 1)
2637     ggc_push_context ();
2638
2639   /* Run the optimizers and output the assembler code for this
2640      function.  */
2641   rest_of_compilation (fn);
2642
2643   /* Undo the call to ggc_push_context above.  */
2644   if (function_depth > 1)
2645     ggc_pop_context ();
2646
2647   if (DECL_SAVED_INSNS (fn) && ! TREE_ASM_WRITTEN (fn))
2648     {
2649       /* Set DECL_EXTERNAL so that assemble_external will be called as
2650          necessary.  We'll clear it again in finish_file.  */
2651       if (! DECL_EXTERNAL (fn))
2652         DECL_NOT_REALLY_EXTERN (fn) = 1;
2653       DECL_EXTERNAL (fn) = 1;
2654       defer_fn (fn);
2655     }
2656
2657 #if 0
2658   /* Keep this code around in case we later want to control debug info
2659      based on whether a type is "used".  (jason 1999-11-11) */
2660
2661   if (ctype && TREE_ASM_WRITTEN (fn))
2662     note_debug_info_needed (ctype);
2663 #endif
2664
2665   /* If this function is marked with the constructor attribute, add it
2666      to the list of functions to be called along with constructors
2667      from static duration objects.  */
2668   if (DECL_STATIC_CONSTRUCTOR (fn))
2669     static_ctors = tree_cons (NULL_TREE, fn, static_ctors);
2670
2671   /* If this function is marked with the destructor attribute, add it
2672      to the list of functions to be called along with destructors from
2673      static duration objects.  */
2674   if (DECL_STATIC_DESTRUCTOR (fn))
2675     static_dtors = tree_cons (NULL_TREE, fn, static_dtors);
2676
2677   --function_depth;
2678
2679   if (!DECL_SAVED_INSNS (fn)
2680       && !(flag_inline_trees && DECL_INLINE (fn)))
2681     {
2682       tree t;
2683
2684       /* Stop pointing to the local nodes about to be freed.  */
2685       /* But DECL_INITIAL must remain nonzero so we know this
2686          was an actual function definition.  */
2687       DECL_INITIAL (fn) = error_mark_node;
2688       for (t = DECL_ARGUMENTS (fn); t; t = TREE_CHAIN (t))
2689         DECL_RTL (t) = DECL_INCOMING_RTL (t) = NULL_RTX;
2690     }
2691
2692   /* Let the error reporting routines know that we're outside a
2693      function.  For a nested function, this value is used in
2694      pop_cp_function_context and then reset via pop_function_context.  */
2695   current_function_decl = NULL_TREE;
2696 }
2697
2698 /* Perform initialization related to this module.  */
2699
2700 void
2701 init_cp_semantics ()
2702 {
2703   lang_expand_stmt = cp_expand_stmt;
2704 }