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