OSDN Git Service

1ce6bd3318107c72888fd0fd3b498f370f570318
[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, 2001, 2002,
7    2003 Free Software Foundation, Inc.
8    Written by Mark Mitchell (mmitchell@usa.net) based on code found
9    formerly in parse.y and pt.c.  
10
11    This file is part of GCC.
12
13    GCC is free software; you can redistribute it and/or modify it
14    under the terms of the GNU General Public License as published by
15    the Free Software Foundation; either version 2, or (at your option)
16    any later version.
17    
18    GCC is distributed in the hope that it will be useful, but
19    WITHOUT ANY WARRANTY; without even the implied warranty of
20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21    General Public License for more details.
22    
23    You should have received a copy of the GNU General Public License
24    along with GCC; see the file COPYING.  If not, write to the Free
25    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
26    02111-1307, USA.  */
27
28 #include "config.h"
29 #include "system.h"
30 #include "coretypes.h"
31 #include "tm.h"
32 #include "tree.h"
33 #include "cp-tree.h"
34 #include "tree-inline.h"
35 #include "except.h"
36 #include "lex.h"
37 #include "toplev.h"
38 #include "flags.h"
39 #include "rtl.h"
40 #include "expr.h"
41 #include "output.h"
42 #include "timevar.h"
43 #include "debug.h"
44 #include "cgraph.h"
45
46 /* There routines provide a modular interface to perform many parsing
47    operations.  They may therefore be used during actual parsing, or
48    during template instantiation, which may be regarded as a
49    degenerate form of parsing.  Since the current g++ parser is
50    lacking in several respects, and will be reimplemented, we are
51    attempting to move most code that is not directly related to
52    parsing into this file; that will make implementing the new parser
53    much easier since it will be able to make use of these routines.  */
54
55 static tree maybe_convert_cond (tree);
56 static tree simplify_aggr_init_exprs_r (tree *, int *, void *);
57 static void emit_associated_thunks (tree);
58 static void genrtl_try_block (tree);
59 static void genrtl_eh_spec_block (tree);
60 static void genrtl_handler (tree);
61 static void cp_expand_stmt (tree);
62 static void genrtl_start_function (tree);
63 static void genrtl_finish_function (tree);
64 static tree clear_decl_rtl (tree *, int *, void *);
65
66 /* Finish processing the COND, the SUBSTMT condition for STMT.  */
67
68 #define FINISH_COND(COND, STMT, SUBSTMT)                \
69   do {                                                  \
70     if (last_tree != (STMT))                            \
71       {                                                 \
72         RECHAIN_STMTS (STMT, SUBSTMT);                  \
73         if (!processing_template_decl)                  \
74           {                                             \
75             (COND) = build_tree_list (SUBSTMT, COND);   \
76             (SUBSTMT) = (COND);                         \
77           }                                             \
78       }                                                 \
79     else                                                \
80       (SUBSTMT) = (COND);                               \
81   } while (0)
82
83 /* Deferred Access Checking Overview
84    ---------------------------------
85
86    Most C++ expressions and declarations require access checking
87    to be performed during parsing.  However, in several cases,
88    this has to be treated differently.
89
90    For member declarations, access checking has to be deferred
91    until more information about the declaration is known.  For
92    example:
93
94      class A {
95          typedef int X;
96        public:
97          X f();
98      };
99
100      A::X A::f();
101      A::X g();
102
103    When we are parsing the function return type `A::X', we don't
104    really know if this is allowed until we parse the function name.
105
106    Furthermore, some contexts require that access checking is
107    never performed at all.  These include class heads, and template
108    instantiations.
109
110    Typical use of access checking functions is described here:
111    
112    1. When we enter a context that requires certain access checking
113       mode, the function `push_deferring_access_checks' is called with
114       DEFERRING argument specifying the desired mode.  Access checking
115       may be performed immediately (dk_no_deferred), deferred
116       (dk_deferred), or not performed (dk_no_check).
117
118    2. When a declaration such as a type, or a variable, is encountered,
119       the function `perform_or_defer_access_check' is called.  It
120       maintains a TREE_LIST of all deferred checks.
121
122    3. The global `current_class_type' or `current_function_decl' is then
123       setup by the parser.  `enforce_access' relies on these information
124       to check access.
125
126    4. Upon exiting the context mentioned in step 1,
127       `perform_deferred_access_checks' is called to check all declaration
128       stored in the TREE_LIST.   `pop_deferring_access_checks' is then
129       called to restore the previous access checking mode.
130
131       In case of parsing error, we simply call `pop_deferring_access_checks'
132       without `perform_deferred_access_checks'.  */
133
134 /* Data for deferred access checking.  */
135 static GTY(()) deferred_access *deferred_access_stack;
136 static GTY(()) deferred_access *deferred_access_free_list;
137
138 /* Save the current deferred access states and start deferred
139    access checking iff DEFER_P is true.  */
140
141 void push_deferring_access_checks (deferring_kind deferring)
142 {
143   deferred_access *d;
144
145   /* For context like template instantiation, access checking
146      disabling applies to all nested context.  */
147   if (deferred_access_stack
148       && deferred_access_stack->deferring_access_checks_kind == dk_no_check)
149     deferring = dk_no_check;
150
151   /* Recycle previously used free store if available.  */
152   if (deferred_access_free_list)
153     {
154       d = deferred_access_free_list;
155       deferred_access_free_list = d->next;
156     }
157   else
158     d = ggc_alloc (sizeof (deferred_access));
159
160   d->next = deferred_access_stack;
161   d->deferred_access_checks = NULL_TREE;
162   d->deferring_access_checks_kind = deferring;
163   deferred_access_stack = d;
164 }
165
166 /* Resume deferring access checks again after we stopped doing
167    this previously.  */
168
169 void resume_deferring_access_checks (void)
170 {
171   if (deferred_access_stack->deferring_access_checks_kind == dk_no_deferred)
172     deferred_access_stack->deferring_access_checks_kind = dk_deferred;
173 }
174
175 /* Stop deferring access checks.  */
176
177 void stop_deferring_access_checks (void)
178 {
179   if (deferred_access_stack->deferring_access_checks_kind == dk_deferred)
180     deferred_access_stack->deferring_access_checks_kind = dk_no_deferred;
181 }
182
183 /* Discard the current deferred access checks and restore the
184    previous states.  */
185
186 void pop_deferring_access_checks (void)
187 {
188   deferred_access *d = deferred_access_stack;
189   deferred_access_stack = d->next;
190
191   /* Remove references to access checks TREE_LIST.  */
192   d->deferred_access_checks = NULL_TREE;
193
194   /* Store in free list for later use.  */
195   d->next = deferred_access_free_list;
196   deferred_access_free_list = d;
197 }
198
199 /* Returns a TREE_LIST representing the deferred checks.  
200    The TREE_PURPOSE of each node is the type through which the 
201    access occurred; the TREE_VALUE is the declaration named.
202    */
203
204 tree get_deferred_access_checks (void)
205 {
206   return deferred_access_stack->deferred_access_checks;
207 }
208
209 /* Take current deferred checks and combine with the
210    previous states if we also defer checks previously.
211    Otherwise perform checks now.  */
212
213 void pop_to_parent_deferring_access_checks (void)
214 {
215   tree deferred_check = get_deferred_access_checks ();
216   deferred_access *d1 = deferred_access_stack;
217   deferred_access *d2 = deferred_access_stack->next;
218   deferred_access *d3 = deferred_access_stack->next->next;
219
220   /* Temporary swap the order of the top two states, just to make
221      sure the garbage collector will not reclaim the memory during 
222      processing below.  */
223   deferred_access_stack = d2;
224   d2->next = d1;
225   d1->next = d3;
226
227   for ( ; deferred_check; deferred_check = TREE_CHAIN (deferred_check))
228     /* Perform deferred check if required.  */
229     perform_or_defer_access_check (TREE_PURPOSE (deferred_check), 
230                                    TREE_VALUE (deferred_check));
231
232   deferred_access_stack = d1;
233   d1->next = d2;
234   d2->next = d3;
235   pop_deferring_access_checks ();
236 }
237
238 /* Perform the deferred access checks.
239
240    After performing the checks, we still have to keep the list
241    `deferred_access_stack->deferred_access_checks' since we may want
242    to check access for them again later in a different context.
243    For example:
244
245      class A {
246        typedef int X;
247        static X a;
248      };
249      A::X A::a, x;      // No error for `A::a', error for `x'
250
251    We have to perform deferred access of `A::X', first with `A::a',
252    next with `x'.  */
253
254 void perform_deferred_access_checks (void)
255 {
256   tree deferred_check;
257   for (deferred_check = deferred_access_stack->deferred_access_checks;
258        deferred_check;
259        deferred_check = TREE_CHAIN (deferred_check))
260     /* Check access.  */
261     enforce_access (TREE_PURPOSE (deferred_check), 
262                     TREE_VALUE (deferred_check));
263 }
264
265 /* Defer checking the accessibility of DECL, when looked up in
266    BINFO.  */
267
268 void perform_or_defer_access_check (tree binfo, tree decl)
269 {
270   tree check;
271
272   my_friendly_assert (TREE_CODE (binfo) == TREE_VEC, 20030623);
273   
274   /* If we are not supposed to defer access checks, just check now.  */
275   if (deferred_access_stack->deferring_access_checks_kind == dk_no_deferred)
276     {
277       enforce_access (binfo, decl);
278       return;
279     }
280   /* Exit if we are in a context that no access checking is performed.  */
281   else if (deferred_access_stack->deferring_access_checks_kind == dk_no_check)
282     return;
283
284   /* See if we are already going to perform this check.  */
285   for (check = deferred_access_stack->deferred_access_checks;
286        check;
287        check = TREE_CHAIN (check))
288     if (TREE_VALUE (check) == decl && TREE_PURPOSE (check) == binfo)
289       return;
290   /* If not, record the check.  */
291   deferred_access_stack->deferred_access_checks
292     = tree_cons (binfo, decl,
293                  deferred_access_stack->deferred_access_checks);
294 }
295
296 /* Returns nonzero if the current statement is a full expression,
297    i.e. temporaries created during that statement should be destroyed
298    at the end of the statement.  */
299
300 int
301 stmts_are_full_exprs_p (void)
302 {
303   return current_stmt_tree ()->stmts_are_full_exprs_p;
304 }
305
306 /* Returns the stmt_tree (if any) to which statements are currently
307    being added.  If there is no active statement-tree, NULL is
308    returned.  */
309
310 stmt_tree
311 current_stmt_tree (void)
312 {
313   return (cfun 
314           ? &cfun->language->base.x_stmt_tree 
315           : &scope_chain->x_stmt_tree);
316 }
317
318 /* Nonzero if TYPE is an anonymous union or struct type.  We have to use a
319    flag for this because "A union for which objects or pointers are
320    declared is not an anonymous union" [class.union].  */
321
322 int
323 anon_aggr_type_p (tree node)
324 {
325   return ANON_AGGR_TYPE_P (node);
326 }
327
328 /* Finish a scope.  */
329
330 tree
331 do_poplevel (void)
332 {
333   tree block = NULL_TREE;
334
335   if (stmts_are_full_exprs_p ())
336     {
337       tree scope_stmts = NULL_TREE;
338
339       block = poplevel (kept_level_p (), 1, 0);
340       if (!processing_template_decl)
341         {
342           /* This needs to come after the poplevel so that partial scopes
343              are properly nested.  */
344           scope_stmts = add_scope_stmt (/*begin_p=*/0, /*partial_p=*/0);
345           if (block)
346             {
347               SCOPE_STMT_BLOCK (TREE_PURPOSE (scope_stmts)) = block;
348               SCOPE_STMT_BLOCK (TREE_VALUE (scope_stmts)) = block;
349             }
350         }
351     }
352
353   return block;
354 }
355
356 /* Begin a new scope.  */ 
357
358 void
359 do_pushlevel (scope_kind sk)
360 {
361   if (stmts_are_full_exprs_p ())
362     {
363       if (!processing_template_decl)
364         add_scope_stmt (/*begin_p=*/1, /*partial_p=*/0);
365       begin_scope (sk);
366     }
367 }
368
369 /* Finish a goto-statement.  */
370
371 tree
372 finish_goto_stmt (tree destination)
373 {
374   if (TREE_CODE (destination) == IDENTIFIER_NODE)
375     destination = lookup_label (destination);
376
377   /* We warn about unused labels with -Wunused.  That means we have to
378      mark the used labels as used.  */
379   if (TREE_CODE (destination) == LABEL_DECL)
380     TREE_USED (destination) = 1;
381     
382   if (TREE_CODE (destination) != LABEL_DECL)
383     /* We don't inline calls to functions with computed gotos.
384        Those functions are typically up to some funny business,
385        and may be depending on the labels being at particular
386        addresses, or some such.  */
387     DECL_UNINLINABLE (current_function_decl) = 1;
388   
389   check_goto (destination);
390
391   return add_stmt (build_stmt (GOTO_STMT, destination));
392 }
393
394 /* COND is the condition-expression for an if, while, etc.,
395    statement.  Convert it to a boolean value, if appropriate.  */
396
397 static tree
398 maybe_convert_cond (tree cond)
399 {
400   /* Empty conditions remain empty.  */
401   if (!cond)
402     return NULL_TREE;
403
404   /* Wait until we instantiate templates before doing conversion.  */
405   if (processing_template_decl)
406     return cond;
407
408   /* Do the conversion.  */
409   cond = convert_from_reference (cond);
410   return condition_conversion (cond);
411 }
412
413 /* Finish an expression-statement, whose EXPRESSION is as indicated.  */
414
415 tree
416 finish_expr_stmt (tree expr)
417 {
418   tree r = NULL_TREE;
419   tree expr_type = NULL_TREE;;
420
421   if (expr != NULL_TREE)
422     {
423       if (!processing_template_decl
424           && !(stmts_are_full_exprs_p ())
425           && ((TREE_CODE (TREE_TYPE (expr)) == ARRAY_TYPE
426                && lvalue_p (expr))
427               || TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE))
428         expr = decay_conversion (expr);
429       
430       /* Remember the type of the expression.  */
431       expr_type = TREE_TYPE (expr);
432
433       if (stmts_are_full_exprs_p ())
434         expr = convert_to_void (expr, "statement");
435       
436       r = add_stmt (build_stmt (EXPR_STMT, expr));
437     }
438
439   finish_stmt ();
440
441   /* This was an expression-statement, so we save the type of the
442      expression.  */
443   last_expr_type = expr_type;
444
445   return r;
446 }
447
448
449 /* Begin an if-statement.  Returns a newly created IF_STMT if
450    appropriate.  */
451
452 tree
453 begin_if_stmt (void)
454 {
455   tree r;
456   do_pushlevel (sk_block);
457   r = build_stmt (IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
458   add_stmt (r);
459   return r;
460 }
461
462 /* Process the COND of an if-statement, which may be given by
463    IF_STMT.  */
464
465 void 
466 finish_if_stmt_cond (tree cond, tree if_stmt)
467 {
468   cond = maybe_convert_cond (cond);
469   FINISH_COND (cond, if_stmt, IF_COND (if_stmt));
470 }
471
472 /* Finish the then-clause of an if-statement, which may be given by
473    IF_STMT.  */
474
475 tree
476 finish_then_clause (tree if_stmt)
477 {
478   RECHAIN_STMTS (if_stmt, THEN_CLAUSE (if_stmt));
479   return if_stmt;
480 }
481
482 /* Begin the else-clause of an if-statement.  */
483
484 void 
485 begin_else_clause (void)
486 {
487 }
488
489 /* Finish the else-clause of an if-statement, which may be given by
490    IF_STMT.  */
491
492 void
493 finish_else_clause (tree if_stmt)
494 {
495   RECHAIN_STMTS (if_stmt, ELSE_CLAUSE (if_stmt));
496 }
497
498 /* Finish an if-statement.  */
499
500 void 
501 finish_if_stmt (void)
502 {
503   finish_stmt ();
504   do_poplevel ();
505 }
506
507 /* Begin a while-statement.  Returns a newly created WHILE_STMT if
508    appropriate.  */
509
510 tree
511 begin_while_stmt (void)
512 {
513   tree r;
514   r = build_stmt (WHILE_STMT, NULL_TREE, NULL_TREE);
515   add_stmt (r);
516   do_pushlevel (sk_block);
517   return r;
518 }
519
520 /* Process the COND of a while-statement, which may be given by
521    WHILE_STMT.  */
522
523 void 
524 finish_while_stmt_cond (tree cond, tree while_stmt)
525 {
526   cond = maybe_convert_cond (cond);
527   if (processing_template_decl)
528     /* Don't mess with condition decls in a template.  */
529     FINISH_COND (cond, while_stmt, WHILE_COND (while_stmt));
530   else if (getdecls () == NULL_TREE)
531     /* It was a simple condition; install it.  */
532     WHILE_COND (while_stmt) = cond;
533   else
534     {
535       /* If there was a declaration in the condition, we can't leave it
536          there; transform
537             while (A x = 42) { }
538          to
539             while (true) { A x = 42; if (!x) break; }  */
540       tree if_stmt;
541       WHILE_COND (while_stmt) = boolean_true_node;
542
543       if_stmt = begin_if_stmt ();
544       cond = build_unary_op (TRUTH_NOT_EXPR, cond, 0);
545       finish_if_stmt_cond (cond, if_stmt);
546       finish_break_stmt ();
547       finish_then_clause (if_stmt);
548       finish_if_stmt ();
549     }
550 }
551
552 /* Finish a while-statement, which may be given by WHILE_STMT.  */
553
554 void 
555 finish_while_stmt (tree while_stmt)
556 {
557   do_poplevel ();
558   RECHAIN_STMTS (while_stmt, WHILE_BODY (while_stmt));
559   finish_stmt ();
560 }
561
562 /* Begin a do-statement.  Returns a newly created DO_STMT if
563    appropriate.  */
564
565 tree
566 begin_do_stmt (void)
567 {
568   tree r = build_stmt (DO_STMT, NULL_TREE, NULL_TREE);
569   add_stmt (r);
570   return r;
571 }
572
573 /* Finish the body of a do-statement, which may be given by DO_STMT.  */
574
575 void
576 finish_do_body (tree do_stmt)
577 {
578   RECHAIN_STMTS (do_stmt, DO_BODY (do_stmt));
579 }
580
581 /* Finish a do-statement, which may be given by DO_STMT, and whose
582    COND is as indicated.  */
583
584 void
585 finish_do_stmt (tree cond, tree do_stmt)
586 {
587   cond = maybe_convert_cond (cond);
588   DO_COND (do_stmt) = cond;
589   finish_stmt ();
590 }
591
592 /* Finish a return-statement.  The EXPRESSION returned, if any, is as
593    indicated.  */
594
595 tree
596 finish_return_stmt (tree expr)
597 {
598   tree r;
599
600   expr = check_return_expr (expr);
601   if (!processing_template_decl)
602     {
603       if (DECL_DESTRUCTOR_P (current_function_decl))
604         {
605           /* Similarly, all destructors must run destructors for
606              base-classes before returning.  So, all returns in a
607              destructor get sent to the DTOR_LABEL; finish_function emits
608              code to return a value there.  */
609           return finish_goto_stmt (dtor_label);
610         }
611     }
612   r = add_stmt (build_stmt (RETURN_STMT, expr));
613   finish_stmt ();
614
615   return r;
616 }
617
618 /* Begin a for-statement.  Returns a new FOR_STMT if appropriate.  */
619
620 tree
621 begin_for_stmt (void)
622 {
623   tree r;
624
625   r = build_stmt (FOR_STMT, NULL_TREE, NULL_TREE, 
626                   NULL_TREE, NULL_TREE);
627   NEW_FOR_SCOPE_P (r) = flag_new_for_scope > 0;
628   if (NEW_FOR_SCOPE_P (r))
629     do_pushlevel (sk_for);
630   add_stmt (r);
631
632   return r;
633 }
634
635 /* Finish the for-init-statement of a for-statement, which may be
636    given by FOR_STMT.  */
637
638 void
639 finish_for_init_stmt (tree for_stmt)
640 {
641   if (last_tree != for_stmt)
642     RECHAIN_STMTS (for_stmt, FOR_INIT_STMT (for_stmt));
643   do_pushlevel (sk_block);
644 }
645
646 /* Finish the COND of a for-statement, which may be given by
647    FOR_STMT.  */
648
649 void
650 finish_for_cond (tree cond, tree for_stmt)
651 {
652   cond = maybe_convert_cond (cond);
653   if (processing_template_decl)
654     /* Don't mess with condition decls in a template.  */
655     FINISH_COND (cond, for_stmt, FOR_COND (for_stmt));
656   else if (getdecls () == NULL_TREE)
657     /* It was a simple condition; install it.  */
658     FOR_COND (for_stmt) = cond;
659   else
660     {
661       /* If there was a declaration in the condition, we can't leave it
662          there; transform
663             for (; A x = 42;) { }
664          to
665             for (;;) { A x = 42; if (!x) break; }  */
666       tree if_stmt;
667       FOR_COND (for_stmt) = NULL_TREE;
668
669       if_stmt = begin_if_stmt ();
670       cond = build_unary_op (TRUTH_NOT_EXPR, cond, 0);
671       finish_if_stmt_cond (cond, if_stmt);
672       finish_break_stmt ();
673       finish_then_clause (if_stmt);
674       finish_if_stmt ();
675     }
676 }
677
678 /* Finish the increment-EXPRESSION in a for-statement, which may be
679    given by FOR_STMT.  */
680
681 void
682 finish_for_expr (tree expr, tree for_stmt)
683 {
684   FOR_EXPR (for_stmt) = expr;
685 }
686
687 /* Finish the body of a for-statement, which may be given by
688    FOR_STMT.  The increment-EXPR for the loop must be
689    provided.  */
690
691 void
692 finish_for_stmt (tree for_stmt)
693 {
694   /* Pop the scope for the body of the loop.  */
695   do_poplevel ();
696   RECHAIN_STMTS (for_stmt, FOR_BODY (for_stmt));
697   if (NEW_FOR_SCOPE_P (for_stmt))
698     do_poplevel ();
699   finish_stmt (); 
700 }
701
702 /* Finish a break-statement.  */
703
704 tree
705 finish_break_stmt (void)
706 {
707   return add_stmt (build_break_stmt ());
708 }
709
710 /* Finish a continue-statement.  */
711
712 tree
713 finish_continue_stmt (void)
714 {
715   return add_stmt (build_continue_stmt ());
716 }
717
718 /* Begin a switch-statement.  Returns a new SWITCH_STMT if
719    appropriate.  */
720
721 tree
722 begin_switch_stmt (void)
723 {
724   tree r;
725   do_pushlevel (sk_block);
726   r = build_stmt (SWITCH_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
727   add_stmt (r);
728   return r;
729 }
730
731 /* Finish the cond of a switch-statement.  */
732
733 void
734 finish_switch_cond (tree cond, tree switch_stmt)
735 {
736   tree orig_type = NULL;
737   if (!processing_template_decl)
738     {
739       tree index;
740
741       /* Convert the condition to an integer or enumeration type.  */
742       cond = build_expr_type_conversion (WANT_INT | WANT_ENUM, cond, true);
743       if (cond == NULL_TREE)
744         {
745           error ("switch quantity not an integer");
746           cond = error_mark_node;
747         }
748       orig_type = TREE_TYPE (cond);
749       if (cond != error_mark_node)
750         {
751           /* [stmt.switch]
752
753              Integral promotions are performed.  */
754           cond = perform_integral_promotions (cond);
755           cond = fold (build1 (CLEANUP_POINT_EXPR, TREE_TYPE (cond), cond));
756         }
757
758       if (cond != error_mark_node)
759         {
760           index = get_unwidened (cond, NULL_TREE);
761           /* We can't strip a conversion from a signed type to an unsigned,
762              because if we did, int_fits_type_p would do the wrong thing
763              when checking case values for being in range,
764              and it's too hard to do the right thing.  */
765           if (TREE_UNSIGNED (TREE_TYPE (cond))
766               == TREE_UNSIGNED (TREE_TYPE (index)))
767             cond = index;
768         }
769     }
770   FINISH_COND (cond, switch_stmt, SWITCH_COND (switch_stmt));
771   SWITCH_TYPE (switch_stmt) = orig_type;
772   push_switch (switch_stmt);
773 }
774
775 /* Finish the body of a switch-statement, which may be given by
776    SWITCH_STMT.  The COND to switch on is indicated.  */
777
778 void
779 finish_switch_stmt (tree switch_stmt)
780 {
781   RECHAIN_STMTS (switch_stmt, SWITCH_BODY (switch_stmt));
782   pop_switch (); 
783   finish_stmt ();
784   do_poplevel ();
785 }
786
787 /* Generate the RTL for T, which is a TRY_BLOCK.  */
788
789 static void 
790 genrtl_try_block (tree t)
791 {
792   if (CLEANUP_P (t))
793     {
794       expand_eh_region_start ();
795       expand_stmt (TRY_STMTS (t));
796       expand_eh_region_end_cleanup (TRY_HANDLERS (t));
797     }
798   else
799     {
800       if (!FN_TRY_BLOCK_P (t)) 
801         emit_line_note (input_location);
802
803       expand_eh_region_start ();
804       expand_stmt (TRY_STMTS (t));
805
806       if (FN_TRY_BLOCK_P (t))
807         {
808           expand_start_all_catch ();
809           in_function_try_handler = 1;
810           expand_stmt (TRY_HANDLERS (t));
811           in_function_try_handler = 0;
812           expand_end_all_catch ();
813         }
814       else 
815         {
816           expand_start_all_catch ();  
817           expand_stmt (TRY_HANDLERS (t));
818           expand_end_all_catch ();
819         }
820     }
821 }
822
823 /* Generate the RTL for T, which is an EH_SPEC_BLOCK.  */
824
825 static void 
826 genrtl_eh_spec_block (tree t)
827 {
828   expand_eh_region_start ();
829   expand_stmt (EH_SPEC_STMTS (t));
830   expand_eh_region_end_allowed (EH_SPEC_RAISES (t),
831                                 build_call (call_unexpected_node,
832                                             tree_cons (NULL_TREE,
833                                                        build_exc_ptr (),
834                                                        NULL_TREE)));
835 }
836
837 /* Begin a try-block.  Returns a newly-created TRY_BLOCK if
838    appropriate.  */
839
840 tree
841 begin_try_block (void)
842 {
843   tree r = build_stmt (TRY_BLOCK, NULL_TREE, NULL_TREE);
844   add_stmt (r);
845   return r;
846 }
847
848 /* Likewise, for a function-try-block.  */
849
850 tree
851 begin_function_try_block (void)
852 {
853   tree r = build_stmt (TRY_BLOCK, NULL_TREE, NULL_TREE);
854   FN_TRY_BLOCK_P (r) = 1;
855   add_stmt (r);
856   return r;
857 }
858
859 /* Finish a try-block, which may be given by TRY_BLOCK.  */
860
861 void
862 finish_try_block (tree try_block)
863 {
864   RECHAIN_STMTS (try_block, TRY_STMTS (try_block));
865 }
866
867 /* Finish the body of a cleanup try-block, which may be given by
868    TRY_BLOCK.  */
869
870 void
871 finish_cleanup_try_block (tree try_block)
872 {
873   RECHAIN_STMTS (try_block, TRY_STMTS (try_block));
874 }
875
876 /* Finish an implicitly generated try-block, with a cleanup is given
877    by CLEANUP.  */
878
879 void
880 finish_cleanup (tree cleanup, tree try_block)
881 {
882   TRY_HANDLERS (try_block) = cleanup;
883   CLEANUP_P (try_block) = 1;
884 }
885
886 /* Likewise, for a function-try-block.  */
887
888 void
889 finish_function_try_block (tree try_block)
890 {
891   if (TREE_CHAIN (try_block) 
892       && TREE_CODE (TREE_CHAIN (try_block)) == CTOR_INITIALIZER)
893     {
894       /* Chain the compound statement after the CTOR_INITIALIZER.  */
895       TREE_CHAIN (TREE_CHAIN (try_block)) = last_tree;
896       /* And make the CTOR_INITIALIZER the body of the try-block.  */
897       RECHAIN_STMTS (try_block, TRY_STMTS (try_block));
898     }
899   else
900     RECHAIN_STMTS (try_block, TRY_STMTS (try_block));
901   in_function_try_handler = 1;
902 }
903
904 /* Finish a handler-sequence for a try-block, which may be given by
905    TRY_BLOCK.  */
906
907 void
908 finish_handler_sequence (tree try_block)
909 {
910   RECHAIN_STMTS (try_block, TRY_HANDLERS (try_block));
911   check_handlers (TRY_HANDLERS (try_block));
912 }
913
914 /* Likewise, for a function-try-block.  */
915
916 void
917 finish_function_handler_sequence (tree try_block)
918 {
919   in_function_try_handler = 0;
920   RECHAIN_STMTS (try_block, TRY_HANDLERS (try_block));
921   check_handlers (TRY_HANDLERS (try_block));
922 }
923
924 /* Generate the RTL for T, which is a HANDLER.  */
925
926 static void
927 genrtl_handler (tree t)
928 {
929   genrtl_do_pushlevel ();
930   if (!processing_template_decl)
931     expand_start_catch (HANDLER_TYPE (t));
932   expand_stmt (HANDLER_BODY (t));
933   if (!processing_template_decl)
934     expand_end_catch ();
935 }
936
937 /* Begin a handler.  Returns a HANDLER if appropriate.  */
938
939 tree
940 begin_handler (void)
941 {
942   tree r;
943   r = build_stmt (HANDLER, NULL_TREE, NULL_TREE);
944   add_stmt (r);
945   /* Create a binding level for the eh_info and the exception object
946      cleanup.  */
947   do_pushlevel (sk_catch);
948   return r;
949 }
950
951 /* Finish the handler-parameters for a handler, which may be given by
952    HANDLER.  DECL is the declaration for the catch parameter, or NULL
953    if this is a `catch (...)' clause.  */
954
955 void
956 finish_handler_parms (tree decl, tree handler)
957 {
958   tree type = NULL_TREE;
959   if (processing_template_decl)
960     {
961       if (decl)
962         {
963           decl = pushdecl (decl);
964           decl = push_template_decl (decl);
965           add_decl_stmt (decl);
966           RECHAIN_STMTS (handler, HANDLER_PARMS (handler));
967           type = TREE_TYPE (decl);
968         }
969     }
970   else
971     type = expand_start_catch_block (decl);
972
973   HANDLER_TYPE (handler) = type;
974 }
975
976 /* Finish a handler, which may be given by HANDLER.  The BLOCKs are
977    the return value from the matching call to finish_handler_parms.  */
978
979 void
980 finish_handler (tree handler)
981 {
982   if (!processing_template_decl)
983     expand_end_catch_block ();
984   do_poplevel ();
985   RECHAIN_STMTS (handler, HANDLER_BODY (handler));
986 }
987
988 /* Begin a compound-statement.  If HAS_NO_SCOPE is nonzero, the
989    compound-statement does not define a scope.  Returns a new
990    COMPOUND_STMT if appropriate.  */
991
992 tree
993 begin_compound_stmt (int has_no_scope)
994 {
995   tree r; 
996   int is_try = 0;
997
998   r = build_stmt (COMPOUND_STMT, NULL_TREE);
999
1000   if (last_tree && TREE_CODE (last_tree) == TRY_BLOCK)
1001     is_try = 1;
1002
1003   add_stmt (r);
1004   if (has_no_scope)
1005     COMPOUND_STMT_NO_SCOPE (r) = 1;
1006
1007   last_expr_type = NULL_TREE;
1008
1009   if (!has_no_scope)
1010     do_pushlevel (is_try ? sk_try : sk_block);
1011   else
1012     /* Normally, we try hard to keep the BLOCK for a
1013        statement-expression.  But, if it's a statement-expression with
1014        a scopeless block, there's nothing to keep, and we don't want
1015        to accidentally keep a block *inside* the scopeless block.  */ 
1016     keep_next_level (0);
1017
1018   return r;
1019 }
1020
1021 /* Finish a compound-statement, which may be given by COMPOUND_STMT.
1022    If HAS_NO_SCOPE is nonzero, the compound statement does not define
1023    a scope.  */
1024
1025 tree
1026 finish_compound_stmt (int has_no_scope, tree compound_stmt)
1027 {
1028   tree r;
1029   tree t;
1030
1031   if (!has_no_scope)
1032     r = do_poplevel ();
1033   else
1034     r = NULL_TREE;
1035
1036   RECHAIN_STMTS (compound_stmt, COMPOUND_BODY (compound_stmt));
1037
1038   /* When we call finish_stmt we will lose LAST_EXPR_TYPE.  But, since
1039      the precise purpose of that variable is store the type of the
1040      last expression statement within the last compound statement, we
1041      preserve the value.  */
1042   t = last_expr_type;
1043   finish_stmt ();
1044   last_expr_type = t;
1045
1046   return r;
1047 }
1048
1049 /* Finish an asm-statement, whose components are a CV_QUALIFIER, a
1050    STRING, some OUTPUT_OPERANDS, some INPUT_OPERANDS, and some
1051    CLOBBERS.  */
1052
1053 tree
1054 finish_asm_stmt (tree cv_qualifier, 
1055                  tree string, 
1056                  tree output_operands,
1057                  tree input_operands, 
1058                  tree clobbers)
1059 {
1060   tree r;
1061   tree t;
1062
1063   if (cv_qualifier != NULL_TREE
1064       && cv_qualifier != ridpointers[(int) RID_VOLATILE])
1065     {
1066       warning ("%s qualifier ignored on asm",
1067                   IDENTIFIER_POINTER (cv_qualifier));
1068       cv_qualifier = NULL_TREE;
1069     }
1070
1071   if (!processing_template_decl)
1072     {
1073       int i;
1074       int ninputs;
1075       int noutputs;
1076
1077       for (t = input_operands; t; t = TREE_CHAIN (t))
1078         {
1079           tree converted_operand 
1080             = decay_conversion (TREE_VALUE (t)); 
1081           
1082           /* If the type of the operand hasn't been determined (e.g.,
1083              because it involves an overloaded function), then issue
1084              an error message.  There's no context available to
1085              resolve the overloading.  */
1086           if (TREE_TYPE (converted_operand) == unknown_type_node)
1087             {
1088               error ("type of asm operand `%E' could not be determined", 
1089                         TREE_VALUE (t));
1090               converted_operand = error_mark_node;
1091             }
1092           TREE_VALUE (t) = converted_operand;
1093         }
1094
1095       ninputs = list_length (input_operands);
1096       noutputs = list_length (output_operands);
1097
1098       for (i = 0, t = output_operands; t; t = TREE_CHAIN (t), ++i)
1099         {
1100           bool allows_mem;
1101           bool allows_reg;
1102           bool is_inout;
1103           const char *constraint;
1104           tree operand;
1105
1106           constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
1107           operand = TREE_VALUE (t);
1108
1109           if (!parse_output_constraint (&constraint,
1110                                         i, ninputs, noutputs,
1111                                         &allows_mem,
1112                                         &allows_reg,
1113                                         &is_inout))
1114             {
1115               /* By marking this operand as erroneous, we will not try
1116                  to process this operand again in expand_asm_operands.  */
1117               TREE_VALUE (t) = error_mark_node;
1118               continue;
1119             }
1120
1121           /* If the operand is a DECL that is going to end up in
1122              memory, assume it is addressable.  This is a bit more
1123              conservative than it would ideally be; the exact test is
1124              buried deep in expand_asm_operands and depends on the
1125              DECL_RTL for the OPERAND -- which we don't have at this
1126              point.  */
1127           if (!allows_reg && DECL_P (operand))
1128             cxx_mark_addressable (operand);
1129         }
1130     }
1131
1132   r = build_stmt (ASM_STMT, cv_qualifier, string,
1133                   output_operands, input_operands,
1134                   clobbers);
1135   return add_stmt (r);
1136 }
1137
1138 /* Finish a label with the indicated NAME.  */
1139
1140 tree
1141 finish_label_stmt (tree name)
1142 {
1143   tree decl = define_label (input_location, name);
1144   return add_stmt (build_stmt (LABEL_STMT, decl));
1145 }
1146
1147 /* Finish a series of declarations for local labels.  G++ allows users
1148    to declare "local" labels, i.e., labels with scope.  This extension
1149    is useful when writing code involving statement-expressions.  */
1150
1151 void
1152 finish_label_decl (tree name)
1153 {
1154   tree decl = declare_local_label (name);
1155   add_decl_stmt (decl);
1156 }
1157
1158 /* When DECL goes out of scope, make sure that CLEANUP is executed.  */
1159
1160 void 
1161 finish_decl_cleanup (tree decl, tree cleanup)
1162 {
1163   add_stmt (build_stmt (CLEANUP_STMT, decl, cleanup));
1164 }
1165
1166 /* If the current scope exits with an exception, run CLEANUP.  */
1167
1168 void
1169 finish_eh_cleanup (tree cleanup)
1170 {
1171   tree r = build_stmt (CLEANUP_STMT, NULL_TREE, cleanup);
1172   CLEANUP_EH_ONLY (r) = 1;
1173   add_stmt (r);
1174 }
1175
1176 /* The MEM_INITS is a list of mem-initializers, in reverse of the
1177    order they were written by the user.  Each node is as for
1178    emit_mem_initializers.  */
1179
1180 void
1181 finish_mem_initializers (tree mem_inits)
1182 {
1183   /* Reorder the MEM_INITS so that they are in the order they appeared
1184      in the source program.  */
1185   mem_inits = nreverse (mem_inits);
1186
1187   if (processing_template_decl)
1188     add_stmt (build_min_nt (CTOR_INITIALIZER, mem_inits));
1189   else
1190     emit_mem_initializers (mem_inits);
1191 }
1192
1193 /* Returns the stack of SCOPE_STMTs for the current function.  */
1194
1195 tree *
1196 current_scope_stmt_stack (void)
1197 {
1198   return &cfun->language->base.x_scope_stmt_stack;
1199 }
1200
1201 /* Finish a parenthesized expression EXPR.  */
1202
1203 tree
1204 finish_parenthesized_expr (tree expr)
1205 {
1206   if (IS_EXPR_CODE_CLASS (TREE_CODE_CLASS (TREE_CODE (expr))))
1207     /* This inhibits warnings in c_common_truthvalue_conversion.  */
1208     C_SET_EXP_ORIGINAL_CODE (expr, ERROR_MARK); 
1209
1210   if (TREE_CODE (expr) == OFFSET_REF)
1211     /* [expr.unary.op]/3 The qualified id of a pointer-to-member must not be
1212        enclosed in parentheses.  */
1213     PTRMEM_OK_P (expr) = 0;
1214   return expr;
1215 }
1216
1217 /* Finish a reference to a non-static data member (DECL) that is not
1218    preceded by `.' or `->'.  */
1219
1220 tree
1221 finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
1222 {
1223   my_friendly_assert (TREE_CODE (decl) == FIELD_DECL, 20020909);
1224
1225   if (!object)
1226     {
1227       if (current_function_decl 
1228           && DECL_STATIC_FUNCTION_P (current_function_decl))
1229         cp_error_at ("invalid use of member `%D' in static member function",
1230                      decl);
1231       else
1232         cp_error_at ("invalid use of non-static data member `%D'", decl);
1233       error ("from this location");
1234
1235       return error_mark_node;
1236     }
1237   TREE_USED (current_class_ptr) = 1;
1238   if (processing_template_decl)
1239     {
1240       tree type = TREE_TYPE (decl);
1241
1242       if (TREE_CODE (type) == REFERENCE_TYPE)
1243         type = TREE_TYPE (type);
1244       else
1245         {
1246           /* Set the cv qualifiers */
1247           int quals = cp_type_quals (TREE_TYPE (current_class_ref));
1248           
1249           if (DECL_MUTABLE_P (decl))
1250             quals &= ~TYPE_QUAL_CONST;
1251
1252           quals |= cp_type_quals (TREE_TYPE (decl));
1253           type = cp_build_qualified_type (type, quals);
1254         }
1255       
1256       return build_min (COMPONENT_REF, type, object, decl);
1257     }
1258   else
1259     {
1260       tree access_type = TREE_TYPE (object);
1261       tree lookup_context = context_for_name_lookup (decl);
1262       
1263       while (!DERIVED_FROM_P (lookup_context, access_type))
1264         {
1265           access_type = TYPE_CONTEXT (access_type);
1266           while (access_type && DECL_P (access_type))
1267             access_type = DECL_CONTEXT (access_type);
1268
1269           if (!access_type)
1270             {
1271               cp_error_at ("object missing in reference to `%D'", decl);
1272               error ("from this location");
1273               return error_mark_node;
1274             }
1275         }
1276
1277       perform_or_defer_access_check (TYPE_BINFO (access_type), decl);
1278
1279       /* If the data member was named `C::M', convert `*this' to `C'
1280          first.  */
1281       if (qualifying_scope)
1282         {
1283           tree binfo = NULL_TREE;
1284           object = build_scoped_ref (object, qualifying_scope,
1285                                      &binfo);
1286         }
1287
1288       return build_class_member_access_expr (object, decl,
1289                                              /*access_path=*/NULL_TREE,
1290                                              /*preserve_reference=*/false);
1291     }
1292 }
1293
1294 /* DECL was the declaration to which a qualified-id resolved.  Issue
1295    an error message if it is not accessible.  If OBJECT_TYPE is
1296    non-NULL, we have just seen `x->' or `x.' and OBJECT_TYPE is the
1297    type of `*x', or `x', respectively.  If the DECL was named as
1298    `A::B' then NESTED_NAME_SPECIFIER is `A'.  */
1299
1300 void
1301 check_accessibility_of_qualified_id (tree decl, 
1302                                      tree object_type, 
1303                                      tree nested_name_specifier)
1304 {
1305   tree scope;
1306   tree qualifying_type = NULL_TREE;
1307   
1308   /* Determine the SCOPE of DECL.  */
1309   scope = context_for_name_lookup (decl);
1310   /* If the SCOPE is not a type, then DECL is not a member.  */
1311   if (!TYPE_P (scope))
1312     return;
1313   /* Compute the scope through which DECL is being accessed.  */
1314   if (object_type 
1315       /* OBJECT_TYPE might not be a class type; consider:
1316
1317            class A { typedef int I; };
1318            I *p;
1319            p->A::I::~I();
1320
1321          In this case, we will have "A::I" as the DECL, but "I" as the
1322          OBJECT_TYPE.  */
1323       && CLASS_TYPE_P (object_type)
1324       && DERIVED_FROM_P (scope, object_type))
1325     /* If we are processing a `->' or `.' expression, use the type of the
1326        left-hand side.  */
1327     qualifying_type = object_type;
1328   else if (nested_name_specifier)
1329     {
1330       /* If the reference is to a non-static member of the
1331          current class, treat it as if it were referenced through
1332          `this'.  */
1333       if (DECL_NONSTATIC_MEMBER_P (decl)
1334           && current_class_ptr
1335           && DERIVED_FROM_P (scope, current_class_type))
1336         qualifying_type = current_class_type;
1337       /* Otherwise, use the type indicated by the
1338          nested-name-specifier.  */
1339       else
1340         qualifying_type = nested_name_specifier;
1341     }
1342   else
1343     /* Otherwise, the name must be from the current class or one of
1344        its bases.  */
1345     qualifying_type = currently_open_derived_class (scope);
1346
1347   if (qualifying_type)
1348     perform_or_defer_access_check (TYPE_BINFO (qualifying_type), decl);
1349 }
1350
1351 /* EXPR is the result of a qualified-id.  The QUALIFYING_CLASS was the
1352    class named to the left of the "::" operator.  DONE is true if this
1353    expression is a complete postfix-expression; it is false if this
1354    expression is followed by '->', '[', '(', etc.  ADDRESS_P is true
1355    iff this expression is the operand of '&'.  */
1356
1357 tree
1358 finish_qualified_id_expr (tree qualifying_class, tree expr, bool done,
1359                           bool address_p)
1360 {
1361   if (error_operand_p (expr))
1362     return error_mark_node;
1363
1364   /* If EXPR occurs as the operand of '&', use special handling that
1365      permits a pointer-to-member.  */
1366   if (address_p && done)
1367     {
1368       if (TREE_CODE (expr) == SCOPE_REF)
1369         expr = TREE_OPERAND (expr, 1);
1370       expr = build_offset_ref (qualifying_class, expr, 
1371                                /*address_p=*/true);
1372       return expr;
1373     }
1374
1375   if (TREE_CODE (expr) == FIELD_DECL)
1376     expr = finish_non_static_data_member (expr, current_class_ref,
1377                                           qualifying_class);
1378   else if (BASELINK_P (expr) && !processing_template_decl)
1379     {
1380       tree fn;
1381       tree fns;
1382
1383       /* See if any of the functions are non-static members.  */
1384       fns = BASELINK_FUNCTIONS (expr);
1385       if (TREE_CODE (fns) == TEMPLATE_ID_EXPR)
1386         fns = TREE_OPERAND (fns, 0);
1387       for (fn = fns; fn; fn = OVL_NEXT (fn))
1388         if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
1389           break;
1390       /* If so, the expression may be relative to the current
1391          class.  */
1392       if (fn && current_class_type 
1393           && DERIVED_FROM_P (qualifying_class, current_class_type))
1394         expr = (build_class_member_access_expr 
1395                 (maybe_dummy_object (qualifying_class, NULL),
1396                  expr,
1397                  BASELINK_ACCESS_BINFO (expr),
1398                  /*preserve_reference=*/false));
1399       else if (done)
1400         /* The expression is a qualified name whose address is not
1401            being taken.  */
1402         expr = build_offset_ref (qualifying_class, expr, /*address_p=*/false);
1403     }
1404
1405   return expr;
1406 }
1407
1408 /* Begin a statement-expression.  The value returned must be passed to
1409    finish_stmt_expr.  */
1410
1411 tree 
1412 begin_stmt_expr (void)
1413 {
1414   /* If we're outside a function, we won't have a statement-tree to
1415      work with.  But, if we see a statement-expression we need to
1416      create one.  */
1417   if (! cfun && !last_tree)
1418     begin_stmt_tree (&scope_chain->x_saved_tree);
1419
1420   keep_next_level (1);
1421   /* If we're building a statement tree, then the upcoming compound
1422      statement will be chained onto the tree structure, starting at
1423      last_tree.  We return last_tree so that we can later unhook the
1424      compound statement.  */
1425   return last_tree; 
1426 }
1427
1428 /* Finish a statement-expression.  RTL_EXPR should be the value
1429    returned by the previous begin_stmt_expr; EXPR is the
1430    statement-expression.  Returns an expression representing the
1431    statement-expression.  */
1432
1433 tree 
1434 finish_stmt_expr (tree rtl_expr)
1435 {
1436   tree result;
1437
1438   /* If the last thing in the statement-expression was not an
1439      expression-statement, then it has type `void'.  In a template, we
1440      cannot distinguish the case where the last expression-statement
1441      had a dependent type from the case where the last statement was
1442      not an expression-statement.  Therefore, we (incorrectly) treat
1443      the STMT_EXPR as dependent in that case.  */
1444   if (!last_expr_type && !processing_template_decl)
1445     last_expr_type = void_type_node;
1446   result = build_min (STMT_EXPR, last_expr_type, last_tree);
1447   TREE_SIDE_EFFECTS (result) = 1;
1448   
1449   /* Remove the compound statement from the tree structure; it is
1450      now saved in the STMT_EXPR.  */
1451   last_tree = rtl_expr;
1452   TREE_CHAIN (last_tree) = NULL_TREE;
1453
1454   /* If we created a statement-tree for this statement-expression,
1455      remove it now.  */ 
1456   if (! cfun
1457       && TREE_CHAIN (scope_chain->x_saved_tree) == NULL_TREE)
1458     finish_stmt_tree (&scope_chain->x_saved_tree);
1459
1460   return result;
1461 }
1462
1463 /* Perform Koenig lookup.  FN is the postfix-expression representing
1464    the call; ARGS are the arguments to the call.  Returns the
1465    functions to be considered by overload resolution.  */
1466
1467 tree
1468 perform_koenig_lookup (tree fn, tree args)
1469 {
1470   tree identifier = NULL_TREE;
1471   tree functions = NULL_TREE;
1472
1473   /* Find the name of the overloaded function.  */
1474   if (TREE_CODE (fn) == IDENTIFIER_NODE)
1475     identifier = fn;
1476   else if (is_overloaded_fn (fn))
1477     {
1478       functions = fn;
1479       identifier = DECL_NAME (get_first_fn (functions));
1480     }
1481   else if (DECL_P (fn))
1482     {
1483       functions = fn;
1484       identifier = DECL_NAME (fn);
1485     }
1486
1487   /* A call to a namespace-scope function using an unqualified name.
1488
1489      Do Koenig lookup -- unless any of the arguments are
1490      type-dependent.  */
1491   if (!any_type_dependent_arguments_p (args))
1492     {
1493       fn = lookup_arg_dependent (identifier, functions, args);
1494       if (!fn)
1495         /* The unqualified name could not be resolved.  */
1496         fn = unqualified_fn_lookup_error (identifier);
1497     }
1498   else
1499     fn = identifier;
1500
1501   return fn;
1502 }
1503
1504 /* Generate an expression for `FN (ARGS)'.
1505
1506    If DISALLOW_VIRTUAL is true, the call to FN will be not generated
1507    as a virtual call, even if FN is virtual.  (This flag is set when
1508    encountering an expression where the function name is explicitly
1509    qualified.  For example a call to `X::f' never generates a virtual
1510    call.)
1511
1512    Returns code for the call.  */
1513
1514 tree 
1515 finish_call_expr (tree fn, tree args, bool disallow_virtual)
1516 {
1517   tree result;
1518   tree orig_fn;
1519   tree orig_args;
1520
1521   if (fn == error_mark_node || args == error_mark_node)
1522     return error_mark_node;
1523
1524   /* ARGS should be a list of arguments.  */
1525   my_friendly_assert (!args || TREE_CODE (args) == TREE_LIST,
1526                       20020712);
1527
1528   orig_fn = fn;
1529   orig_args = args;
1530
1531   if (processing_template_decl)
1532     {
1533       if (type_dependent_expression_p (fn)
1534           || any_type_dependent_arguments_p (args))
1535         return build_nt (CALL_EXPR, fn, args);
1536       if (!BASELINK_P (fn)
1537           && TREE_CODE (fn) != PSEUDO_DTOR_EXPR
1538           && TREE_TYPE (fn) != unknown_type_node)
1539         fn = build_non_dependent_expr (fn);
1540       args = build_non_dependent_args (orig_args);
1541     }
1542
1543   /* A reference to a member function will appear as an overloaded
1544      function (rather than a BASELINK) if an unqualified name was used
1545      to refer to it.  */
1546   if (!BASELINK_P (fn) && is_overloaded_fn (fn))
1547     {
1548       tree f;
1549
1550       if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
1551         f = get_first_fn (TREE_OPERAND (fn, 0));
1552       else
1553         f = get_first_fn (fn);
1554       if (DECL_FUNCTION_MEMBER_P (f))
1555         {
1556           tree type = currently_open_derived_class (DECL_CONTEXT (f));
1557           fn = build_baselink (TYPE_BINFO (type),
1558                                TYPE_BINFO (type),
1559                                fn, /*optype=*/NULL_TREE);
1560         }
1561     }
1562
1563   result = NULL_TREE;
1564   if (BASELINK_P (fn))
1565     {
1566       tree object;
1567
1568       /* A call to a member function.  From [over.call.func]:
1569
1570            If the keyword this is in scope and refers to the class of
1571            that member function, or a derived class thereof, then the
1572            function call is transformed into a qualified function call
1573            using (*this) as the postfix-expression to the left of the
1574            . operator.... [Otherwise] a contrived object of type T
1575            becomes the implied object argument.  
1576
1577         This paragraph is unclear about this situation:
1578
1579           struct A { void f(); };
1580           struct B : public A {};
1581           struct C : public A { void g() { B::f(); }};
1582
1583         In particular, for `B::f', this paragraph does not make clear
1584         whether "the class of that member function" refers to `A' or 
1585         to `B'.  We believe it refers to `B'.  */
1586       if (current_class_type 
1587           && DERIVED_FROM_P (BINFO_TYPE (BASELINK_ACCESS_BINFO (fn)),
1588                              current_class_type)
1589           && current_class_ref)
1590         object = maybe_dummy_object (BINFO_TYPE (BASELINK_ACCESS_BINFO (fn)),
1591                                      NULL);
1592       else
1593         {
1594           tree representative_fn;
1595
1596           representative_fn = BASELINK_FUNCTIONS (fn);
1597           if (TREE_CODE (representative_fn) == TEMPLATE_ID_EXPR)
1598             representative_fn = TREE_OPERAND (representative_fn, 0);
1599           representative_fn = get_first_fn (representative_fn);
1600           object = build_dummy_object (DECL_CONTEXT (representative_fn));
1601         }
1602
1603       if (processing_template_decl)
1604         {
1605           if (type_dependent_expression_p (object))
1606             return build_nt (CALL_EXPR, orig_fn, orig_args);
1607           object = build_non_dependent_expr (object);
1608         }
1609
1610       result = build_new_method_call (object, fn, args, NULL_TREE,
1611                                       (disallow_virtual 
1612                                        ? LOOKUP_NONVIRTUAL : 0));
1613     }
1614   else if (is_overloaded_fn (fn))
1615     /* A call to a namespace-scope function.  */
1616     result = build_new_function_call (fn, args);
1617   else if (TREE_CODE (fn) == PSEUDO_DTOR_EXPR)
1618     {
1619       if (args)
1620         error ("arguments to destructor are not allowed");
1621       /* Mark the pseudo-destructor call as having side-effects so
1622          that we do not issue warnings about its use.  */
1623       result = build1 (NOP_EXPR,
1624                        void_type_node,
1625                        TREE_OPERAND (fn, 0));
1626       TREE_SIDE_EFFECTS (result) = 1;
1627     }
1628   else if (CLASS_TYPE_P (TREE_TYPE (fn)))
1629     /* If the "function" is really an object of class type, it might
1630        have an overloaded `operator ()'.  */
1631     result = build_new_op (CALL_EXPR, LOOKUP_NORMAL, fn, args, NULL_TREE);
1632   if (!result)
1633     /* A call where the function is unknown.  */
1634     result = build_function_call (fn, args);
1635
1636   if (processing_template_decl)
1637     return build (CALL_EXPR, TREE_TYPE (result), orig_fn, orig_args);
1638   return result;
1639 }
1640
1641 /* Finish a call to a postfix increment or decrement or EXPR.  (Which
1642    is indicated by CODE, which should be POSTINCREMENT_EXPR or
1643    POSTDECREMENT_EXPR.)  */
1644
1645 tree 
1646 finish_increment_expr (tree expr, enum tree_code code)
1647 {
1648   return build_x_unary_op (code, expr);  
1649 }
1650
1651 /* Finish a use of `this'.  Returns an expression for `this'.  */
1652
1653 tree 
1654 finish_this_expr (void)
1655 {
1656   tree result;
1657
1658   if (current_class_ptr)
1659     {
1660       result = current_class_ptr;
1661     }
1662   else if (current_function_decl
1663            && DECL_STATIC_FUNCTION_P (current_function_decl))
1664     {
1665       error ("`this' is unavailable for static member functions");
1666       result = error_mark_node;
1667     }
1668   else
1669     {
1670       if (current_function_decl)
1671         error ("invalid use of `this' in non-member function");
1672       else
1673         error ("invalid use of `this' at top level");
1674       result = error_mark_node;
1675     }
1676
1677   return result;
1678 }
1679
1680 /* Finish a member function call using OBJECT and ARGS as arguments to
1681    FN.  Returns an expression for the call.  */
1682
1683 tree 
1684 finish_object_call_expr (tree fn, tree object, tree args)
1685 {
1686   if (DECL_DECLARES_TYPE_P (fn))
1687     {
1688       if (processing_template_decl)
1689         /* This can happen on code like:
1690
1691            class X;
1692            template <class T> void f(T t) {
1693              t.X();
1694            }  
1695
1696            We just grab the underlying IDENTIFIER.  */
1697         fn = DECL_NAME (fn);
1698       else
1699         {
1700           error ("calling type `%T' like a method", fn);
1701           return error_mark_node;
1702         }
1703     }
1704   
1705   if (processing_template_decl)
1706     return build_nt (CALL_EXPR,
1707                      build_nt (COMPONENT_REF, object, fn),
1708                      args);
1709
1710   if (name_p (fn))
1711     return build_method_call (object, fn, args, NULL_TREE, LOOKUP_NORMAL);
1712   else
1713     return build_new_method_call (object, fn, args, NULL_TREE, LOOKUP_NORMAL);
1714 }
1715
1716 /* Finish a pseudo-destructor expression.  If SCOPE is NULL, the
1717    expression was of the form `OBJECT.~DESTRUCTOR' where DESTRUCTOR is
1718    the TYPE for the type given.  If SCOPE is non-NULL, the expression
1719    was of the form `OBJECT.SCOPE::~DESTRUCTOR'.  */
1720
1721 tree 
1722 finish_pseudo_destructor_expr (tree object, tree scope, tree destructor)
1723 {
1724   if (destructor == error_mark_node)
1725     return error_mark_node;
1726
1727   my_friendly_assert (TYPE_P (destructor), 20010905);
1728
1729   if (!processing_template_decl)
1730     {
1731       if (scope == error_mark_node)
1732         {
1733           error ("invalid qualifying scope in pseudo-destructor name");
1734           return error_mark_node;
1735         }
1736       
1737       if (!same_type_p (TREE_TYPE (object), destructor))
1738         {
1739           error ("`%E' is not of type `%T'", object, destructor);
1740           return error_mark_node;
1741         }
1742     }
1743
1744   return build (PSEUDO_DTOR_EXPR, void_type_node, object, scope, destructor);
1745 }
1746
1747 /* Finish an expression of the form CODE EXPR.  */
1748
1749 tree
1750 finish_unary_op_expr (enum tree_code code, tree expr)
1751 {
1752   tree result = build_x_unary_op (code, expr);
1753   /* Inside a template, build_x_unary_op does not fold the
1754      expression. So check whether the result is folded before
1755      setting TREE_NEGATED_INT.  */
1756   if (code == NEGATE_EXPR && TREE_CODE (expr) == INTEGER_CST
1757       && TREE_CODE (result) == INTEGER_CST
1758       && !TREE_UNSIGNED (TREE_TYPE (result))
1759       && INT_CST_LT (result, integer_zero_node))
1760     TREE_NEGATED_INT (result) = 1;
1761   overflow_warning (result);
1762   return result;
1763 }
1764
1765 /* Finish a compound-literal expression.  TYPE is the type to which
1766    the INITIALIZER_LIST is being cast.  */
1767
1768 tree
1769 finish_compound_literal (tree type, tree initializer_list)
1770 {
1771   tree compound_literal;
1772
1773   /* Build a CONSTRUCTOR for the INITIALIZER_LIST.  */
1774   compound_literal = build_constructor (NULL_TREE, initializer_list);
1775   /* Mark it as a compound-literal.  */
1776   TREE_HAS_CONSTRUCTOR (compound_literal) = 1;
1777   if (processing_template_decl)
1778     TREE_TYPE (compound_literal) = type;
1779   else
1780     {
1781       /* Check the initialization.  */
1782       compound_literal = digest_init (type, compound_literal, NULL);
1783       /* If the TYPE was an array type with an unknown bound, then we can
1784          figure out the dimension now.  For example, something like:
1785
1786            `(int []) { 2, 3 }'
1787
1788          implies that the array has two elements.  */
1789       if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
1790         complete_array_type (type, compound_literal, 1);
1791     }
1792
1793   return compound_literal;
1794 }
1795
1796 /* Return the declaration for the function-name variable indicated by
1797    ID.  */
1798
1799 tree
1800 finish_fname (tree id)
1801 {
1802   tree decl;
1803   
1804   decl = fname_decl (C_RID_CODE (id), id);
1805   if (processing_template_decl)
1806     decl = DECL_NAME (decl);
1807   return decl;
1808 }
1809
1810 /* Begin a function definition declared with DECL_SPECS, ATTRIBUTES,
1811    and DECLARATOR.  Returns nonzero if the function-declaration is
1812    valid.  */
1813
1814 int
1815 begin_function_definition (tree decl_specs, tree attributes, tree declarator)
1816 {
1817   if (!start_function (decl_specs, declarator, attributes, SF_DEFAULT))
1818     return 0;
1819
1820   /* The things we're about to see are not directly qualified by any
1821      template headers we've seen thus far.  */
1822   reset_specialization ();
1823
1824   return 1;
1825 }
1826
1827 /* Finish a translation unit.  */
1828
1829 void 
1830 finish_translation_unit (void)
1831 {
1832   /* In case there were missing closebraces,
1833      get us back to the global binding level.  */
1834   pop_everything ();
1835   while (current_namespace != global_namespace)
1836     pop_namespace ();
1837
1838   /* Do file scope __FUNCTION__ et al.  */
1839   finish_fname_decls ();
1840 }
1841
1842 /* Finish a template type parameter, specified as AGGR IDENTIFIER.
1843    Returns the parameter.  */
1844
1845 tree 
1846 finish_template_type_parm (tree aggr, tree identifier)
1847 {
1848   if (aggr != class_type_node)
1849     {
1850       pedwarn ("template type parameters must use the keyword `class' or `typename'");
1851       aggr = class_type_node;
1852     }
1853
1854   return build_tree_list (aggr, identifier);
1855 }
1856
1857 /* Finish a template template parameter, specified as AGGR IDENTIFIER.
1858    Returns the parameter.  */
1859
1860 tree 
1861 finish_template_template_parm (tree aggr, tree identifier)
1862 {
1863   tree decl = build_decl (TYPE_DECL, identifier, NULL_TREE);
1864   tree tmpl = build_lang_decl (TEMPLATE_DECL, identifier, NULL_TREE);
1865   DECL_TEMPLATE_PARMS (tmpl) = current_template_parms;
1866   DECL_TEMPLATE_RESULT (tmpl) = decl;
1867   DECL_ARTIFICIAL (decl) = 1;
1868   end_template_decl ();
1869
1870   my_friendly_assert (DECL_TEMPLATE_PARMS (tmpl), 20010110);
1871
1872   return finish_template_type_parm (aggr, tmpl);
1873 }
1874
1875 /* ARGUMENT is the default-argument value for a template template
1876    parameter.  If ARGUMENT is invalid, issue error messages and return
1877    the ERROR_MARK_NODE.  Otherwise, ARGUMENT itself is returned.  */
1878
1879 tree
1880 check_template_template_default_arg (tree argument)
1881 {
1882   if (TREE_CODE (argument) != TEMPLATE_DECL
1883       && TREE_CODE (argument) != TEMPLATE_TEMPLATE_PARM
1884       && TREE_CODE (argument) != TYPE_DECL
1885       && TREE_CODE (argument) != UNBOUND_CLASS_TEMPLATE)
1886     {
1887       error ("invalid default template argument");
1888       return error_mark_node;
1889     }
1890
1891   return argument;
1892 }
1893
1894 /* Finish a parameter list, indicated by PARMS.  If ELLIPSIS is
1895    nonzero, the parameter list was terminated by a `...'.  */
1896
1897 tree
1898 finish_parmlist (tree parms, int ellipsis)
1899 {
1900   if (parms)
1901     {
1902       /* We mark the PARMS as a parmlist so that declarator processing can
1903          disambiguate certain constructs.  */
1904       TREE_PARMLIST (parms) = 1;
1905       /* We do not append void_list_node here, but leave it to grokparms
1906          to do that.  */
1907       PARMLIST_ELLIPSIS_P (parms) = ellipsis;
1908     }
1909   return parms;
1910 }
1911
1912 /* Begin a class definition, as indicated by T.  */
1913
1914 tree
1915 begin_class_definition (tree t)
1916 {
1917   if (t == error_mark_node)
1918     return error_mark_node;
1919
1920   if (processing_template_parmlist)
1921     {
1922       error ("definition of `%#T' inside template parameter list", t);
1923       return error_mark_node;
1924     }
1925   /* A non-implicit typename comes from code like:
1926
1927        template <typename T> struct A {
1928          template <typename U> struct A<T>::B ...
1929
1930      This is erroneous.  */
1931   else if (TREE_CODE (t) == TYPENAME_TYPE)
1932     {
1933       error ("invalid definition of qualified type `%T'", t);
1934       t = error_mark_node;
1935     }
1936
1937   if (t == error_mark_node || ! IS_AGGR_TYPE (t))
1938     {
1939       t = make_aggr_type (RECORD_TYPE);
1940       pushtag (make_anon_name (), t, 0);
1941     }
1942
1943   /* If this type was already complete, and we see another definition,
1944      that's an error.  */
1945   if (COMPLETE_TYPE_P (t))
1946     {
1947       error ("redefinition of `%#T'", t);
1948       cp_error_at ("previous definition of `%#T'", t);
1949       return error_mark_node;
1950     }
1951
1952   /* Update the location of the decl.  */
1953   DECL_SOURCE_LOCATION (TYPE_NAME (t)) = input_location;
1954   
1955   if (TYPE_BEING_DEFINED (t))
1956     {
1957       t = make_aggr_type (TREE_CODE (t));
1958       pushtag (TYPE_IDENTIFIER (t), t, 0);
1959     }
1960   maybe_process_partial_specialization (t);
1961   pushclass (t, true);
1962   TYPE_BEING_DEFINED (t) = 1;
1963   TYPE_PACKED (t) = flag_pack_struct;
1964   /* Reset the interface data, at the earliest possible
1965      moment, as it might have been set via a class foo;
1966      before.  */
1967   if (! TYPE_ANONYMOUS_P (t))
1968     {
1969       CLASSTYPE_INTERFACE_ONLY (t) = interface_only;
1970       SET_CLASSTYPE_INTERFACE_UNKNOWN_X
1971         (t, interface_unknown);
1972     }
1973   reset_specialization();
1974   
1975   /* Make a declaration for this class in its own scope.  */
1976   build_self_reference ();
1977
1978   return t;
1979 }
1980
1981 /* Finish the member declaration given by DECL.  */
1982
1983 void
1984 finish_member_declaration (tree decl)
1985 {
1986   if (decl == error_mark_node || decl == NULL_TREE)
1987     return;
1988
1989   if (decl == void_type_node)
1990     /* The COMPONENT was a friend, not a member, and so there's
1991        nothing for us to do.  */
1992     return;
1993
1994   /* We should see only one DECL at a time.  */
1995   my_friendly_assert (TREE_CHAIN (decl) == NULL_TREE, 0);
1996
1997   /* Set up access control for DECL.  */
1998   TREE_PRIVATE (decl) 
1999     = (current_access_specifier == access_private_node);
2000   TREE_PROTECTED (decl) 
2001     = (current_access_specifier == access_protected_node);
2002   if (TREE_CODE (decl) == TEMPLATE_DECL)
2003     {
2004       TREE_PRIVATE (DECL_TEMPLATE_RESULT (decl)) = TREE_PRIVATE (decl);
2005       TREE_PROTECTED (DECL_TEMPLATE_RESULT (decl)) = TREE_PROTECTED (decl);
2006     }
2007
2008   /* Mark the DECL as a member of the current class.  */
2009   DECL_CONTEXT (decl) = current_class_type;
2010
2011   /* [dcl.link]
2012
2013      A C language linkage is ignored for the names of class members
2014      and the member function type of class member functions.  */
2015   if (DECL_LANG_SPECIFIC (decl) && DECL_LANGUAGE (decl) == lang_c)
2016     SET_DECL_LANGUAGE (decl, lang_cplusplus);
2017
2018   /* Put functions on the TYPE_METHODS list and everything else on the
2019      TYPE_FIELDS list.  Note that these are built up in reverse order.
2020      We reverse them (to obtain declaration order) in finish_struct.  */
2021   if (TREE_CODE (decl) == FUNCTION_DECL 
2022       || DECL_FUNCTION_TEMPLATE_P (decl))
2023     {
2024       /* We also need to add this function to the
2025          CLASSTYPE_METHOD_VEC.  */
2026       add_method (current_class_type, decl, /*error_p=*/0);
2027
2028       TREE_CHAIN (decl) = TYPE_METHODS (current_class_type);
2029       TYPE_METHODS (current_class_type) = decl;
2030
2031       maybe_add_class_template_decl_list (current_class_type, decl, 
2032                                           /*friend_p=*/0);
2033     }
2034   /* Enter the DECL into the scope of the class.  */
2035   else if (TREE_CODE (decl) == USING_DECL || pushdecl_class_level (decl))
2036     {
2037       /* All TYPE_DECLs go at the end of TYPE_FIELDS.  Ordinary fields
2038          go at the beginning.  The reason is that lookup_field_1
2039          searches the list in order, and we want a field name to
2040          override a type name so that the "struct stat hack" will
2041          work.  In particular:
2042
2043            struct S { enum E { }; int E } s;
2044            s.E = 3;
2045
2046          is valid.  In addition, the FIELD_DECLs must be maintained in
2047          declaration order so that class layout works as expected.
2048          However, we don't need that order until class layout, so we
2049          save a little time by putting FIELD_DECLs on in reverse order
2050          here, and then reversing them in finish_struct_1.  (We could
2051          also keep a pointer to the correct insertion points in the
2052          list.)  */
2053
2054       if (TREE_CODE (decl) == TYPE_DECL)
2055         TYPE_FIELDS (current_class_type) 
2056           = chainon (TYPE_FIELDS (current_class_type), decl);
2057       else
2058         {
2059           TREE_CHAIN (decl) = TYPE_FIELDS (current_class_type);
2060           TYPE_FIELDS (current_class_type) = decl;
2061         }
2062
2063       maybe_add_class_template_decl_list (current_class_type, decl, 
2064                                           /*friend_p=*/0);
2065     }
2066 }
2067
2068 /* Finish a class definition T with the indicate ATTRIBUTES.  If SEMI,
2069    the definition is immediately followed by a semicolon.  Returns the
2070    type.  */
2071
2072 tree
2073 finish_class_definition (tree t, tree attributes, int semi, int pop_scope_p)
2074 {
2075   if (t == error_mark_node)
2076     return error_mark_node;
2077
2078   /* finish_struct nukes this anyway; if finish_exception does too,
2079      then it can go.  */
2080   if (semi)
2081     note_got_semicolon (t);
2082
2083   /* If we got any attributes in class_head, xref_tag will stick them in
2084      TREE_TYPE of the type.  Grab them now.  */
2085   attributes = chainon (TYPE_ATTRIBUTES (t), attributes);
2086   TYPE_ATTRIBUTES (t) = NULL_TREE;
2087
2088   if (TREE_CODE (t) == ENUMERAL_TYPE)
2089     ;
2090   else
2091     {
2092       t = finish_struct (t, attributes);
2093       if (semi) 
2094         note_got_semicolon (t);
2095     }
2096
2097   if (pop_scope_p)
2098     pop_scope (CP_DECL_CONTEXT (TYPE_MAIN_DECL (t)));
2099
2100   return t;
2101 }
2102
2103 /* Finish processing the declaration of a member class template
2104    TYPES whose template parameters are given by PARMS.  */
2105
2106 tree
2107 finish_member_class_template (tree types)
2108 {
2109   tree t;
2110
2111   /* If there are declared, but undefined, partial specializations
2112      mixed in with the typespecs they will not yet have passed through
2113      maybe_process_partial_specialization, so we do that here.  */
2114   for (t = types; t != NULL_TREE; t = TREE_CHAIN (t))
2115     if (IS_AGGR_TYPE_CODE (TREE_CODE (TREE_VALUE (t))))
2116       maybe_process_partial_specialization (TREE_VALUE (t));
2117
2118   note_list_got_semicolon (types);
2119   grok_x_components (types);
2120   if (TYPE_CONTEXT (TREE_VALUE (types)) != current_class_type)
2121     /* The component was in fact a friend declaration.  We avoid
2122        finish_member_template_decl performing certain checks by
2123        unsetting TYPES.  */
2124     types = NULL_TREE;
2125   
2126   finish_member_template_decl (types);
2127
2128   /* As with other component type declarations, we do
2129      not store the new DECL on the list of
2130      component_decls.  */
2131   return NULL_TREE;
2132 }
2133
2134 /* Finish processing a complete template declaration.  The PARMS are
2135    the template parameters.  */
2136
2137 void
2138 finish_template_decl (tree parms)
2139 {
2140   if (parms)
2141     end_template_decl ();
2142   else
2143     end_specialization ();
2144 }
2145
2146 /* Finish processing a template-id (which names a type) of the form
2147    NAME < ARGS >.  Return the TYPE_DECL for the type named by the
2148    template-id.  If ENTERING_SCOPE is nonzero we are about to enter
2149    the scope of template-id indicated.  */
2150
2151 tree
2152 finish_template_type (tree name, tree args, int entering_scope)
2153 {
2154   tree decl;
2155
2156   decl = lookup_template_class (name, args,
2157                                 NULL_TREE, NULL_TREE, entering_scope,
2158                                 tf_error | tf_warning | tf_user);
2159   if (decl != error_mark_node)
2160     decl = TYPE_STUB_DECL (decl);
2161
2162   return decl;
2163 }
2164
2165 /* Finish processing a BASE_CLASS with the indicated ACCESS_SPECIFIER.
2166    Return a TREE_LIST containing the ACCESS_SPECIFIER and the
2167    BASE_CLASS, or NULL_TREE if an error occurred.  The
2168    ACCESS_SPECIFIER is one of
2169    access_{default,public,protected_private}[_virtual]_node.*/
2170
2171 tree 
2172 finish_base_specifier (tree base, tree access, bool virtual_p)
2173 {
2174   tree result;
2175
2176   if (base == error_mark_node)
2177     {
2178       error ("invalid base-class specification");
2179       result = NULL_TREE;
2180     }
2181   else if (! is_aggr_type (base, 1))
2182     result = NULL_TREE;
2183   else
2184     {
2185       if (cp_type_quals (base) != 0)
2186         {
2187           error ("base class `%T' has cv qualifiers", base);
2188           base = TYPE_MAIN_VARIANT (base);
2189         }
2190       result = build_tree_list (access, base);
2191       TREE_VIA_VIRTUAL (result) = virtual_p;
2192     }
2193
2194   return result;
2195 }
2196
2197 /* Called when multiple declarators are processed.  If that is not
2198    premitted in this context, an error is issued.  */
2199
2200 void
2201 check_multiple_declarators (void)
2202 {
2203   /* [temp]
2204      
2205      In a template-declaration, explicit specialization, or explicit
2206      instantiation the init-declarator-list in the declaration shall
2207      contain at most one declarator.  
2208
2209      We don't just use PROCESSING_TEMPLATE_DECL for the first
2210      condition since that would disallow the perfectly valid code, 
2211      like `template <class T> struct S { int i, j; };'.  */
2212   if (at_function_scope_p ())
2213     /* It's OK to write `template <class T> void f() { int i, j;}'.  */
2214     return;
2215      
2216   if (PROCESSING_REAL_TEMPLATE_DECL_P () 
2217       || processing_explicit_instantiation
2218       || processing_specialization)
2219     error ("multiple declarators in template declaration");
2220 }
2221
2222 /* Issue a diagnostic that NAME cannot be found in SCOPE.  */
2223
2224 void
2225 qualified_name_lookup_error (tree scope, tree name)
2226 {
2227   if (TYPE_P (scope))
2228     {
2229       if (!COMPLETE_TYPE_P (scope))
2230         error ("incomplete type `%T' used in nested name specifier", scope);
2231       else
2232         error ("`%D' is not a member of `%T'", name, scope);
2233     }
2234   else if (scope != global_namespace)
2235     error ("`%D' is not a member of `%D'", name, scope);
2236   else
2237     error ("`::%D' has not been declared", name);
2238 }
2239               
2240 /* ID_EXPRESSION is a representation of parsed, but unprocessed,
2241    id-expression.  (See cp_parser_id_expression for details.)  SCOPE,
2242    if non-NULL, is the type or namespace used to explicitly qualify
2243    ID_EXPRESSION.  DECL is the entity to which that name has been
2244    resolved.  
2245
2246    *CONSTANT_EXPRESSION_P is true if we are presently parsing a
2247    constant-expression.  In that case, *NON_CONSTANT_EXPRESSION_P will
2248    be set to true if this expression isn't permitted in a
2249    constant-expression, but it is otherwise not set by this function.
2250    *ALLOW_NON_CONSTANT_EXPRESSION_P is true if we are parsing a
2251    constant-expression, but a non-constant expression is also
2252    permissible.
2253
2254    If an error occurs, and it is the kind of error that might cause
2255    the parser to abort a tentative parse, *ERROR_MSG is filled in.  It
2256    is the caller's responsibility to issue the message.  *ERROR_MSG
2257    will be a string with static storage duration, so the caller need
2258    not "free" it.
2259
2260    Return an expression for the entity, after issuing appropriate
2261    diagnostics.  This function is also responsible for transforming a
2262    reference to a non-static member into a COMPONENT_REF that makes
2263    the use of "this" explicit.  
2264
2265    Upon return, *IDK will be filled in appropriately.  */
2266
2267 tree
2268 finish_id_expression (tree id_expression, 
2269                       tree decl,
2270                       tree scope,
2271                       cp_id_kind *idk,
2272                       tree *qualifying_class,
2273                       bool constant_expression_p,
2274                       bool allow_non_constant_expression_p,
2275                       bool *non_constant_expression_p,
2276                       const char **error_msg)
2277 {
2278   /* Initialize the output parameters.  */
2279   *idk = CP_ID_KIND_NONE;
2280   *error_msg = NULL;
2281
2282   if (id_expression == error_mark_node)
2283     return error_mark_node;
2284   /* If we have a template-id, then no further lookup is
2285      required.  If the template-id was for a template-class, we
2286      will sometimes have a TYPE_DECL at this point.  */
2287   else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
2288       || TREE_CODE (decl) == TYPE_DECL)
2289     ;
2290   /* Look up the name.  */
2291   else 
2292     {
2293       if (decl == error_mark_node)
2294         {
2295           /* Name lookup failed.  */
2296           if (scope && (!TYPE_P (scope) || !dependent_type_p (scope)))
2297             {
2298               /* Qualified name lookup failed, and the qualifying name
2299                  was not a dependent type.  That is always an
2300                  error.  */
2301               qualified_name_lookup_error (scope, id_expression);
2302               return error_mark_node;
2303             }
2304           else if (!scope)
2305             {
2306               /* It may be resolved via Koenig lookup.  */
2307               *idk = CP_ID_KIND_UNQUALIFIED;
2308               return id_expression;
2309             }
2310         }
2311       /* If DECL is a variable that would be out of scope under
2312          ANSI/ISO rules, but in scope in the ARM, name lookup
2313          will succeed.  Issue a diagnostic here.  */
2314       else
2315         decl = check_for_out_of_scope_variable (decl);
2316
2317       /* Remember that the name was used in the definition of
2318          the current class so that we can check later to see if
2319          the meaning would have been different after the class
2320          was entirely defined.  */
2321       if (!scope && decl != error_mark_node)
2322         maybe_note_name_used_in_class (id_expression, decl);
2323     }
2324
2325   /* If we didn't find anything, or what we found was a type,
2326      then this wasn't really an id-expression.  */
2327   if (TREE_CODE (decl) == TEMPLATE_DECL
2328       && !DECL_FUNCTION_TEMPLATE_P (decl))
2329     {
2330       *error_msg = "missing template arguments";
2331       return error_mark_node;
2332     }
2333   else if (TREE_CODE (decl) == TYPE_DECL
2334            || TREE_CODE (decl) == NAMESPACE_DECL)
2335     {
2336       *error_msg = "expected primary-expression";
2337       return error_mark_node;
2338     }
2339
2340   /* If the name resolved to a template parameter, there is no
2341      need to look it up again later.  Similarly, we resolve
2342      enumeration constants to their underlying values.  */
2343   if (TREE_CODE (decl) == CONST_DECL)
2344     {
2345       *idk = CP_ID_KIND_NONE;
2346       if (DECL_TEMPLATE_PARM_P (decl) || !processing_template_decl)
2347         return DECL_INITIAL (decl);
2348       return decl;
2349     }
2350   else
2351     {
2352       bool dependent_p;
2353
2354       /* If the declaration was explicitly qualified indicate
2355          that.  The semantics of `A::f(3)' are different than
2356          `f(3)' if `f' is virtual.  */
2357       *idk = (scope 
2358               ? CP_ID_KIND_QUALIFIED
2359               : (TREE_CODE (decl) == TEMPLATE_ID_EXPR
2360                  ? CP_ID_KIND_TEMPLATE_ID
2361                  : CP_ID_KIND_UNQUALIFIED));
2362
2363
2364       /* [temp.dep.expr]
2365
2366          An id-expression is type-dependent if it contains an
2367          identifier that was declared with a dependent type.
2368
2369          The standard is not very specific about an id-expression that
2370          names a set of overloaded functions.  What if some of them
2371          have dependent types and some of them do not?  Presumably,
2372          such a name should be treated as a dependent name.  */
2373       /* Assume the name is not dependent.  */
2374       dependent_p = false;
2375       if (!processing_template_decl)
2376         /* No names are dependent outside a template.  */
2377         ;
2378       /* A template-id where the name of the template was not resolved
2379          is definitely dependent.  */
2380       else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
2381                && (TREE_CODE (TREE_OPERAND (decl, 0)) 
2382                    == IDENTIFIER_NODE))
2383         dependent_p = true;
2384       /* For anything except an overloaded function, just check its
2385          type.  */
2386       else if (!is_overloaded_fn (decl))
2387         dependent_p 
2388           = dependent_type_p (TREE_TYPE (decl));
2389       /* For a set of overloaded functions, check each of the
2390          functions.  */
2391       else
2392         {
2393           tree fns = decl;
2394
2395           if (BASELINK_P (fns))
2396             fns = BASELINK_FUNCTIONS (fns);
2397
2398           /* For a template-id, check to see if the template
2399              arguments are dependent.  */
2400           if (TREE_CODE (fns) == TEMPLATE_ID_EXPR)
2401             {
2402               tree args = TREE_OPERAND (fns, 1);
2403               dependent_p = any_dependent_template_arguments_p (args);
2404               /* The functions are those referred to by the
2405                  template-id.  */
2406               fns = TREE_OPERAND (fns, 0);
2407             }
2408
2409           /* If there are no dependent template arguments, go through
2410              the overlaoded functions.  */
2411           while (fns && !dependent_p)
2412             {
2413               tree fn = OVL_CURRENT (fns);
2414
2415               /* Member functions of dependent classes are
2416                  dependent.  */
2417               if (TREE_CODE (fn) == FUNCTION_DECL
2418                   && type_dependent_expression_p (fn))
2419                 dependent_p = true;
2420               else if (TREE_CODE (fn) == TEMPLATE_DECL
2421                        && dependent_template_p (fn))
2422                 dependent_p = true;
2423
2424               fns = OVL_NEXT (fns);
2425             }
2426         }
2427
2428       /* If the name was dependent on a template parameter, we will
2429          resolve the name at instantiation time.  */
2430       if (dependent_p)
2431         {
2432           /* Create a SCOPE_REF for qualified names, if the scope is
2433              dependent.  */
2434           if (scope)
2435             {
2436               if (TYPE_P (scope))
2437                 *qualifying_class = scope;
2438               /* Since this name was dependent, the expression isn't
2439                  constant -- yet.  No error is issued because it might
2440                  be constant when things are instantiated.  */
2441               if (constant_expression_p)
2442                 *non_constant_expression_p = true;
2443               if (TYPE_P (scope) && dependent_type_p (scope))
2444                 return build_nt (SCOPE_REF, scope, id_expression);
2445               else if (TYPE_P (scope) && DECL_P (decl))
2446                 return build (SCOPE_REF, TREE_TYPE (decl), scope,
2447                               id_expression);
2448               else
2449                 return decl;
2450             }
2451           /* A TEMPLATE_ID already contains all the information we
2452              need.  */
2453           if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR)
2454             return id_expression;
2455           /* Since this name was dependent, the expression isn't
2456              constant -- yet.  No error is issued because it might be
2457              constant when things are instantiated.  */
2458           if (constant_expression_p)
2459             *non_constant_expression_p = true;
2460           *idk = CP_ID_KIND_UNQUALIFIED_DEPENDENT;
2461           return id_expression;
2462         }
2463
2464       /* Only certain kinds of names are allowed in constant
2465          expression.  Enumerators have already been handled above.  */
2466       if (constant_expression_p)
2467         {
2468           /* Non-type template parameters of integral or enumeration
2469              type are OK.  */
2470           if (TREE_CODE (decl) == TEMPLATE_PARM_INDEX
2471               && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (decl)))
2472           ;
2473           /* Const variables or static data members of integral or
2474              enumeration types initialized with constant expressions
2475              are OK.  */
2476           else if (TREE_CODE (decl) == VAR_DECL
2477                    && CP_TYPE_CONST_P (TREE_TYPE (decl))
2478                    && INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (decl))
2479                    && DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
2480             ;
2481           else
2482             {
2483               if (!allow_non_constant_expression_p)
2484                 {
2485                   error ("`%D' cannot appear in a constant-expression", decl);
2486                   return error_mark_node;
2487                 }
2488               *non_constant_expression_p = true;
2489             }
2490         }
2491
2492       if (scope)
2493         {
2494           decl = (adjust_result_of_qualified_name_lookup 
2495                   (decl, scope, current_class_type));
2496           if (TREE_CODE (decl) == FIELD_DECL || BASELINK_P (decl))
2497             *qualifying_class = scope;
2498           else if (!processing_template_decl)
2499             decl = convert_from_reference (decl);
2500           else if (TYPE_P (scope))
2501             decl = build (SCOPE_REF, TREE_TYPE (decl), scope, decl);
2502         }
2503       else if (TREE_CODE (decl) == NAMESPACE_DECL)
2504         {
2505           error ("use of namespace `%D' as expression", decl);
2506           return error_mark_node;
2507         }
2508       else if (DECL_CLASS_TEMPLATE_P (decl))
2509         {
2510           error ("use of class template `%T' as expression", decl);
2511           return error_mark_node;
2512         }
2513       else if (TREE_CODE (decl) == TREE_LIST)
2514         {
2515           /* Ambiguous reference to base members.  */
2516           error ("request for member `%D' is ambiguous in "
2517                  "multiple inheritance lattice", id_expression);
2518           print_candidates (decl);
2519           return error_mark_node;
2520         }
2521       else if (TREE_CODE (decl) == FIELD_DECL)
2522         decl = finish_non_static_data_member (decl, current_class_ref,
2523                                               /*qualifying_scope=*/NULL_TREE);
2524       else if (is_overloaded_fn (decl))
2525         {
2526           tree first_fn = OVL_CURRENT (decl);
2527
2528           if (TREE_CODE (first_fn) == TEMPLATE_DECL)
2529             first_fn = DECL_TEMPLATE_RESULT (first_fn);
2530           
2531           if (TREE_CODE (first_fn) == FUNCTION_DECL
2532               && DECL_FUNCTION_MEMBER_P (first_fn))
2533             {
2534               /* A set of member functions.  */
2535               decl = maybe_dummy_object (DECL_CONTEXT (first_fn), 0);
2536               return finish_class_member_access_expr (decl, id_expression);
2537             }
2538           else if (!really_overloaded_fn (decl))
2539             /* not really overloaded function */
2540             mark_used (first_fn);
2541         }
2542       else
2543         {
2544           if (TREE_CODE (decl) == VAR_DECL
2545               || TREE_CODE (decl) == PARM_DECL
2546               || TREE_CODE (decl) == RESULT_DECL)
2547             {
2548               tree context = decl_function_context (decl);
2549               
2550               if (context != NULL_TREE && context != current_function_decl
2551                   && ! TREE_STATIC (decl))
2552                 {
2553                   error ("use of %s from containing function",
2554                          (TREE_CODE (decl) == VAR_DECL
2555                           ? "`auto' variable" : "parameter"));
2556                   cp_error_at ("  `%#D' declared here", decl);
2557                   return error_mark_node;
2558                 }
2559             }
2560           
2561           if (DECL_P (decl) && DECL_NONLOCAL (decl)
2562               && DECL_CLASS_SCOPE_P (decl)
2563               && DECL_CONTEXT (decl) != current_class_type)
2564             {
2565               tree path;
2566               
2567               path = currently_open_derived_class (DECL_CONTEXT (decl));
2568               perform_or_defer_access_check (TYPE_BINFO (path), decl);
2569             }
2570           
2571           mark_used (decl);
2572           
2573           if (! processing_template_decl)
2574             decl = convert_from_reference (decl);
2575         }
2576       
2577       /* Resolve references to variables of anonymous unions
2578          into COMPONENT_REFs.  */
2579       if (TREE_CODE (decl) == ALIAS_DECL)
2580         decl = DECL_INITIAL (decl);
2581     }
2582
2583   if (TREE_DEPRECATED (decl))
2584     warn_deprecated_use (decl);
2585
2586   return decl;
2587 }
2588
2589 /* Implement the __typeof keyword: Return the type of EXPR, suitable for
2590    use as a type-specifier.  */
2591
2592 tree
2593 finish_typeof (tree expr)
2594 {
2595   tree type;
2596
2597   if (type_dependent_expression_p (expr))
2598     {
2599       type = make_aggr_type (TYPEOF_TYPE);
2600       TYPE_FIELDS (type) = expr;
2601
2602       return type;
2603     }
2604
2605   type = TREE_TYPE (expr);
2606
2607   if (!type || type == unknown_type_node)
2608     {
2609       error ("type of `%E' is unknown", expr);
2610       return error_mark_node;
2611     }
2612
2613   return type;
2614 }
2615
2616 /* Compute the value of the `sizeof' operator.  */
2617
2618 tree
2619 finish_sizeof (tree t)
2620 {
2621   return TYPE_P (t) ? cxx_sizeof (t) : expr_sizeof (t);
2622 }
2623
2624 /* Implement the __alignof keyword: Return the minimum required
2625    alignment of T, measured in bytes.  */
2626
2627 tree
2628 finish_alignof (tree t)
2629 {
2630   if (processing_template_decl)
2631     return build_min (ALIGNOF_EXPR, size_type_node, t);
2632
2633   return TYPE_P (t) ? cxx_alignof (t) : c_alignof_expr (t);
2634 }
2635
2636 /* Generate RTL for the statement T, and its substatements, and any
2637    other statements at its nesting level.  */
2638
2639 static void
2640 cp_expand_stmt (tree t)
2641 {
2642   switch (TREE_CODE (t))
2643     {
2644     case TRY_BLOCK:
2645       genrtl_try_block (t);
2646       break;
2647
2648     case EH_SPEC_BLOCK:
2649       genrtl_eh_spec_block (t);
2650       break;
2651
2652     case HANDLER:
2653       genrtl_handler (t);
2654       break;
2655
2656     case USING_STMT:
2657       break;
2658     
2659     default:
2660       abort ();
2661       break;
2662     }
2663 }
2664
2665 /* Called from expand_body via walk_tree.  Replace all AGGR_INIT_EXPRs
2666    will equivalent CALL_EXPRs.  */
2667
2668 static tree
2669 simplify_aggr_init_exprs_r (tree* tp, 
2670                             int* walk_subtrees ATTRIBUTE_UNUSED , 
2671                             void* data ATTRIBUTE_UNUSED )
2672 {
2673   tree aggr_init_expr;
2674   tree call_expr;
2675   tree fn;
2676   tree args;
2677   tree slot;
2678   tree type;
2679   enum style_t { ctor, arg, pcc } style;
2680
2681   aggr_init_expr = *tp;
2682   /* We don't need to walk into types; there's nothing in a type that
2683      needs simplification.  (And, furthermore, there are places we
2684      actively don't want to go.  For example, we don't want to wander
2685      into the default arguments for a FUNCTION_DECL that appears in a
2686      CALL_EXPR.)  */
2687   if (TYPE_P (aggr_init_expr))
2688     {
2689       *walk_subtrees = 0;
2690       return NULL_TREE;
2691     }
2692   /* Only AGGR_INIT_EXPRs are interesting.  */
2693   else if (TREE_CODE (aggr_init_expr) != AGGR_INIT_EXPR)
2694     return NULL_TREE;
2695
2696   /* Form an appropriate CALL_EXPR.  */
2697   fn = TREE_OPERAND (aggr_init_expr, 0);
2698   args = TREE_OPERAND (aggr_init_expr, 1);
2699   slot = TREE_OPERAND (aggr_init_expr, 2);
2700   type = TREE_TYPE (aggr_init_expr);
2701
2702   if (AGGR_INIT_VIA_CTOR_P (aggr_init_expr))
2703     style = ctor;
2704 #ifdef PCC_STATIC_STRUCT_RETURN
2705   else if (1)
2706     style = pcc;
2707 #endif
2708   else if (TREE_ADDRESSABLE (type))
2709     style = arg;
2710   else
2711     /* We shouldn't build an AGGR_INIT_EXPR if we don't need any special
2712        handling.  See build_cplus_new.  */
2713     abort ();
2714
2715   if (style == ctor || style == arg)
2716     {
2717       /* Pass the address of the slot.  If this is a constructor, we
2718          replace the first argument; otherwise, we tack on a new one.  */
2719       if (style == ctor)
2720         args = TREE_CHAIN (args);
2721
2722       cxx_mark_addressable (slot);
2723       args = tree_cons (NULL_TREE, 
2724                         build1 (ADDR_EXPR, 
2725                                 build_pointer_type (TREE_TYPE (slot)),
2726                                 slot),
2727                         args);
2728     }
2729
2730   call_expr = build (CALL_EXPR, 
2731                      TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))),
2732                      fn, args, NULL_TREE);
2733   TREE_SIDE_EFFECTS (call_expr) = 1;
2734
2735   if (style == arg)
2736     /* Tell the backend that we've added our return slot to the argument
2737        list.  */
2738     CALL_EXPR_HAS_RETURN_SLOT_ADDR (call_expr) = 1;
2739   else if (style == pcc)
2740     {
2741       /* If we're using the non-reentrant PCC calling convention, then we
2742          need to copy the returned value out of the static buffer into the
2743          SLOT.  */
2744       push_deferring_access_checks (dk_no_check);
2745       call_expr = build_aggr_init (slot, call_expr,
2746                                    DIRECT_BIND | LOOKUP_ONLYCONVERTING);
2747       pop_deferring_access_checks ();
2748     }
2749
2750   /* We want to use the value of the initialized location as the
2751      result.  */
2752   call_expr = build (COMPOUND_EXPR, type,
2753                      call_expr, slot);
2754
2755   /* Replace the AGGR_INIT_EXPR with the CALL_EXPR.  */
2756   TREE_CHAIN (call_expr) = TREE_CHAIN (aggr_init_expr);
2757   *tp = call_expr;
2758
2759   /* Keep iterating.  */
2760   return NULL_TREE;
2761 }
2762
2763 /* Emit all thunks to FN that should be emitted when FN is emitted.  */
2764
2765 static void
2766 emit_associated_thunks (tree fn)
2767 {
2768   /* When we use vcall offsets, we emit thunks with the virtual
2769      functions to which they thunk. The whole point of vcall offsets
2770      is so that you can know statically the entire set of thunks that
2771      will ever be needed for a given virtual function, thereby
2772      enabling you to output all the thunks with the function itself.  */
2773   if (DECL_VIRTUAL_P (fn))
2774     {
2775       tree thunk;
2776       
2777       for (thunk = DECL_THUNKS (fn); thunk; thunk = TREE_CHAIN (thunk))
2778         {
2779           use_thunk (thunk, /*emit_p=*/1);
2780           if (DECL_RESULT_THUNK_P (thunk))
2781             {
2782               tree probe;
2783
2784               for (probe = DECL_THUNKS (thunk);
2785                    probe; probe = TREE_CHAIN (probe))
2786                 use_thunk (probe, /*emit_p=*/1);
2787             }
2788         }
2789     }
2790 }
2791
2792 /* Generate RTL for FN.  */
2793
2794 void
2795 expand_body (tree fn)
2796 {
2797   location_t saved_loc;
2798   tree saved_function;
2799   
2800   if (flag_unit_at_a_time && !cgraph_global_info_ready)
2801     abort ();
2802
2803   /* Compute the appropriate object-file linkage for inline
2804      functions.  */
2805   if (DECL_DECLARED_INLINE_P (fn))
2806     import_export_decl (fn);
2807
2808   /* If FN is external, then there's no point in generating RTL for
2809      it.  This situation can arise with an inline function under
2810      `-fexternal-templates'; we instantiate the function, even though
2811      we're not planning on emitting it, in case we get a chance to
2812      inline it.  */
2813   if (DECL_EXTERNAL (fn))
2814     return;
2815
2816   /* Save the current file name and line number.  When we expand the
2817      body of the function, we'll set INPUT_LOCATION so that
2818      error-messages come out in the right places.  */
2819   saved_loc = input_location;
2820   saved_function = current_function_decl;
2821   input_location = DECL_SOURCE_LOCATION (fn);
2822   current_function_decl = fn;
2823
2824   timevar_push (TV_INTEGRATION);
2825
2826   /* Optimize the body of the function before expanding it.  */
2827   optimize_function (fn);
2828
2829   timevar_pop (TV_INTEGRATION);
2830   timevar_push (TV_EXPAND);
2831
2832   genrtl_start_function (fn);
2833   current_function_is_thunk = DECL_THUNK_P (fn);
2834
2835   /* Expand the body.  */
2836   expand_stmt (DECL_SAVED_TREE (fn));
2837
2838   /* Statements should always be full-expressions at the outermost set
2839      of curly braces for a function.  */
2840   my_friendly_assert (stmts_are_full_exprs_p (), 19990831);
2841
2842   /* The outermost statement for a function contains the line number
2843      recorded when we finished processing the function.  */
2844   input_line = STMT_LINENO (DECL_SAVED_TREE (fn));
2845
2846   /* Generate code for the function.  */
2847   genrtl_finish_function (fn);
2848
2849   /* If possible, obliterate the body of the function so that it can
2850      be garbage collected.  */
2851   if (dump_enabled_p (TDI_all))
2852     /* Keep the body; we're going to dump it.  */
2853     ;
2854   else if (DECL_INLINE (fn) && flag_inline_trees)
2855     /* We might need the body of this function so that we can expand
2856        it inline somewhere else.  */
2857     ;
2858   else
2859     /* We don't need the body; blow it away.  */
2860     DECL_SAVED_TREE (fn) = NULL_TREE;
2861
2862   /* And restore the current source position.  */
2863   current_function_decl = saved_function;
2864   input_location = saved_loc;
2865   extract_interface_info ();
2866
2867   timevar_pop (TV_EXPAND);
2868
2869   /* Emit any thunks that should be emitted at the same time as FN.  */
2870   emit_associated_thunks (fn);
2871 }
2872
2873 /* Generate RTL for FN.  */
2874
2875 void
2876 expand_or_defer_fn (tree fn)
2877 {
2878   /* When the parser calls us after finishing the body of a template
2879      function, we don't really want to expand the body.  When we're
2880      processing an in-class definition of an inline function,
2881      PROCESSING_TEMPLATE_DECL will no longer be set here, so we have
2882      to look at the function itself.  */
2883   if (processing_template_decl
2884       || (DECL_LANG_SPECIFIC (fn) 
2885           && DECL_TEMPLATE_INFO (fn)
2886           && uses_template_parms (DECL_TI_ARGS (fn))))
2887     {
2888       /* Normally, collection only occurs in rest_of_compilation.  So,
2889          if we don't collect here, we never collect junk generated
2890          during the processing of templates until we hit a
2891          non-template function.  */
2892       ggc_collect ();
2893       return;
2894     }
2895
2896   /* Replace AGGR_INIT_EXPRs with appropriate CALL_EXPRs.  */
2897   walk_tree_without_duplicates (&DECL_SAVED_TREE (fn),
2898                                 simplify_aggr_init_exprs_r,
2899                                 NULL);
2900
2901   /* If this is a constructor or destructor body, we have to clone
2902      it.  */
2903   if (maybe_clone_body (fn))
2904     {
2905       /* We don't want to process FN again, so pretend we've written
2906          it out, even though we haven't.  */
2907       TREE_ASM_WRITTEN (fn) = 1;
2908       return;
2909     }
2910
2911   /* There's no reason to do any of the work here if we're only doing
2912      semantic analysis; this code just generates RTL.  */
2913   if (flag_syntax_only)
2914     return;
2915
2916   if (flag_unit_at_a_time && cgraph_global_info_ready)
2917     abort ();
2918
2919   if (flag_unit_at_a_time && !cgraph_global_info_ready)
2920     {
2921       if (at_eof)
2922         {
2923           /* Compute the appropriate object-file linkage for inline
2924              functions.  */
2925           if (DECL_DECLARED_INLINE_P (fn))
2926             import_export_decl (fn);
2927           cgraph_finalize_function (fn, DECL_SAVED_TREE (fn));
2928         }
2929       else
2930         {
2931           if (!DECL_EXTERNAL (fn))
2932             {
2933               DECL_NOT_REALLY_EXTERN (fn) = 1;
2934               DECL_EXTERNAL (fn) = 1;
2935             }
2936           /* Remember this function.  In finish_file we'll decide if
2937              we actually need to write this function out.  */
2938           defer_fn (fn);
2939           /* Let the back-end know that this function exists.  */
2940           (*debug_hooks->deferred_inline_function) (fn);
2941         }
2942       return;
2943     }
2944
2945
2946   /* If possible, avoid generating RTL for this function.  Instead,
2947      just record it as an inline function, and wait until end-of-file
2948      to decide whether to write it out or not.  */
2949   if (/* We have to generate RTL if it's not an inline function.  */
2950       (DECL_INLINE (fn) || DECL_COMDAT (fn))
2951       /* Or if we have to emit code for inline functions anyhow.  */
2952       && !flag_keep_inline_functions
2953       /* Or if we actually have a reference to the function.  */
2954       && !DECL_NEEDED_P (fn))
2955     {
2956       /* Set DECL_EXTERNAL so that assemble_external will be called as
2957          necessary.  We'll clear it again in finish_file.  */
2958       if (!DECL_EXTERNAL (fn))
2959         {
2960           DECL_NOT_REALLY_EXTERN (fn) = 1;
2961           DECL_EXTERNAL (fn) = 1;
2962         }
2963       /* Remember this function.  In finish_file we'll decide if
2964          we actually need to write this function out.  */
2965       defer_fn (fn);
2966       /* Let the back-end know that this function exists.  */
2967       (*debug_hooks->deferred_inline_function) (fn);
2968       return;
2969     }
2970
2971   expand_body (fn);
2972 }
2973
2974 /* Helper function for walk_tree, used by finish_function to override all
2975    the RETURN_STMTs and pertinent CLEANUP_STMTs for the named return
2976    value optimization.  */
2977
2978 tree
2979 nullify_returns_r (tree* tp, int* walk_subtrees, void* data)
2980 {
2981   tree nrv = (tree) data;
2982
2983   /* No need to walk into types.  There wouldn't be any need to walk into
2984      non-statements, except that we have to consider STMT_EXPRs.  */
2985   if (TYPE_P (*tp))
2986     *walk_subtrees = 0;
2987   else if (TREE_CODE (*tp) == RETURN_STMT)
2988     RETURN_STMT_EXPR (*tp) = NULL_TREE;
2989   else if (TREE_CODE (*tp) == CLEANUP_STMT
2990            && CLEANUP_DECL (*tp) == nrv)
2991     CLEANUP_EH_ONLY (*tp) = 1;
2992
2993   /* Keep iterating.  */
2994   return NULL_TREE;
2995 }
2996
2997 /* Start generating the RTL for FN.  */
2998
2999 static void
3000 genrtl_start_function (tree fn)
3001 {
3002   /* Tell everybody what function we're processing.  */
3003   current_function_decl = fn;
3004   /* Get the RTL machinery going for this function.  */
3005   init_function_start (fn);
3006   /* Let everybody know that we're expanding this function, not doing
3007      semantic analysis.  */
3008   expanding_p = 1;
3009
3010   /* Even though we're inside a function body, we still don't want to
3011      call expand_expr to calculate the size of a variable-sized array.
3012      We haven't necessarily assigned RTL to all variables yet, so it's
3013      not safe to try to expand expressions involving them.  */
3014   immediate_size_expand = 0;
3015   cfun->x_dont_save_pending_sizes_p = 1;
3016
3017   /* Let the user know we're compiling this function.  */
3018   announce_function (fn);
3019
3020   /* Initialize the per-function data.  */
3021   my_friendly_assert (!DECL_PENDING_INLINE_P (fn), 20000911);
3022   if (DECL_SAVED_FUNCTION_DATA (fn))
3023     {
3024       /* If we already parsed this function, and we're just expanding it
3025          now, restore saved state.  */
3026       *cp_function_chain = *DECL_SAVED_FUNCTION_DATA (fn);
3027
3028       /* This function is being processed in whole-function mode; we
3029          already did semantic analysis.  */
3030       cfun->x_whole_function_mode_p = 1;
3031
3032       /* If we decided that we didn't want to inline this function,
3033          make sure the back-end knows that.  */
3034       if (!current_function_cannot_inline)
3035         current_function_cannot_inline = cp_function_chain->cannot_inline;
3036
3037       /* We don't need the saved data anymore.  Unless this is an inline
3038          function; we need the named return value info for
3039          cp_copy_res_decl_for_inlining.  */
3040       if (! DECL_INLINE (fn))
3041         DECL_SAVED_FUNCTION_DATA (fn) = NULL;
3042     }
3043
3044   /* Keep track of how many functions we're presently expanding.  */
3045   ++function_depth;
3046
3047   /* Create a binding level for the parameters.  */
3048   expand_function_start (fn, /*parms_have_cleanups=*/0);
3049   /* If this function is `main'.  */
3050   if (DECL_MAIN_P (fn))
3051     expand_main_function ();
3052
3053   /* Give our named return value the same RTL as our RESULT_DECL.  */
3054   if (current_function_return_value)
3055     COPY_DECL_RTL (DECL_RESULT (fn), current_function_return_value);
3056 }
3057
3058 /* Finish generating the RTL for FN.  */
3059
3060 static void
3061 genrtl_finish_function (tree fn)
3062 {
3063   tree t;
3064
3065 #if 0
3066   if (write_symbols != NO_DEBUG)
3067     {
3068       /* Keep this code around in case we later want to control debug info
3069          based on whether a type is "used".  (jason 1999-11-11) */
3070
3071       tree ttype = target_type (fntype);
3072       tree parmdecl;
3073
3074       if (IS_AGGR_TYPE (ttype))
3075         /* Let debugger know it should output info for this type.  */
3076         note_debug_info_needed (ttype);
3077
3078       for (parmdecl = DECL_ARGUMENTS (fndecl); parmdecl; parmdecl = TREE_CHAIN (parmdecl))
3079         {
3080           ttype = target_type (TREE_TYPE (parmdecl));
3081           if (IS_AGGR_TYPE (ttype))
3082             /* Let debugger know it should output info for this type.  */
3083             note_debug_info_needed (ttype);
3084         }
3085     }
3086 #endif
3087
3088   /* Clean house because we will need to reorder insns here.  */
3089   do_pending_stack_adjust ();
3090
3091   /* If we have a named return value, we need to force a return so that
3092      the return register is USEd.  */
3093   if (DECL_NAME (DECL_RESULT (fn)))
3094     emit_jump (return_label);
3095
3096   /* We hard-wired immediate_size_expand to zero in start_function.
3097      Expand_function_end will decrement this variable.  So, we set the
3098      variable to one here, so that after the decrement it will remain
3099      zero.  */
3100   immediate_size_expand = 1;
3101
3102   /* Generate rtl for function exit.  */
3103   expand_function_end ();
3104
3105   /* If this is a nested function (like a template instantiation that
3106      we're compiling in the midst of compiling something else), push a
3107      new GC context.  That will keep local variables on the stack from
3108      being collected while we're doing the compilation of this
3109      function.  */
3110   if (function_depth > 1)
3111     ggc_push_context ();
3112
3113   /* There's no need to defer outputting this function any more; we
3114      know we want to output it.  */
3115   DECL_DEFER_OUTPUT (fn) = 0;
3116
3117   /* Run the optimizers and output the assembler code for this
3118      function.  */
3119   rest_of_compilation (fn);
3120
3121   /* Undo the call to ggc_push_context above.  */
3122   if (function_depth > 1)
3123     ggc_pop_context ();
3124
3125 #if 0
3126   /* Keep this code around in case we later want to control debug info
3127      based on whether a type is "used".  (jason 1999-11-11) */
3128
3129   if (ctype && TREE_ASM_WRITTEN (fn))
3130     note_debug_info_needed (ctype);
3131 #endif
3132
3133   /* If this function is marked with the constructor attribute, add it
3134      to the list of functions to be called along with constructors
3135      from static duration objects.  */
3136   if (DECL_STATIC_CONSTRUCTOR (fn))
3137     static_ctors = tree_cons (NULL_TREE, fn, static_ctors);
3138
3139   /* If this function is marked with the destructor attribute, add it
3140      to the list of functions to be called along with destructors from
3141      static duration objects.  */
3142   if (DECL_STATIC_DESTRUCTOR (fn))
3143     static_dtors = tree_cons (NULL_TREE, fn, static_dtors);
3144
3145   --function_depth;
3146
3147   /* In C++, we should never be saving RTL for the function.  */
3148   my_friendly_assert (!DECL_SAVED_INSNS (fn), 20010903);
3149
3150   /* Since we don't need the RTL for this function anymore, stop
3151      pointing to it.  That's especially important for LABEL_DECLs,
3152      since you can reach all the instructions in the function from the
3153      CODE_LABEL stored in the DECL_RTL for the LABEL_DECL.  Walk the
3154      BLOCK-tree, clearing DECL_RTL for LABEL_DECLs and non-static
3155      local variables.  */
3156   walk_tree_without_duplicates (&DECL_SAVED_TREE (fn),
3157                                 clear_decl_rtl,
3158                                 NULL);
3159
3160   /* Clear out the RTL for the arguments.  */
3161   for (t = DECL_ARGUMENTS (fn); t; t = TREE_CHAIN (t))
3162     {
3163       SET_DECL_RTL (t, NULL_RTX);
3164       DECL_INCOMING_RTL (t) = NULL_RTX;
3165     }
3166
3167   if (!(flag_inline_trees && DECL_INLINE (fn)))
3168     /* DECL_INITIAL must remain nonzero so we know this was an
3169        actual function definition.  */
3170     DECL_INITIAL (fn) = error_mark_node;
3171   
3172   /* Let the error reporting routines know that we're outside a
3173      function.  For a nested function, this value is used in
3174      pop_cp_function_context and then reset via pop_function_context.  */
3175   current_function_decl = NULL_TREE;
3176 }
3177
3178 /* Clear out the DECL_RTL for the non-static variables in BLOCK and
3179    its sub-blocks.  */
3180
3181 static tree
3182 clear_decl_rtl (tree* tp, 
3183                 int* walk_subtrees ATTRIBUTE_UNUSED , 
3184                 void* data ATTRIBUTE_UNUSED )
3185 {
3186   if (nonstatic_local_decl_p (*tp)) 
3187     SET_DECL_RTL (*tp, NULL_RTX);
3188     
3189   return NULL_TREE;
3190 }
3191
3192 /* Perform initialization related to this module.  */
3193
3194 void
3195 init_cp_semantics (void)
3196 {
3197   lang_expand_stmt = cp_expand_stmt;
3198 }
3199
3200 #include "gt-cp-semantics.h"