OSDN Git Service

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