]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cp/semantics.c
cp-tree.h (TYPE_HAS_ASSIGN_REF): Rename to TYPE_HAS_COPY_ASSIGN.
[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
c8094d83 4 and during the instantiation of template functions.
ad321293 5
b2ebd268 6 Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
056928b2 7 2008, 2009, 2010 Free Software Foundation, Inc.
ad321293 8 Written by Mark Mitchell (mmitchell@usa.net) based on code found
c8094d83 9 formerly in parse.y and pt.c.
ad321293 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 14 under the terms of the GNU General Public License as published by
e77f031d 15 the Free Software Foundation; either version 3, or (at your option)
ad321293 16 any later version.
c8094d83 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.
c8094d83 22
e77f031d
NC
23You should have received a copy of the GNU General Public License
24along with GCC; see the file COPYING3. If not see
25<http://www.gnu.org/licenses/>. */
ad321293
MM
26
27#include "config.h"
8d052bc7 28#include "system.h"
4977bab6
ZW
29#include "coretypes.h"
30#include "tm.h"
ad321293
MM
31#include "tree.h"
32#include "cp-tree.h"
39dabefd 33#include "c-family/c-common.h"
25af8512 34#include "tree-inline.h"
6de9cd9a 35#include "tree-mudflap.h"
12027a89 36#include "toplev.h"
84df082b 37#include "flags.h"
225ff119 38#include "output.h"
ea11ca7e 39#include "timevar.h"
6de9cd9a 40#include "diagnostic.h"
8cd2462c 41#include "cgraph.h"
325c3691 42#include "tree-iterator.h"
3e1f1ba5 43#include "vec.h"
44d10c10 44#include "target.h"
726a989a 45#include "gimple.h"
7a8cba34 46#include "bitmap.h"
ad321293
MM
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
0b4d5576 51 degenerate form of parsing. */
ad321293 52
3a978d72 53static tree maybe_convert_cond (tree);
6de9cd9a 54static tree finalize_nrv_r (tree *, int *, void *);
d5f4eddd 55static tree capture_decltype (tree);
9660afe0 56static tree thisify_lambda_field (tree);
4985cde3 57
558475f0 58
8d241e0b
KL
59/* Deferred Access Checking Overview
60 ---------------------------------
61
62 Most C++ expressions and declarations require access checking
63 to be performed during parsing. However, in several cases,
64 this has to be treated differently.
65
66 For member declarations, access checking has to be deferred
67 until more information about the declaration is known. For
68 example:
69
70 class A {
0cbd7506 71 typedef int X;
8d241e0b 72 public:
0cbd7506 73 X f();
8d241e0b
KL
74 };
75
76 A::X A::f();
77 A::X g();
78
79 When we are parsing the function return type `A::X', we don't
80 really know if this is allowed until we parse the function name.
81
82 Furthermore, some contexts require that access checking is
83 never performed at all. These include class heads, and template
84 instantiations.
85
86 Typical use of access checking functions is described here:
c8094d83 87
8d241e0b
KL
88 1. When we enter a context that requires certain access checking
89 mode, the function `push_deferring_access_checks' is called with
90 DEFERRING argument specifying the desired mode. Access checking
91 may be performed immediately (dk_no_deferred), deferred
92 (dk_deferred), or not performed (dk_no_check).
93
94 2. When a declaration such as a type, or a variable, is encountered,
95 the function `perform_or_defer_access_check' is called. It
d6b418fa 96 maintains a VEC of all deferred checks.
8d241e0b
KL
97
98 3. The global `current_class_type' or `current_function_decl' is then
99 setup by the parser. `enforce_access' relies on these information
100 to check access.
101
102 4. Upon exiting the context mentioned in step 1,
103 `perform_deferred_access_checks' is called to check all declaration
d6b418fa 104 stored in the VEC. `pop_deferring_access_checks' is then
8d241e0b
KL
105 called to restore the previous access checking mode.
106
107 In case of parsing error, we simply call `pop_deferring_access_checks'
108 without `perform_deferred_access_checks'. */
109
d1b38208 110typedef struct GTY(()) deferred_access {
d6b418fa 111 /* A VEC representing name-lookups for which we have deferred
3e1f1ba5
NS
112 checking access controls. We cannot check the accessibility of
113 names used in a decl-specifier-seq until we know what is being
114 declared because code like:
115
c8094d83 116 class A {
0cbd7506
MS
117 class B {};
118 B* f();
3e1f1ba5
NS
119 }
120
121 A::B* A::f() { return 0; }
122
d6b418fa
SM
123 is valid, even though `A::B' is not generally accessible. */
124 VEC (deferred_access_check,gc)* GTY(()) deferred_access_checks;
c8094d83 125
3e1f1ba5
NS
126 /* The current mode of access checks. */
127 enum deferring_kind deferring_access_checks_kind;
c8094d83 128
3e1f1ba5 129} deferred_access;
d4e6fecb
NS
130DEF_VEC_O (deferred_access);
131DEF_VEC_ALLOC_O (deferred_access,gc);
3e1f1ba5 132
cf22909c 133/* Data for deferred access checking. */
d4e6fecb 134static GTY(()) VEC(deferred_access,gc) *deferred_access_stack;
3e1f1ba5 135static GTY(()) unsigned deferred_access_no_check;
cf22909c
KL
136
137/* Save the current deferred access states and start deferred
138 access checking iff DEFER_P is true. */
139
572c2b17
AP
140void
141push_deferring_access_checks (deferring_kind deferring)
cf22909c 142{
78757caa
KL
143 /* For context like template instantiation, access checking
144 disabling applies to all nested context. */
3e1f1ba5
NS
145 if (deferred_access_no_check || deferring == dk_no_check)
146 deferred_access_no_check++;
cf22909c 147 else
3e1f1ba5
NS
148 {
149 deferred_access *ptr;
cf22909c 150
d4e6fecb 151 ptr = VEC_safe_push (deferred_access, gc, deferred_access_stack, NULL);
d6b418fa 152 ptr->deferred_access_checks = NULL;
3e1f1ba5
NS
153 ptr->deferring_access_checks_kind = deferring;
154 }
cf22909c
KL
155}
156
157/* Resume deferring access checks again after we stopped doing
158 this previously. */
159
572c2b17
AP
160void
161resume_deferring_access_checks (void)
cf22909c 162{
3e1f1ba5
NS
163 if (!deferred_access_no_check)
164 VEC_last (deferred_access, deferred_access_stack)
165 ->deferring_access_checks_kind = dk_deferred;
cf22909c
KL
166}
167
168/* Stop deferring access checks. */
169
572c2b17
AP
170void
171stop_deferring_access_checks (void)
cf22909c 172{
3e1f1ba5
NS
173 if (!deferred_access_no_check)
174 VEC_last (deferred_access, deferred_access_stack)
175 ->deferring_access_checks_kind = dk_no_deferred;
cf22909c
KL
176}
177
178/* Discard the current deferred access checks and restore the
179 previous states. */
180
572c2b17
AP
181void
182pop_deferring_access_checks (void)
cf22909c 183{
3e1f1ba5
NS
184 if (deferred_access_no_check)
185 deferred_access_no_check--;
186 else
187 VEC_pop (deferred_access, deferred_access_stack);
cf22909c
KL
188}
189
c8094d83
MS
190/* Returns a TREE_LIST representing the deferred checks.
191 The TREE_PURPOSE of each node is the type through which the
cf22909c
KL
192 access occurred; the TREE_VALUE is the declaration named.
193 */
194
d6b418fa 195VEC (deferred_access_check,gc)*
572c2b17 196get_deferred_access_checks (void)
cf22909c 197{
3e1f1ba5
NS
198 if (deferred_access_no_check)
199 return NULL;
200 else
201 return (VEC_last (deferred_access, deferred_access_stack)
202 ->deferred_access_checks);
cf22909c
KL
203}
204
205/* Take current deferred checks and combine with the
206 previous states if we also defer checks previously.
207 Otherwise perform checks now. */
208
572c2b17
AP
209void
210pop_to_parent_deferring_access_checks (void)
cf22909c 211{
3e1f1ba5
NS
212 if (deferred_access_no_check)
213 deferred_access_no_check--;
214 else
215 {
d6b418fa 216 VEC (deferred_access_check,gc) *checks;
3e1f1ba5
NS
217 deferred_access *ptr;
218
219 checks = (VEC_last (deferred_access, deferred_access_stack)
220 ->deferred_access_checks);
221
222 VEC_pop (deferred_access, deferred_access_stack);
223 ptr = VEC_last (deferred_access, deferred_access_stack);
224 if (ptr->deferring_access_checks_kind == dk_no_deferred)
225 {
226 /* Check access. */
d6b418fa 227 perform_access_checks (checks);
3e1f1ba5
NS
228 }
229 else
230 {
231 /* Merge with parent. */
d6b418fa
SM
232 int i, j;
233 deferred_access_check *chk, *probe;
c8094d83 234
d6b418fa
SM
235 for (i = 0 ;
236 VEC_iterate (deferred_access_check, checks, i, chk) ;
237 ++i)
3e1f1ba5 238 {
d6b418fa
SM
239 for (j = 0 ;
240 VEC_iterate (deferred_access_check,
241 ptr->deferred_access_checks, j, probe) ;
242 ++j)
243 {
244 if (probe->binfo == chk->binfo &&
245 probe->decl == chk->decl &&
246 probe->diag_decl == chk->diag_decl)
247 goto found;
248 }
3e1f1ba5 249 /* Insert into parent's checks. */
d6b418fa
SM
250 VEC_safe_push (deferred_access_check, gc,
251 ptr->deferred_access_checks, chk);
3e1f1ba5
NS
252 found:;
253 }
254 }
255 }
cf22909c
KL
256}
257
6b648482
MM
258/* Perform the access checks in CHECKS. The TREE_PURPOSE of each node
259 is the BINFO indicating the qualifying scope used to access the
260 DECL node stored in the TREE_VALUE of the node. */
261
262void
d6b418fa 263perform_access_checks (VEC (deferred_access_check,gc)* checks)
6b648482 264{
d6b418fa
SM
265 int i;
266 deferred_access_check *chk;
267
268 if (!checks)
269 return;
270
271 for (i = 0 ; VEC_iterate (deferred_access_check, checks, i, chk) ; ++i)
272 enforce_access (chk->binfo, chk->decl, chk->diag_decl);
6b648482
MM
273}
274
25903d03
KL
275/* Perform the deferred access checks.
276
277 After performing the checks, we still have to keep the list
278 `deferred_access_stack->deferred_access_checks' since we may want
279 to check access for them again later in a different context.
280 For example:
281
282 class A {
283 typedef int X;
284 static X a;
285 };
286 A::X A::a, x; // No error for `A::a', error for `x'
287
288 We have to perform deferred access of `A::X', first with `A::a',
289 next with `x'. */
cf22909c 290
572c2b17
AP
291void
292perform_deferred_access_checks (void)
cf22909c 293{
6b648482 294 perform_access_checks (get_deferred_access_checks ());
cf22909c
KL
295}
296
297/* Defer checking the accessibility of DECL, when looked up in
02022f3a 298 BINFO. DIAG_DECL is the declaration to use to print diagnostics. */
cf22909c 299
572c2b17 300void
02022f3a 301perform_or_defer_access_check (tree binfo, tree decl, tree diag_decl)
cf22909c 302{
d6b418fa 303 int i;
3e1f1ba5 304 deferred_access *ptr;
d6b418fa
SM
305 deferred_access_check *chk;
306 deferred_access_check *new_access;
307
cf22909c 308
3e1f1ba5
NS
309 /* Exit if we are in a context that no access checking is performed.
310 */
311 if (deferred_access_no_check)
0f2a66c9 312 return;
c8094d83 313
50bc768d 314 gcc_assert (TREE_CODE (binfo) == TREE_BINFO);
0f2a66c9 315
3e1f1ba5 316 ptr = VEC_last (deferred_access, deferred_access_stack);
c8094d83 317
cf22909c 318 /* If we are not supposed to defer access checks, just check now. */
3e1f1ba5 319 if (ptr->deferring_access_checks_kind == dk_no_deferred)
cf22909c 320 {
02022f3a 321 enforce_access (binfo, decl, diag_decl);
cf22909c
KL
322 return;
323 }
c8094d83 324
cf22909c 325 /* See if we are already going to perform this check. */
d6b418fa
SM
326 for (i = 0 ;
327 VEC_iterate (deferred_access_check,
328 ptr->deferred_access_checks, i, chk) ;
329 ++i)
330 {
331 if (chk->decl == decl && chk->binfo == binfo &&
332 chk->diag_decl == diag_decl)
333 {
334 return;
335 }
336 }
cf22909c 337 /* If not, record the check. */
d6b418fa
SM
338 new_access =
339 VEC_safe_push (deferred_access_check, gc,
340 ptr->deferred_access_checks, 0);
341 new_access->binfo = binfo;
342 new_access->decl = decl;
343 new_access->diag_decl = diag_decl;
cf22909c
KL
344}
345
838dfd8a 346/* Returns nonzero if the current statement is a full expression,
f2c5f623
BC
347 i.e. temporaries created during that statement should be destroyed
348 at the end of the statement. */
35b1567d 349
f2c5f623 350int
3a978d72 351stmts_are_full_exprs_p (void)
f2c5f623 352{
ae499cce
MM
353 return current_stmt_tree ()->stmts_are_full_exprs_p;
354}
355
ed3d0b14
ILT
356/* T is a statement. Add it to the statement-tree. This is the C++
357 version. The C/ObjC frontends have a slightly different version of
358 this function. */
359
360tree
361add_stmt (tree t)
362{
363 enum tree_code code = TREE_CODE (t);
364
365 if (EXPR_P (t) && code != LABEL_EXPR)
366 {
367 if (!EXPR_HAS_LOCATION (t))
368 SET_EXPR_LOCATION (t, input_location);
369
370 /* When we expand a statement-tree, we must know whether or not the
371 statements are full-expressions. We record that fact here. */
372 STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();
373 }
374
375 /* Add T to the statement-tree. Non-side-effect statements need to be
376 recorded during statement expressions. */
377 append_to_statement_list_force (t, &cur_stmt_list);
378
379 return t;
380}
381
e8924938 382/* Returns the stmt_tree to which statements are currently being added. */
ae499cce
MM
383
384stmt_tree
3a978d72 385current_stmt_tree (void)
ae499cce 386{
c8094d83
MS
387 return (cfun
388 ? &cfun->language->base.x_stmt_tree
ae499cce 389 : &scope_chain->x_stmt_tree);
f2c5f623 390}
35b1567d 391
543a0daa
RH
392/* If statements are full expressions, wrap STMT in a CLEANUP_POINT_EXPR. */
393
394static tree
395maybe_cleanup_point_expr (tree expr)
396{
397 if (!processing_template_decl && stmts_are_full_exprs_p ())
0ad28dde 398 expr = fold_build_cleanup_point_expr (TREE_TYPE (expr), expr);
543a0daa
RH
399 return expr;
400}
401
0ad28dde 402/* Like maybe_cleanup_point_expr except have the type of the new expression be
22423a1f
KH
403 void so we don't need to create a temporary variable to hold the inner
404 expression. The reason why we do this is because the original type might be
405 an aggregate and we cannot create a temporary variable for that type. */
0ad28dde
AP
406
407static tree
408maybe_cleanup_point_expr_void (tree expr)
409{
410 if (!processing_template_decl && stmts_are_full_exprs_p ())
411 expr = fold_build_cleanup_point_expr (void_type_node, expr);
412 return expr;
413}
414
415
416
543a0daa
RH
417/* Create a declaration statement for the declaration given by the DECL. */
418
419void
350fae66 420add_decl_expr (tree decl)
543a0daa 421{
c2255bc4 422 tree r = build_stmt (input_location, DECL_EXPR, decl);
b187901e
AP
423 if (DECL_INITIAL (decl)
424 || (DECL_SIZE (decl) && TREE_SIDE_EFFECTS (DECL_SIZE (decl))))
0ad28dde 425 r = maybe_cleanup_point_expr_void (r);
543a0daa
RH
426 add_stmt (r);
427}
428
f2c5f623 429/* Finish a scope. */
35b1567d 430
20aff0b3 431tree
325c3691 432do_poplevel (tree stmt_list)
35b1567d 433{
325c3691 434 tree block = NULL;
35b1567d 435
f2c5f623 436 if (stmts_are_full_exprs_p ())
325c3691 437 block = poplevel (kept_level_p (), 1, 0);
f2c5f623 438
325c3691 439 stmt_list = pop_stmt_list (stmt_list);
c8094d83 440
325c3691
RH
441 if (!processing_template_decl)
442 {
c2255bc4 443 stmt_list = c_build_bind_expr (input_location, block, stmt_list);
325c3691 444 /* ??? See c_end_compound_stmt re statement expressions. */
35b1567d
BC
445 }
446
325c3691 447 return stmt_list;
35b1567d
BC
448}
449
c8094d83 450/* Begin a new scope. */
35b1567d 451
325c3691 452static tree
92bc1323 453do_pushlevel (scope_kind sk)
35b1567d 454{
325c3691 455 tree ret = push_stmt_list ();
f2c5f623 456 if (stmts_are_full_exprs_p ())
325c3691
RH
457 begin_scope (sk, NULL);
458 return ret;
459}
5a508662
RH
460
461/* Queue a cleanup. CLEANUP is an expression/statement to be executed
462 when the current scope is exited. EH_ONLY is true when this is not
463 meant to apply to normal control flow transfer. */
464
465void
466push_cleanup (tree decl, tree cleanup, bool eh_only)
467{
c2255bc4 468 tree stmt = build_stmt (input_location, CLEANUP_STMT, NULL, cleanup, decl);
5a508662
RH
469 CLEANUP_EH_ONLY (stmt) = eh_only;
470 add_stmt (stmt);
471 CLEANUP_BODY (stmt) = push_stmt_list ();
472}
325c3691 473
caf2523d
RH
474/* Begin a conditional that might contain a declaration. When generating
475 normal code, we want the declaration to appear before the statement
476 containing the conditional. When generating template code, we want the
350fae66 477 conditional to be rendered as the raw DECL_EXPR. */
325c3691
RH
478
479static void
caf2523d 480begin_cond (tree *cond_p)
325c3691 481{
caf2523d
RH
482 if (processing_template_decl)
483 *cond_p = push_stmt_list ();
484}
485
486/* Finish such a conditional. */
487
488static void
489finish_cond (tree *cond_p, tree expr)
490{
491 if (processing_template_decl)
35b1567d 492 {
caf2523d 493 tree cond = pop_stmt_list (*cond_p);
350fae66 494 if (TREE_CODE (cond) == DECL_EXPR)
caf2523d 495 expr = cond;
5d80a306 496
7b3e2d46 497 if (check_for_bare_parameter_packs (expr))
4439d02f 498 *cond_p = error_mark_node;
35b1567d 499 }
caf2523d 500 *cond_p = expr;
35b1567d
BC
501}
502
325c3691
RH
503/* If *COND_P specifies a conditional with a declaration, transform the
504 loop such that
0cbd7506
MS
505 while (A x = 42) { }
506 for (; A x = 42;) { }
325c3691 507 becomes
0cbd7506
MS
508 while (true) { A x = 42; if (!x) break; }
509 for (;;) { A x = 42; if (!x) break; }
caf2523d
RH
510 The statement list for BODY will be empty if the conditional did
511 not declare anything. */
c8094d83 512
325c3691 513static void
caf2523d 514simplify_loop_decl_cond (tree *cond_p, tree body)
325c3691 515{
caf2523d 516 tree cond, if_stmt;
325c3691 517
caf2523d
RH
518 if (!TREE_SIDE_EFFECTS (body))
519 return;
325c3691 520
caf2523d
RH
521 cond = *cond_p;
522 *cond_p = boolean_true_node;
c8094d83 523
caf2523d 524 if_stmt = begin_if_stmt ();
5ade1ed2 525 cond = cp_build_unary_op (TRUTH_NOT_EXPR, cond, 0, tf_warning_or_error);
caf2523d
RH
526 finish_if_stmt_cond (cond, if_stmt);
527 finish_break_stmt ();
528 finish_then_clause (if_stmt);
529 finish_if_stmt (if_stmt);
530}
325c3691 531
35b1567d
BC
532/* Finish a goto-statement. */
533
3e4d04a1 534tree
3a978d72 535finish_goto_stmt (tree destination)
35b1567d
BC
536{
537 if (TREE_CODE (destination) == IDENTIFIER_NODE)
538 destination = lookup_label (destination);
539
540 /* We warn about unused labels with -Wunused. That means we have to
541 mark the used labels as used. */
542 if (TREE_CODE (destination) == LABEL_DECL)
543 TREE_USED (destination) = 1;
fc2b8477
MM
544 else
545 {
fc2b8477 546 if (!processing_template_decl)
f5651df1 547 {
f5651df1
JJ
548 destination = cp_convert (ptr_type_node, destination);
549 if (error_operand_p (destination))
550 return NULL_TREE;
551 }
fc2b8477
MM
552 /* We don't inline calls to functions with computed gotos.
553 Those functions are typically up to some funny business,
554 and may be depending on the labels being at particular
555 addresses, or some such. */
556 DECL_UNINLINABLE (current_function_decl) = 1;
557 }
c8094d83 558
35b1567d
BC
559 check_goto (destination);
560
c2255bc4 561 return add_stmt (build_stmt (input_location, GOTO_EXPR, destination));
35b1567d
BC
562}
563
ed5511d9 564/* COND is the condition-expression for an if, while, etc.,
d4033c81
MLI
565 statement. Convert it to a boolean value, if appropriate.
566 In addition, verify sequence points if -Wsequence-point is enabled. */
ed5511d9 567
8ce33230 568static tree
3a978d72 569maybe_convert_cond (tree cond)
ed5511d9
MM
570{
571 /* Empty conditions remain empty. */
572 if (!cond)
573 return NULL_TREE;
574
575 /* Wait until we instantiate templates before doing conversion. */
576 if (processing_template_decl)
577 return cond;
578
d4033c81
MLI
579 if (warn_sequence_point)
580 verify_sequence_points (cond);
581
ed5511d9
MM
582 /* Do the conversion. */
583 cond = convert_from_reference (cond);
fbc8d2d3
ILT
584
585 if (TREE_CODE (cond) == MODIFY_EXPR
586 && !TREE_NO_WARNING (cond)
587 && warn_parentheses)
588 {
589 warning (OPT_Wparentheses,
590 "suggest parentheses around assignment used as truth value");
591 TREE_NO_WARNING (cond) = 1;
592 }
593
ed5511d9
MM
594 return condition_conversion (cond);
595}
596
9bfadf57 597/* Finish an expression-statement, whose EXPRESSION is as indicated. */
a7e4cfa0 598
3e4d04a1 599tree
3a978d72 600finish_expr_stmt (tree expr)
ad321293 601{
3e4d04a1
RH
602 tree r = NULL_TREE;
603
ce4a0391 604 if (expr != NULL_TREE)
ad321293 605 {
a5bcc582 606 if (!processing_template_decl)
3a5b9284
RH
607 {
608 if (warn_sequence_point)
609 verify_sequence_points (expr);
5ade1ed2 610 expr = convert_to_void (expr, "statement", tf_warning_or_error);
3a5b9284 611 }
47d4c811 612 else if (!type_dependent_expression_p (expr))
5ade1ed2
DG
613 convert_to_void (build_non_dependent_expr (expr), "statement",
614 tf_warning_or_error);
325c3691 615
7b3e2d46 616 if (check_for_bare_parameter_packs (expr))
4439d02f 617 expr = error_mark_node;
5d80a306 618
325c3691 619 /* Simplification of inner statement expressions, compound exprs,
ca5b80f3 620 etc can result in us already having an EXPR_STMT. */
543a0daa
RH
621 if (TREE_CODE (expr) != CLEANUP_POINT_EXPR)
622 {
623 if (TREE_CODE (expr) != EXPR_STMT)
c2255bc4 624 expr = build_stmt (input_location, EXPR_STMT, expr);
0ad28dde 625 expr = maybe_cleanup_point_expr_void (expr);
543a0daa
RH
626 }
627
325c3691 628 r = add_stmt (expr);
35b1567d 629 }
364460b6 630
35b1567d 631 finish_stmt ();
558475f0 632
3e4d04a1 633 return r;
35b1567d
BC
634}
635
35b1567d 636
ad321293
MM
637/* Begin an if-statement. Returns a newly created IF_STMT if
638 appropriate. */
639
640tree
3a978d72 641begin_if_stmt (void)
ad321293 642{
325c3691
RH
643 tree r, scope;
644 scope = do_pushlevel (sk_block);
c2255bc4 645 r = build_stmt (input_location, IF_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
325c3691 646 TREE_CHAIN (r) = scope;
caf2523d 647 begin_cond (&IF_COND (r));
ad321293
MM
648 return r;
649}
650
651/* Process the COND of an if-statement, which may be given by
652 IF_STMT. */
653
c8094d83 654void
3a978d72 655finish_if_stmt_cond (tree cond, tree if_stmt)
ad321293 656{
caf2523d
RH
657 finish_cond (&IF_COND (if_stmt), maybe_convert_cond (cond));
658 add_stmt (if_stmt);
325c3691 659 THEN_CLAUSE (if_stmt) = push_stmt_list ();
ad321293
MM
660}
661
662/* Finish the then-clause of an if-statement, which may be given by
663 IF_STMT. */
664
665tree
3a978d72 666finish_then_clause (tree if_stmt)
ad321293 667{
325c3691 668 THEN_CLAUSE (if_stmt) = pop_stmt_list (THEN_CLAUSE (if_stmt));
35b1567d 669 return if_stmt;
ad321293
MM
670}
671
672/* Begin the else-clause of an if-statement. */
673
325c3691
RH
674void
675begin_else_clause (tree if_stmt)
ad321293 676{
325c3691 677 ELSE_CLAUSE (if_stmt) = push_stmt_list ();
ad321293
MM
678}
679
680/* Finish the else-clause of an if-statement, which may be given by
681 IF_STMT. */
682
683void
3a978d72 684finish_else_clause (tree if_stmt)
ad321293 685{
325c3691 686 ELSE_CLAUSE (if_stmt) = pop_stmt_list (ELSE_CLAUSE (if_stmt));
ad321293
MM
687}
688
dfbb4f34 689/* Finish an if-statement. */
ad321293 690
c8094d83 691void
325c3691 692finish_if_stmt (tree if_stmt)
ad321293 693{
325c3691
RH
694 tree scope = TREE_CHAIN (if_stmt);
695 TREE_CHAIN (if_stmt) = NULL;
696 add_stmt (do_poplevel (scope));
ad321293 697 finish_stmt ();
35b1567d
BC
698}
699
ad321293
MM
700/* Begin a while-statement. Returns a newly created WHILE_STMT if
701 appropriate. */
702
703tree
3a978d72 704begin_while_stmt (void)
ad321293
MM
705{
706 tree r;
c2255bc4 707 r = build_stmt (input_location, WHILE_STMT, NULL_TREE, NULL_TREE);
ae499cce 708 add_stmt (r);
325c3691 709 WHILE_BODY (r) = do_pushlevel (sk_block);
caf2523d 710 begin_cond (&WHILE_COND (r));
ad321293
MM
711 return r;
712}
713
27d26ee7 714/* Process the COND of a while-statement, which may be given by
ad321293
MM
715 WHILE_STMT. */
716
c8094d83 717void
3a978d72 718finish_while_stmt_cond (tree cond, tree while_stmt)
ad321293 719{
caf2523d
RH
720 finish_cond (&WHILE_COND (while_stmt), maybe_convert_cond (cond));
721 simplify_loop_decl_cond (&WHILE_COND (while_stmt), WHILE_BODY (while_stmt));
ad321293
MM
722}
723
724/* Finish a while-statement, which may be given by WHILE_STMT. */
725
c8094d83 726void
3a978d72 727finish_while_stmt (tree while_stmt)
ad321293 728{
325c3691 729 WHILE_BODY (while_stmt) = do_poplevel (WHILE_BODY (while_stmt));
ad321293
MM
730 finish_stmt ();
731}
732
733/* Begin a do-statement. Returns a newly created DO_STMT if
734 appropriate. */
735
736tree
3a978d72 737begin_do_stmt (void)
ad321293 738{
c2255bc4 739 tree r = build_stmt (input_location, DO_STMT, NULL_TREE, NULL_TREE);
ae499cce 740 add_stmt (r);
325c3691 741 DO_BODY (r) = push_stmt_list ();
35b1567d 742 return r;
ad321293
MM
743}
744
745/* Finish the body of a do-statement, which may be given by DO_STMT. */
746
747void
3a978d72 748finish_do_body (tree do_stmt)
ad321293 749{
62e00e94
DM
750 tree body = DO_BODY (do_stmt) = pop_stmt_list (DO_BODY (do_stmt));
751
752 if (TREE_CODE (body) == STATEMENT_LIST && STATEMENT_LIST_TAIL (body))
753 body = STATEMENT_LIST_TAIL (body)->stmt;
754
755 if (IS_EMPTY_STMT (body))
756 warning (OPT_Wempty_body,
757 "suggest explicit braces around empty body in %<do%> statement");
ad321293
MM
758}
759
760/* Finish a do-statement, which may be given by DO_STMT, and whose
761 COND is as indicated. */
762
763void
3a978d72 764finish_do_stmt (tree cond, tree do_stmt)
ad321293 765{
ed5511d9 766 cond = maybe_convert_cond (cond);
35b1567d
BC
767 DO_COND (do_stmt) = cond;
768 finish_stmt ();
769}
ed5511d9 770
ad321293
MM
771/* Finish a return-statement. The EXPRESSION returned, if any, is as
772 indicated. */
773
3e4d04a1 774tree
3a978d72 775finish_return_stmt (tree expr)
ad321293 776{
3e4d04a1 777 tree r;
0c9b182b 778 bool no_warning;
3e4d04a1 779
0c9b182b 780 expr = check_return_expr (expr, &no_warning);
1799e5d5
RH
781
782 if (flag_openmp && !check_omp_return ())
783 return error_mark_node;
35b1567d 784 if (!processing_template_decl)
efee38a9 785 {
d4033c81
MLI
786 if (warn_sequence_point)
787 verify_sequence_points (expr);
788
44d10c10 789 if (DECL_DESTRUCTOR_P (current_function_decl)
c8094d83 790 || (DECL_CONSTRUCTOR_P (current_function_decl)
44d10c10 791 && targetm.cxx.cdtor_returns_this ()))
efee38a9
MM
792 {
793 /* Similarly, all destructors must run destructors for
794 base-classes before returning. So, all returns in a
dfbb4f34 795 destructor get sent to the DTOR_LABEL; finish_function emits
efee38a9 796 code to return a value there. */
44d10c10 797 return finish_goto_stmt (cdtor_label);
efee38a9
MM
798 }
799 }
543a0daa 800
c2255bc4 801 r = build_stmt (input_location, RETURN_EXPR, expr);
0c9b182b 802 TREE_NO_WARNING (r) |= no_warning;
0ad28dde 803 r = maybe_cleanup_point_expr_void (r);
543a0daa 804 r = add_stmt (r);
35b1567d 805 finish_stmt ();
3e4d04a1
RH
806
807 return r;
35b1567d 808}
efee38a9 809
ad321293
MM
810/* Begin a for-statement. Returns a new FOR_STMT if appropriate. */
811
812tree
3a978d72 813begin_for_stmt (void)
ad321293
MM
814{
815 tree r;
816
c2255bc4 817 r = build_stmt (input_location, FOR_STMT, NULL_TREE, NULL_TREE,
0dfdeca6 818 NULL_TREE, NULL_TREE);
325c3691
RH
819
820 if (flag_new_for_scope > 0)
821 TREE_CHAIN (r) = do_pushlevel (sk_for);
ad321293 822
894ca2c9
RH
823 if (processing_template_decl)
824 FOR_INIT_STMT (r) = push_stmt_list ();
825
ad321293
MM
826 return r;
827}
828
829/* Finish the for-init-statement of a for-statement, which may be
830 given by FOR_STMT. */
831
832void
3a978d72 833finish_for_init_stmt (tree for_stmt)
ad321293 834{
894ca2c9
RH
835 if (processing_template_decl)
836 FOR_INIT_STMT (for_stmt) = pop_stmt_list (FOR_INIT_STMT (for_stmt));
325c3691
RH
837 add_stmt (for_stmt);
838 FOR_BODY (for_stmt) = do_pushlevel (sk_block);
caf2523d 839 begin_cond (&FOR_COND (for_stmt));
ad321293
MM
840}
841
842/* Finish the COND of a for-statement, which may be given by
843 FOR_STMT. */
844
845void
3a978d72 846finish_for_cond (tree cond, tree for_stmt)
ad321293 847{
caf2523d
RH
848 finish_cond (&FOR_COND (for_stmt), maybe_convert_cond (cond));
849 simplify_loop_decl_cond (&FOR_COND (for_stmt), FOR_BODY (for_stmt));
ad321293
MM
850}
851
852/* Finish the increment-EXPRESSION in a for-statement, which may be
853 given by FOR_STMT. */
854
855void
3a978d72 856finish_for_expr (tree expr, tree for_stmt)
ad321293 857{
543a0daa
RH
858 if (!expr)
859 return;
6f69173e
MM
860 /* If EXPR is an overloaded function, issue an error; there is no
861 context available to use to perform overload resolution. */
543a0daa 862 if (type_unknown_p (expr))
6f69173e
MM
863 {
864 cxx_incomplete_type_error (expr, TREE_TYPE (expr));
865 expr = error_mark_node;
866 }
bcd46a7c
AP
867 if (!processing_template_decl)
868 {
869 if (warn_sequence_point)
0cbd7506 870 verify_sequence_points (expr);
5ade1ed2
DG
871 expr = convert_to_void (expr, "3rd expression in for",
872 tf_warning_or_error);
bcd46a7c
AP
873 }
874 else if (!type_dependent_expression_p (expr))
5ade1ed2
DG
875 convert_to_void (build_non_dependent_expr (expr), "3rd expression in for",
876 tf_warning_or_error);
0ad28dde 877 expr = maybe_cleanup_point_expr_void (expr);
7b3e2d46 878 if (check_for_bare_parameter_packs (expr))
4439d02f 879 expr = error_mark_node;
35b1567d 880 FOR_EXPR (for_stmt) = expr;
ad321293
MM
881}
882
883/* Finish the body of a for-statement, which may be given by
884 FOR_STMT. The increment-EXPR for the loop must be
885 provided. */
886
887void
3a978d72 888finish_for_stmt (tree for_stmt)
ad321293 889{
325c3691
RH
890 FOR_BODY (for_stmt) = do_poplevel (FOR_BODY (for_stmt));
891
ad321293 892 /* Pop the scope for the body of the loop. */
325c3691
RH
893 if (flag_new_for_scope > 0)
894 {
895 tree scope = TREE_CHAIN (for_stmt);
896 TREE_CHAIN (for_stmt) = NULL;
897 add_stmt (do_poplevel (scope));
898 }
899
c8094d83 900 finish_stmt ();
ad321293
MM
901}
902
903/* Finish a break-statement. */
904
3e4d04a1 905tree
3a978d72 906finish_break_stmt (void)
ad321293 907{
c2255bc4 908 return add_stmt (build_stmt (input_location, BREAK_STMT));
35b1567d
BC
909}
910
ad321293
MM
911/* Finish a continue-statement. */
912
3e4d04a1 913tree
3a978d72 914finish_continue_stmt (void)
ad321293 915{
c2255bc4 916 return add_stmt (build_stmt (input_location, CONTINUE_STMT));
ad321293
MM
917}
918
35b1567d
BC
919/* Begin a switch-statement. Returns a new SWITCH_STMT if
920 appropriate. */
921
922tree
3a978d72 923begin_switch_stmt (void)
35b1567d 924{
325c3691
RH
925 tree r, scope;
926
c2255bc4 927 r = build_stmt (input_location, SWITCH_STMT, NULL_TREE, NULL_TREE, NULL_TREE);
325c3691
RH
928
929 scope = do_pushlevel (sk_block);
930 TREE_CHAIN (r) = scope;
ebaae582 931 begin_cond (&SWITCH_STMT_COND (r));
325c3691 932
527f0080 933 return r;
ad321293
MM
934}
935
527f0080 936/* Finish the cond of a switch-statement. */
ad321293 937
527f0080 938void
3a978d72 939finish_switch_cond (tree cond, tree switch_stmt)
ad321293 940{
6f9fdf4d 941 tree orig_type = NULL;
35b1567d 942 if (!processing_template_decl)
373eb3b3 943 {
35b1567d 944 /* Convert the condition to an integer or enumeration type. */
b746c5dc 945 cond = build_expr_type_conversion (WANT_INT | WANT_ENUM, cond, true);
35b1567d 946 if (cond == NULL_TREE)
373eb3b3 947 {
35b1567d
BC
948 error ("switch quantity not an integer");
949 cond = error_mark_node;
950 }
6f9fdf4d 951 orig_type = TREE_TYPE (cond);
35b1567d
BC
952 if (cond != error_mark_node)
953 {
0a72704b
MM
954 /* [stmt.switch]
955
956 Integral promotions are performed. */
957 cond = perform_integral_promotions (cond);
543a0daa 958 cond = maybe_cleanup_point_expr (cond);
373eb3b3 959 }
ad321293 960 }
7b3e2d46 961 if (check_for_bare_parameter_packs (cond))
4439d02f 962 cond = error_mark_node;
d4033c81
MLI
963 else if (!processing_template_decl && warn_sequence_point)
964 verify_sequence_points (cond);
965
ebaae582
SB
966 finish_cond (&SWITCH_STMT_COND (switch_stmt), cond);
967 SWITCH_STMT_TYPE (switch_stmt) = orig_type;
caf2523d 968 add_stmt (switch_stmt);
56cb9733 969 push_switch (switch_stmt);
ebaae582 970 SWITCH_STMT_BODY (switch_stmt) = push_stmt_list ();
ad321293
MM
971}
972
973/* Finish the body of a switch-statement, which may be given by
974 SWITCH_STMT. The COND to switch on is indicated. */
975
976void
3a978d72 977finish_switch_stmt (tree switch_stmt)
ad321293 978{
325c3691
RH
979 tree scope;
980
ebaae582
SB
981 SWITCH_STMT_BODY (switch_stmt) =
982 pop_stmt_list (SWITCH_STMT_BODY (switch_stmt));
c8094d83 983 pop_switch ();
ad321293 984 finish_stmt ();
325c3691
RH
985
986 scope = TREE_CHAIN (switch_stmt);
987 TREE_CHAIN (switch_stmt) = NULL;
988 add_stmt (do_poplevel (scope));
ad321293
MM
989}
990
ad321293
MM
991/* Begin a try-block. Returns a newly-created TRY_BLOCK if
992 appropriate. */
993
994tree
3a978d72 995begin_try_block (void)
ad321293 996{
c2255bc4 997 tree r = build_stmt (input_location, TRY_BLOCK, NULL_TREE, NULL_TREE);
ae499cce 998 add_stmt (r);
325c3691 999 TRY_STMTS (r) = push_stmt_list ();
35b1567d 1000 return r;
ad321293
MM
1001}
1002
eaf6fb90
MM
1003/* Likewise, for a function-try-block. The block returned in
1004 *COMPOUND_STMT is an artificial outer scope, containing the
1005 function-try-block. */
0dde4175
JM
1006
1007tree
eaf6fb90 1008begin_function_try_block (tree *compound_stmt)
0dde4175 1009{
eaf6fb90
MM
1010 tree r;
1011 /* This outer scope does not exist in the C++ standard, but we need
1012 a place to put __FUNCTION__ and similar variables. */
1013 *compound_stmt = begin_compound_stmt (0);
1014 r = begin_try_block ();
35b1567d 1015 FN_TRY_BLOCK_P (r) = 1;
35b1567d 1016 return r;
0dde4175
JM
1017}
1018
ad321293
MM
1019/* Finish a try-block, which may be given by TRY_BLOCK. */
1020
1021void
3a978d72 1022finish_try_block (tree try_block)
ad321293 1023{
325c3691
RH
1024 TRY_STMTS (try_block) = pop_stmt_list (TRY_STMTS (try_block));
1025 TRY_HANDLERS (try_block) = push_stmt_list ();
ad321293
MM
1026}
1027
efa8eda3
MM
1028/* Finish the body of a cleanup try-block, which may be given by
1029 TRY_BLOCK. */
1030
62409b39 1031void
3a978d72 1032finish_cleanup_try_block (tree try_block)
62409b39 1033{
325c3691 1034 TRY_STMTS (try_block) = pop_stmt_list (TRY_STMTS (try_block));
62409b39
MM
1035}
1036
f1dedc31
MM
1037/* Finish an implicitly generated try-block, with a cleanup is given
1038 by CLEANUP. */
1039
1040void
3a978d72 1041finish_cleanup (tree cleanup, tree try_block)
f1dedc31 1042{
35b1567d
BC
1043 TRY_HANDLERS (try_block) = cleanup;
1044 CLEANUP_P (try_block) = 1;
f1dedc31
MM
1045}
1046
0dde4175
JM
1047/* Likewise, for a function-try-block. */
1048
1049void
3a978d72 1050finish_function_try_block (tree try_block)
0dde4175 1051{
325c3691
RH
1052 finish_try_block (try_block);
1053 /* FIXME : something queer about CTOR_INITIALIZER somehow following
1054 the try block, but moving it inside. */
b35d4555 1055 in_function_try_handler = 1;
0dde4175
JM
1056}
1057
ad321293
MM
1058/* Finish a handler-sequence for a try-block, which may be given by
1059 TRY_BLOCK. */
1060
1061void
3a978d72 1062finish_handler_sequence (tree try_block)
ad321293 1063{
325c3691 1064 TRY_HANDLERS (try_block) = pop_stmt_list (TRY_HANDLERS (try_block));
35b1567d 1065 check_handlers (TRY_HANDLERS (try_block));
ad321293
MM
1066}
1067
eaf6fb90
MM
1068/* Finish the handler-seq for a function-try-block, given by
1069 TRY_BLOCK. COMPOUND_STMT is the outer block created by
1070 begin_function_try_block. */
0dde4175
JM
1071
1072void
eaf6fb90 1073finish_function_handler_sequence (tree try_block, tree compound_stmt)
0dde4175 1074{
b35d4555 1075 in_function_try_handler = 0;
325c3691 1076 finish_handler_sequence (try_block);
eaf6fb90 1077 finish_compound_stmt (compound_stmt);
35b1567d
BC
1078}
1079
ad321293
MM
1080/* Begin a handler. Returns a HANDLER if appropriate. */
1081
1082tree
3a978d72 1083begin_handler (void)
ad321293
MM
1084{
1085 tree r;
325c3691 1086
c2255bc4 1087 r = build_stmt (input_location, HANDLER, NULL_TREE, NULL_TREE);
ae499cce 1088 add_stmt (r);
325c3691 1089
1a6025b4
JM
1090 /* Create a binding level for the eh_info and the exception object
1091 cleanup. */
325c3691
RH
1092 HANDLER_BODY (r) = do_pushlevel (sk_catch);
1093
ad321293
MM
1094 return r;
1095}
1096
1097/* Finish the handler-parameters for a handler, which may be given by
b35d4555
MM
1098 HANDLER. DECL is the declaration for the catch parameter, or NULL
1099 if this is a `catch (...)' clause. */
ad321293 1100
1a6025b4 1101void
3a978d72 1102finish_handler_parms (tree decl, tree handler)
b35d4555 1103{
1a6025b4 1104 tree type = NULL_TREE;
b35d4555
MM
1105 if (processing_template_decl)
1106 {
1107 if (decl)
1108 {
1109 decl = pushdecl (decl);
1110 decl = push_template_decl (decl);
325c3691 1111 HANDLER_PARMS (handler) = decl;
1a6025b4 1112 type = TREE_TYPE (decl);
b35d4555
MM
1113 }
1114 }
35b1567d 1115 else
1a6025b4 1116 type = expand_start_catch_block (decl);
1a6025b4 1117 HANDLER_TYPE (handler) = type;
b80cfdcd 1118 if (!processing_template_decl && type)
6cad4e17 1119 mark_used (eh_type_info (type));
35b1567d
BC
1120}
1121
1122/* Finish a handler, which may be given by HANDLER. The BLOCKs are
1123 the return value from the matching call to finish_handler_parms. */
1124
1125void
3a978d72 1126finish_handler (tree handler)
35b1567d
BC
1127{
1128 if (!processing_template_decl)
1a6025b4 1129 expand_end_catch_block ();
325c3691 1130 HANDLER_BODY (handler) = do_poplevel (HANDLER_BODY (handler));
35b1567d
BC
1131}
1132
5882f0f3 1133/* Begin a compound statement. FLAGS contains some bits that control the
5995ebfb 1134 behavior and context. If BCS_NO_SCOPE is set, the compound statement
5882f0f3 1135 does not define a scope. If BCS_FN_BODY is set, this is the outermost
c8094d83 1136 block of a function. If BCS_TRY_BLOCK is set, this is the block
5882f0f3
RH
1137 created on behalf of a TRY statement. Returns a token to be passed to
1138 finish_compound_stmt. */
ad321293
MM
1139
1140tree
325c3691 1141begin_compound_stmt (unsigned int flags)
ad321293 1142{
325c3691 1143 tree r;
558475f0 1144
325c3691
RH
1145 if (flags & BCS_NO_SCOPE)
1146 {
1147 r = push_stmt_list ();
1148 STATEMENT_LIST_NO_SCOPE (r) = 1;
1149
1150 /* Normally, we try hard to keep the BLOCK for a statement-expression.
1151 But, if it's a statement-expression with a scopeless block, there's
1152 nothing to keep, and we don't want to accidentally keep a block
c8094d83 1153 *inside* the scopeless block. */
325c3691
RH
1154 keep_next_level (false);
1155 }
f1dedc31 1156 else
325c3691
RH
1157 r = do_pushlevel (flags & BCS_TRY_BLOCK ? sk_try : sk_block);
1158
5882f0f3
RH
1159 /* When processing a template, we need to remember where the braces were,
1160 so that we can set up identical scopes when instantiating the template
1161 later. BIND_EXPR is a handy candidate for this.
1162 Note that do_poplevel won't create a BIND_EXPR itself here (and thus
1163 result in nested BIND_EXPRs), since we don't build BLOCK nodes when
1164 processing templates. */
1165 if (processing_template_decl)
325c3691 1166 {
f293ce4b 1167 r = build3 (BIND_EXPR, NULL, NULL, r, NULL);
5882f0f3
RH
1168 BIND_EXPR_TRY_BLOCK (r) = (flags & BCS_TRY_BLOCK) != 0;
1169 BIND_EXPR_BODY_BLOCK (r) = (flags & BCS_FN_BODY) != 0;
325c3691
RH
1170 TREE_SIDE_EFFECTS (r) = 1;
1171 }
ad321293
MM
1172
1173 return r;
1174}
1175
5882f0f3 1176/* Finish a compound-statement, which is given by STMT. */
ad321293 1177
325c3691
RH
1178void
1179finish_compound_stmt (tree stmt)
ad321293 1180{
5882f0f3
RH
1181 if (TREE_CODE (stmt) == BIND_EXPR)
1182 BIND_EXPR_BODY (stmt) = do_poplevel (BIND_EXPR_BODY (stmt));
325c3691
RH
1183 else if (STATEMENT_LIST_NO_SCOPE (stmt))
1184 stmt = pop_stmt_list (stmt);
7a3397c7 1185 else
5f070bc7
ZL
1186 {
1187 /* Destroy any ObjC "super" receivers that may have been
1188 created. */
1189 objc_clear_super_receiver ();
1190
1191 stmt = do_poplevel (stmt);
1192 }
ad321293 1193
325c3691
RH
1194 /* ??? See c_end_compound_stmt wrt statement expressions. */
1195 add_stmt (stmt);
ad321293 1196 finish_stmt ();
ad321293
MM
1197}
1198
6de9cd9a 1199/* Finish an asm-statement, whose components are a STRING, some
1c384bf1
RH
1200 OUTPUT_OPERANDS, some INPUT_OPERANDS, some CLOBBERS and some
1201 LABELS. Also note whether the asm-statement should be
1202 considered volatile. */
7dc5bd62 1203
3e4d04a1 1204tree
6de9cd9a 1205finish_asm_stmt (int volatile_p, tree string, tree output_operands,
1c384bf1 1206 tree input_operands, tree clobbers, tree labels)
35b1567d
BC
1207{
1208 tree r;
abfc8a36 1209 tree t;
5544530a
PB
1210 int ninputs = list_length (input_operands);
1211 int noutputs = list_length (output_operands);
abfc8a36 1212
abfc8a36 1213 if (!processing_template_decl)
40b18c0a 1214 {
74f0c611
RH
1215 const char *constraint;
1216 const char **oconstraints;
1217 bool allows_mem, allows_reg, is_inout;
1218 tree operand;
40b18c0a 1219 int i;
40b18c0a 1220
86b8fed1 1221 oconstraints = XALLOCAVEC (const char *, noutputs);
74f0c611
RH
1222
1223 string = resolve_asm_operand_names (string, output_operands,
1c384bf1 1224 input_operands, labels);
74f0c611
RH
1225
1226 for (i = 0, t = output_operands; t; t = TREE_CHAIN (t), ++i)
40b18c0a 1227 {
74f0c611
RH
1228 operand = TREE_VALUE (t);
1229
1230 /* ??? Really, this should not be here. Users should be using a
1231 proper lvalue, dammit. But there's a long history of using
1232 casts in the output operands. In cases like longlong.h, this
1233 becomes a primitive form of typechecking -- if the cast can be
1234 removed, then the output operand had a type of the proper width;
1235 otherwise we'll get an error. Gross, but ... */
1236 STRIP_NOPS (operand);
1237
03a904b5
JJ
1238 operand = mark_lvalue_use (operand);
1239
5ade1ed2 1240 if (!lvalue_or_else (operand, lv_asm, tf_warning_or_error))
74f0c611
RH
1241 operand = error_mark_node;
1242
3db45ab5 1243 if (operand != error_mark_node
5544530a
PB
1244 && (TREE_READONLY (operand)
1245 || CP_TYPE_CONST_P (TREE_TYPE (operand))
3db45ab5
MS
1246 /* Functions are not modifiable, even though they are
1247 lvalues. */
1248 || TREE_CODE (TREE_TYPE (operand)) == FUNCTION_TYPE
1249 || TREE_CODE (TREE_TYPE (operand)) == METHOD_TYPE
1250 /* If it's an aggregate and any field is const, then it is
1251 effectively const. */
1252 || (CLASS_TYPE_P (TREE_TYPE (operand))
1253 && C_TYPE_FIELDS_READONLY (TREE_TYPE (operand)))))
4cd5a50a 1254 readonly_error (operand, REK_ASSIGNMENT_ASM);
5544530a 1255
74f0c611
RH
1256 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
1257 oconstraints[i] = constraint;
1258
1259 if (parse_output_constraint (&constraint, i, ninputs, noutputs,
1260 &allows_mem, &allows_reg, &is_inout))
1261 {
1262 /* If the operand is going to end up in memory,
1263 mark it addressable. */
1264 if (!allows_reg && !cxx_mark_addressable (operand))
1265 operand = error_mark_node;
1266 }
1267 else
1268 operand = error_mark_node;
1269
1270 TREE_VALUE (t) = operand;
1271 }
1272
1273 for (i = 0, t = input_operands; t; ++i, t = TREE_CHAIN (t))
1274 {
1275 constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
c8094d83 1276 operand = decay_conversion (TREE_VALUE (t));
74f0c611 1277
40b18c0a
MM
1278 /* If the type of the operand hasn't been determined (e.g.,
1279 because it involves an overloaded function), then issue
1280 an error message. There's no context available to
1281 resolve the overloading. */
74f0c611 1282 if (TREE_TYPE (operand) == unknown_type_node)
40b18c0a 1283 {
c8094d83 1284 error ("type of asm operand %qE could not be determined",
0cbd7506 1285 TREE_VALUE (t));
74f0c611 1286 operand = error_mark_node;
40b18c0a 1287 }
40b18c0a 1288
74f0c611
RH
1289 if (parse_input_constraint (&constraint, i, ninputs, noutputs, 0,
1290 oconstraints, &allows_mem, &allows_reg))
40b18c0a 1291 {
74f0c611
RH
1292 /* If the operand is going to end up in memory,
1293 mark it addressable. */
b4c33883
AP
1294 if (!allows_reg && allows_mem)
1295 {
1296 /* Strip the nops as we allow this case. FIXME, this really
1297 should be rejected or made deprecated. */
1298 STRIP_NOPS (operand);
1299 if (!cxx_mark_addressable (operand))
1300 operand = error_mark_node;
1301 }
40b18c0a 1302 }
74f0c611
RH
1303 else
1304 operand = error_mark_node;
40b18c0a 1305
74f0c611 1306 TREE_VALUE (t) = operand;
40b18c0a
MM
1307 }
1308 }
abfc8a36 1309
c2255bc4 1310 r = build_stmt (input_location, ASM_EXPR, string,
0dfdeca6 1311 output_operands, input_operands,
1c384bf1 1312 clobbers, labels);
5544530a 1313 ASM_VOLATILE_P (r) = volatile_p || noutputs == 0;
0ad28dde 1314 r = maybe_cleanup_point_expr_void (r);
3e4d04a1 1315 return add_stmt (r);
ad321293 1316}
b4c4a9ec 1317
5bca4e80 1318/* Finish a label with the indicated NAME. Returns the new label. */
f01b0acb 1319
a723baf1 1320tree
3a978d72 1321finish_label_stmt (tree name)
f01b0acb 1322{
5b030314 1323 tree decl = define_label (input_location, name);
417fa55b 1324
5bca4e80 1325 if (decl == error_mark_node)
417fa55b
LM
1326 return error_mark_node;
1327
c2255bc4 1328 add_stmt (build_stmt (input_location, LABEL_EXPR, decl));
5bca4e80
ILT
1329
1330 return decl;
f01b0acb
MM
1331}
1332
acef433b
MM
1333/* Finish a series of declarations for local labels. G++ allows users
1334 to declare "local" labels, i.e., labels with scope. This extension
1335 is useful when writing code involving statement-expressions. */
1336
1337void
3a978d72 1338finish_label_decl (tree name)
acef433b 1339{
a6d76a95
PC
1340 if (!at_function_scope_p ())
1341 {
1342 error ("__label__ declarations are only allowed in function scopes");
1343 return;
1344 }
1345
1346 add_decl_expr (declare_local_label (name));
acef433b
MM
1347}
1348
659e5a7a 1349/* When DECL goes out of scope, make sure that CLEANUP is executed. */
f1dedc31 1350
c8094d83 1351void
3a978d72 1352finish_decl_cleanup (tree decl, tree cleanup)
f1dedc31 1353{
325c3691 1354 push_cleanup (decl, cleanup, false);
35b1567d
BC
1355}
1356
659e5a7a 1357/* If the current scope exits with an exception, run CLEANUP. */
24bef158 1358
659e5a7a 1359void
3a978d72 1360finish_eh_cleanup (tree cleanup)
24bef158 1361{
325c3691 1362 push_cleanup (NULL, cleanup, true);
35b1567d
BC
1363}
1364
2282d28d
MM
1365/* The MEM_INITS is a list of mem-initializers, in reverse of the
1366 order they were written by the user. Each node is as for
1367 emit_mem_initializers. */
bf3428d0
MM
1368
1369void
2282d28d 1370finish_mem_initializers (tree mem_inits)
bf3428d0 1371{
2282d28d
MM
1372 /* Reorder the MEM_INITS so that they are in the order they appeared
1373 in the source program. */
1374 mem_inits = nreverse (mem_inits);
bf3428d0 1375
a0de9d20 1376 if (processing_template_decl)
5d80a306
DG
1377 {
1378 tree mem;
1379
1380 for (mem = mem_inits; mem; mem = TREE_CHAIN (mem))
1381 {
1382 /* If the TREE_PURPOSE is a TYPE_PACK_EXPANSION, skip the
1383 check for bare parameter packs in the TREE_VALUE, because
1384 any parameter packs in the TREE_VALUE have already been
1385 bound as part of the TREE_PURPOSE. See
1386 make_pack_expansion for more information. */
4439d02f 1387 if (TREE_CODE (TREE_PURPOSE (mem)) != TYPE_PACK_EXPANSION
7b3e2d46 1388 && check_for_bare_parameter_packs (TREE_VALUE (mem)))
4439d02f 1389 TREE_VALUE (mem) = error_mark_node;
5d80a306
DG
1390 }
1391
1392 add_stmt (build_min_nt (CTOR_INITIALIZER, mem_inits));
1393 }
cdd2559c 1394 else
2282d28d 1395 emit_mem_initializers (mem_inits);
558475f0
MM
1396}
1397
b4c4a9ec
MM
1398/* Finish a parenthesized expression EXPR. */
1399
1400tree
3a978d72 1401finish_parenthesized_expr (tree expr)
b4c4a9ec 1402{
6615c446 1403 if (EXPR_P (expr))
78ef5b89 1404 /* This inhibits warnings in c_common_truthvalue_conversion. */
31ec7d2f 1405 TREE_NO_WARNING (expr) = 1;
b4c4a9ec 1406
19420d00
NS
1407 if (TREE_CODE (expr) == OFFSET_REF)
1408 /* [expr.unary.op]/3 The qualified id of a pointer-to-member must not be
1409 enclosed in parentheses. */
1410 PTRMEM_OK_P (expr) = 0;
c8094d83 1411
7a8380ae
NS
1412 if (TREE_CODE (expr) == STRING_CST)
1413 PAREN_STRING_LITERAL_P (expr) = 1;
c8094d83 1414
b4c4a9ec
MM
1415 return expr;
1416}
1417
a723baf1
MM
1418/* Finish a reference to a non-static data member (DECL) that is not
1419 preceded by `.' or `->'. */
1420
1421tree
a3f10e50 1422finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
a723baf1 1423{
50bc768d 1424 gcc_assert (TREE_CODE (decl) == FIELD_DECL);
a723baf1 1425
2defb926 1426 if (!object)
51fc2d02 1427 {
51fc2d02
JM
1428 tree scope = qualifying_scope;
1429 if (scope == NULL_TREE)
1430 scope = context_for_name_lookup (decl);
1431 object = maybe_dummy_object (scope, NULL);
1432 }
1433
2defb926
JM
1434 /* DR 613: Can use non-static data members without an associated
1435 object in sizeof/decltype/alignof. */
1436 if (is_dummy_object (object) && cp_unevaluated_operand == 0
1437 && (!processing_template_decl || !current_class_ref))
a723baf1 1438 {
c8094d83 1439 if (current_function_decl
a723baf1 1440 && DECL_STATIC_FUNCTION_P (current_function_decl))
dee15844 1441 error ("invalid use of member %q+D in static member function", decl);
a723baf1 1442 else
dee15844 1443 error ("invalid use of non-static data member %q+D", decl);
a723baf1
MM
1444 error ("from this location");
1445
1446 return error_mark_node;
1447 }
d5f4eddd 1448
51fc2d02
JM
1449 if (current_class_ptr)
1450 TREE_USED (current_class_ptr) = 1;
58e1d54c 1451 if (processing_template_decl && !qualifying_scope)
a723baf1 1452 {
a3f10e50 1453 tree type = TREE_TYPE (decl);
a723baf1 1454
a3f10e50
NS
1455 if (TREE_CODE (type) == REFERENCE_TYPE)
1456 type = TREE_TYPE (type);
1457 else
1458 {
f4f206f4 1459 /* Set the cv qualifiers. */
51fc2d02
JM
1460 int quals = (current_class_ref
1461 ? cp_type_quals (TREE_TYPE (current_class_ref))
1462 : TYPE_UNQUALIFIED);
c8094d83 1463
a3f10e50
NS
1464 if (DECL_MUTABLE_P (decl))
1465 quals &= ~TYPE_QUAL_CONST;
9e95d15f 1466
a3f10e50
NS
1467 quals |= cp_type_quals (TREE_TYPE (decl));
1468 type = cp_build_qualified_type (type, quals);
1469 }
c8094d83 1470
44de5aeb 1471 return build_min (COMPONENT_REF, type, object, decl, NULL_TREE);
a3f10e50 1472 }
ab11c13f
JM
1473 /* If PROCESSING_TEMPLATE_DECL is nonzero here, then
1474 QUALIFYING_SCOPE is also non-null. Wrap this in a SCOPE_REF
1475 for now. */
1476 else if (processing_template_decl)
1477 return build_qualified_name (TREE_TYPE (decl),
1478 qualifying_scope,
1479 DECL_NAME (decl),
1480 /*template_p=*/false);
a3f10e50
NS
1481 else
1482 {
1483 tree access_type = TREE_TYPE (object);
9f01ded6 1484
02022f3a
SM
1485 perform_or_defer_access_check (TYPE_BINFO (access_type), decl,
1486 decl);
a723baf1
MM
1487
1488 /* If the data member was named `C::M', convert `*this' to `C'
1489 first. */
1490 if (qualifying_scope)
1491 {
1492 tree binfo = NULL_TREE;
1493 object = build_scoped_ref (object, qualifying_scope,
1494 &binfo);
1495 }
1496
1497 return build_class_member_access_expr (object, decl,
1498 /*access_path=*/NULL_TREE,
5ade1ed2
DG
1499 /*preserve_reference=*/false,
1500 tf_warning_or_error);
a723baf1
MM
1501 }
1502}
1503
aa373032
DS
1504/* If we are currently parsing a template and we encountered a typedef
1505 TYPEDEF_DECL that is being accessed though CONTEXT, this function
1506 adds the typedef to a list tied to the current template.
1507 At tempate instantiatin time, that list is walked and access check
1508 performed for each typedef.
1509 LOCATION is the location of the usage point of TYPEDEF_DECL. */
1510
1511void
1512add_typedef_to_current_template_for_access_check (tree typedef_decl,
1513 tree context,
1514 location_t location)
1515{
1516 tree template_info = NULL;
1517 tree cs = current_scope ();
1518
1519 if (!is_typedef_decl (typedef_decl)
1520 || !context
1521 || !CLASS_TYPE_P (context)
1522 || !cs)
1523 return;
1524
1525 if (CLASS_TYPE_P (cs) || TREE_CODE (cs) == FUNCTION_DECL)
1526 template_info = get_template_info (cs);
1527
1528 if (template_info
1529 && TI_TEMPLATE (template_info)
1530 && !currently_open_class (context))
1531 append_type_to_template_for_access_check (cs, typedef_decl,
1532 context, location);
1533}
1534
ee76b931
MM
1535/* DECL was the declaration to which a qualified-id resolved. Issue
1536 an error message if it is not accessible. If OBJECT_TYPE is
1537 non-NULL, we have just seen `x->' or `x.' and OBJECT_TYPE is the
1538 type of `*x', or `x', respectively. If the DECL was named as
1539 `A::B' then NESTED_NAME_SPECIFIER is `A'. */
1540
1541void
c8094d83
MS
1542check_accessibility_of_qualified_id (tree decl,
1543 tree object_type,
ee76b931
MM
1544 tree nested_name_specifier)
1545{
1546 tree scope;
1547 tree qualifying_type = NULL_TREE;
95b4aca6 1548
d0940d56
DS
1549 /* If we are parsing a template declaration and if decl is a typedef,
1550 add it to a list tied to the template.
1551 At template instantiation time, that list will be walked and
1552 access check performed. */
aa373032
DS
1553 add_typedef_to_current_template_for_access_check (decl,
1554 nested_name_specifier
1555 ? nested_name_specifier
1556 : DECL_CONTEXT (decl),
1557 input_location);
d0940d56 1558
77880ae4 1559 /* If we're not checking, return immediately. */
95b4aca6
NS
1560 if (deferred_access_no_check)
1561 return;
c8094d83 1562
ee76b931
MM
1563 /* Determine the SCOPE of DECL. */
1564 scope = context_for_name_lookup (decl);
1565 /* If the SCOPE is not a type, then DECL is not a member. */
1566 if (!TYPE_P (scope))
1567 return;
1568 /* Compute the scope through which DECL is being accessed. */
c8094d83 1569 if (object_type
ee76b931
MM
1570 /* OBJECT_TYPE might not be a class type; consider:
1571
1572 class A { typedef int I; };
1573 I *p;
1574 p->A::I::~I();
1575
0cbd7506 1576 In this case, we will have "A::I" as the DECL, but "I" as the
ee76b931
MM
1577 OBJECT_TYPE. */
1578 && CLASS_TYPE_P (object_type)
1579 && DERIVED_FROM_P (scope, object_type))
1580 /* If we are processing a `->' or `.' expression, use the type of the
1581 left-hand side. */
1582 qualifying_type = object_type;
1583 else if (nested_name_specifier)
1584 {
1585 /* If the reference is to a non-static member of the
1586 current class, treat it as if it were referenced through
1587 `this'. */
1588 if (DECL_NONSTATIC_MEMBER_P (decl)
1589 && current_class_ptr
1590 && DERIVED_FROM_P (scope, current_class_type))
1591 qualifying_type = current_class_type;
1592 /* Otherwise, use the type indicated by the
1593 nested-name-specifier. */
1594 else
1595 qualifying_type = nested_name_specifier;
1596 }
1597 else
1598 /* Otherwise, the name must be from the current class or one of
1599 its bases. */
1600 qualifying_type = currently_open_derived_class (scope);
1601
fc429748
MM
1602 if (qualifying_type
1603 /* It is possible for qualifying type to be a TEMPLATE_TYPE_PARM
1604 or similar in a default argument value. */
1605 && CLASS_TYPE_P (qualifying_type)
1606 && !dependent_type_p (qualifying_type))
02022f3a
SM
1607 perform_or_defer_access_check (TYPE_BINFO (qualifying_type), decl,
1608 decl);
ee76b931
MM
1609}
1610
1611/* EXPR is the result of a qualified-id. The QUALIFYING_CLASS was the
1612 class named to the left of the "::" operator. DONE is true if this
1613 expression is a complete postfix-expression; it is false if this
1614 expression is followed by '->', '[', '(', etc. ADDRESS_P is true
02ed62dd
MM
1615 iff this expression is the operand of '&'. TEMPLATE_P is true iff
1616 the qualified-id was of the form "A::template B". TEMPLATE_ARG_P
1617 is true iff this qualified name appears as a template argument. */
ee76b931
MM
1618
1619tree
3db45ab5
MS
1620finish_qualified_id_expr (tree qualifying_class,
1621 tree expr,
02ed62dd 1622 bool done,
3db45ab5 1623 bool address_p,
02ed62dd
MM
1624 bool template_p,
1625 bool template_arg_p)
ee76b931 1626{
d4f0f205
MM
1627 gcc_assert (TYPE_P (qualifying_class));
1628
5e08432e
MM
1629 if (error_operand_p (expr))
1630 return error_mark_node;
1631
7eab6e7b 1632 if (DECL_P (expr) || BASELINK_P (expr))
d4f0f205 1633 mark_used (expr);
d4f0f205 1634
02ed62dd
MM
1635 if (template_p)
1636 check_template_keyword (expr);
1637
ee76b931
MM
1638 /* If EXPR occurs as the operand of '&', use special handling that
1639 permits a pointer-to-member. */
1640 if (address_p && done)
1641 {
1642 if (TREE_CODE (expr) == SCOPE_REF)
1643 expr = TREE_OPERAND (expr, 1);
c8094d83 1644 expr = build_offset_ref (qualifying_class, expr,
a5ac359a 1645 /*address_p=*/true);
ee76b931
MM
1646 return expr;
1647 }
1648
02ed62dd
MM
1649 /* Within the scope of a class, turn references to non-static
1650 members into expression of the form "this->...". */
1651 if (template_arg_p)
1652 /* But, within a template argument, we do not want make the
1653 transformation, as there is no "this" pointer. */
1654 ;
1655 else if (TREE_CODE (expr) == FIELD_DECL)
43854f72
SB
1656 {
1657 push_deferring_access_checks (dk_no_check);
2defb926 1658 expr = finish_non_static_data_member (expr, NULL_TREE,
43854f72
SB
1659 qualifying_class);
1660 pop_deferring_access_checks ();
1661 }
ee76b931
MM
1662 else if (BASELINK_P (expr) && !processing_template_decl)
1663 {
38f1276b 1664 tree ob;
ee76b931
MM
1665
1666 /* See if any of the functions are non-static members. */
7e361ae6 1667 /* If so, the expression may be relative to 'this'. */
294e855f 1668 if (!shared_member_p (expr)
38f1276b
JM
1669 && (ob = maybe_dummy_object (qualifying_class, NULL),
1670 !is_dummy_object (ob)))
c8094d83 1671 expr = (build_class_member_access_expr
38f1276b 1672 (ob,
ee76b931
MM
1673 expr,
1674 BASELINK_ACCESS_BINFO (expr),
5ade1ed2
DG
1675 /*preserve_reference=*/false,
1676 tf_warning_or_error));
ee76b931 1677 else if (done)
a5ac359a
MM
1678 /* The expression is a qualified name whose address is not
1679 being taken. */
1680 expr = build_offset_ref (qualifying_class, expr, /*address_p=*/false);
ee76b931
MM
1681 }
1682
1683 return expr;
1684}
1685
b69b1501
MM
1686/* Begin a statement-expression. The value returned must be passed to
1687 finish_stmt_expr. */
b4c4a9ec 1688
c8094d83 1689tree
3a978d72 1690begin_stmt_expr (void)
b4c4a9ec 1691{
325c3691 1692 return push_stmt_list ();
35b1567d
BC
1693}
1694
a5bcc582 1695/* Process the final expression of a statement expression. EXPR can be
85a56c9d
MM
1696 NULL, if the final expression is empty. Return a STATEMENT_LIST
1697 containing all the statements in the statement-expression, or
1698 ERROR_MARK_NODE if there was an error. */
a5bcc582
NS
1699
1700tree
325c3691 1701finish_stmt_expr_expr (tree expr, tree stmt_expr)
a5bcc582 1702{
72e4661a 1703 if (error_operand_p (expr))
76b9a2a1
AP
1704 {
1705 /* The type of the statement-expression is the type of the last
1706 expression. */
1707 TREE_TYPE (stmt_expr) = error_mark_node;
1708 return error_mark_node;
1709 }
c8094d83 1710
85a56c9d 1711 /* If the last statement does not have "void" type, then the value
3db45ab5 1712 of the last statement is the value of the entire expression. */
a5bcc582
NS
1713 if (expr)
1714 {
c6c7698d
JM
1715 tree type = TREE_TYPE (expr);
1716
1717 if (processing_template_decl)
1718 {
c2255bc4 1719 expr = build_stmt (input_location, EXPR_STMT, expr);
c6c7698d
JM
1720 expr = add_stmt (expr);
1721 /* Mark the last statement so that we can recognize it as such at
1722 template-instantiation time. */
1723 EXPR_STMT_STMT_EXPR_RESULT (expr) = 1;
1724 }
1725 else if (VOID_TYPE_P (type))
a5bcc582 1726 {
c6c7698d
JM
1727 /* Just treat this like an ordinary statement. */
1728 expr = finish_expr_stmt (expr);
1729 }
1730 else
1731 {
1732 /* It actually has a value we need to deal with. First, force it
1733 to be an rvalue so that we won't need to build up a copy
1734 constructor call later when we try to assign it to something. */
1735 expr = force_rvalue (expr);
85a56c9d
MM
1736 if (error_operand_p (expr))
1737 return error_mark_node;
c6c7698d
JM
1738
1739 /* Update for array-to-pointer decay. */
2692eb7d 1740 type = TREE_TYPE (expr);
c6c7698d
JM
1741
1742 /* Wrap it in a CLEANUP_POINT_EXPR and add it to the list like a
1743 normal statement, but don't convert to void or actually add
1744 the EXPR_STMT. */
1745 if (TREE_CODE (expr) != CLEANUP_POINT_EXPR)
1746 expr = maybe_cleanup_point_expr (expr);
1747 add_stmt (expr);
85a56c9d 1748 }
c6c7698d 1749
85a56c9d
MM
1750 /* The type of the statement-expression is the type of the last
1751 expression. */
1752 TREE_TYPE (stmt_expr) = type;
a5bcc582 1753 }
c8094d83 1754
85a56c9d 1755 return stmt_expr;
a5bcc582
NS
1756}
1757
303b7406
NS
1758/* Finish a statement-expression. EXPR should be the value returned
1759 by the previous begin_stmt_expr. Returns an expression
1760 representing the statement-expression. */
b4c4a9ec 1761
c8094d83 1762tree
325c3691 1763finish_stmt_expr (tree stmt_expr, bool has_no_scope)
b4c4a9ec 1764{
85a56c9d
MM
1765 tree type;
1766 tree result;
325c3691 1767
85a56c9d 1768 if (error_operand_p (stmt_expr))
d7b5fa31
JJ
1769 {
1770 pop_stmt_list (stmt_expr);
1771 return error_mark_node;
1772 }
325c3691 1773
85a56c9d 1774 gcc_assert (TREE_CODE (stmt_expr) == STATEMENT_LIST);
325c3691 1775
85a56c9d
MM
1776 type = TREE_TYPE (stmt_expr);
1777 result = pop_stmt_list (stmt_expr);
c6c7698d 1778 TREE_TYPE (result) = type;
6f80451c 1779
a5bcc582 1780 if (processing_template_decl)
325c3691
RH
1781 {
1782 result = build_min (STMT_EXPR, type, result);
1783 TREE_SIDE_EFFECTS (result) = 1;
1784 STMT_EXPR_NO_SCOPE (result) = has_no_scope;
1785 }
c6c7698d 1786 else if (CLASS_TYPE_P (type))
a5bcc582 1787 {
c6c7698d
JM
1788 /* Wrap the statement-expression in a TARGET_EXPR so that the
1789 temporary object created by the final expression is destroyed at
1790 the end of the full-expression containing the
1791 statement-expression. */
1792 result = force_target_expr (type, result);
a5bcc582 1793 }
325c3691 1794
b4c4a9ec
MM
1795 return result;
1796}
1797
c2acde1e
JM
1798/* Returns the expression which provides the value of STMT_EXPR. */
1799
1800tree
1801stmt_expr_value_expr (tree stmt_expr)
1802{
1803 tree t = STMT_EXPR_STMT (stmt_expr);
1804
1805 if (TREE_CODE (t) == BIND_EXPR)
1806 t = BIND_EXPR_BODY (t);
1807
9de0e916 1808 if (TREE_CODE (t) == STATEMENT_LIST && STATEMENT_LIST_TAIL (t))
c2acde1e
JM
1809 t = STATEMENT_LIST_TAIL (t)->stmt;
1810
1811 if (TREE_CODE (t) == EXPR_STMT)
1812 t = EXPR_STMT_EXPR (t);
1813
1814 return t;
1815}
1816
9af66ed1
DS
1817/* Return TRUE iff EXPR_STMT is an empty list of
1818 expression statements. */
1819
1820bool
1821empty_expr_stmt_p (tree expr_stmt)
1822{
1823 tree body = NULL_TREE;
1824
489df541
DS
1825 if (expr_stmt == void_zero_node)
1826 return true;
1827
9af66ed1
DS
1828 if (expr_stmt)
1829 {
1830 if (TREE_CODE (expr_stmt) == EXPR_STMT)
1831 body = EXPR_STMT_EXPR (expr_stmt);
1832 else if (TREE_CODE (expr_stmt) == STATEMENT_LIST)
1833 body = expr_stmt;
1834 }
1835
489df541
DS
1836 if (body)
1837 {
1838 if (TREE_CODE (body) == STATEMENT_LIST)
1839 return tsi_end_p (tsi_start (body));
1840 else
1841 return empty_expr_stmt_p (body);
1842 }
9af66ed1
DS
1843 return false;
1844}
1845
b3445994 1846/* Perform Koenig lookup. FN is the postfix-expression representing
fa531100
MM
1847 the function (or functions) to call; ARGS are the arguments to the
1848 call. Returns the functions to be considered by overload
1849 resolution. */
b3445994
MM
1850
1851tree
c166b898 1852perform_koenig_lookup (tree fn, VEC(tree,gc) *args)
b3445994
MM
1853{
1854 tree identifier = NULL_TREE;
1855 tree functions = NULL_TREE;
d095e03c 1856 tree tmpl_args = NULL_TREE;
4e6a9725 1857 bool template_id = false;
d095e03c
JM
1858
1859 if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
1860 {
4e6a9725
JM
1861 /* Use a separate flag to handle null args. */
1862 template_id = true;
d095e03c
JM
1863 tmpl_args = TREE_OPERAND (fn, 1);
1864 fn = TREE_OPERAND (fn, 0);
1865 }
b3445994
MM
1866
1867 /* Find the name of the overloaded function. */
1868 if (TREE_CODE (fn) == IDENTIFIER_NODE)
1869 identifier = fn;
1870 else if (is_overloaded_fn (fn))
1871 {
1872 functions = fn;
1873 identifier = DECL_NAME (get_first_fn (functions));
1874 }
1875 else if (DECL_P (fn))
1876 {
1877 functions = fn;
1878 identifier = DECL_NAME (fn);
1879 }
1880
1881 /* A call to a namespace-scope function using an unqualified name.
1882
1883 Do Koenig lookup -- unless any of the arguments are
1884 type-dependent. */
d095e03c
JM
1885 if (!any_type_dependent_arguments_p (args)
1886 && !any_dependent_template_arguments_p (tmpl_args))
b3445994
MM
1887 {
1888 fn = lookup_arg_dependent (identifier, functions, args);
1889 if (!fn)
1890 /* The unqualified name could not be resolved. */
1891 fn = unqualified_fn_lookup_error (identifier);
1892 }
b3445994 1893
4e6a9725
JM
1894 if (fn && template_id)
1895 fn = build2 (TEMPLATE_ID_EXPR, unknown_type_node, fn, tmpl_args);
d095e03c 1896
b3445994
MM
1897 return fn;
1898}
1899
c166b898
ILT
1900/* Generate an expression for `FN (ARGS)'. This may change the
1901 contents of ARGS.
4ba126e4
MM
1902
1903 If DISALLOW_VIRTUAL is true, the call to FN will be not generated
1904 as a virtual call, even if FN is virtual. (This flag is set when
1905 encountering an expression where the function name is explicitly
1906 qualified. For example a call to `X::f' never generates a virtual
1907 call.)
1908
1909 Returns code for the call. */
b4c4a9ec 1910
c8094d83 1911tree
c166b898
ILT
1912finish_call_expr (tree fn, VEC(tree,gc) **args, bool disallow_virtual,
1913 bool koenig_p, tsubst_flags_t complain)
b4c4a9ec 1914{
d17811fd
MM
1915 tree result;
1916 tree orig_fn;
c166b898 1917 VEC(tree,gc) *orig_args = NULL;
d17811fd 1918
c166b898 1919 if (fn == error_mark_node)
4ba126e4
MM
1920 return error_mark_node;
1921
4860b874 1922 gcc_assert (!TYPE_P (fn));
a759e627 1923
d17811fd 1924 orig_fn = fn;
d17811fd
MM
1925
1926 if (processing_template_decl)
1927 {
1928 if (type_dependent_expression_p (fn)
c166b898 1929 || any_type_dependent_arguments_p (*args))
6d80c4b9 1930 {
c166b898 1931 result = build_nt_call_vec (fn, *args);
5094a795 1932 KOENIG_LOOKUP_P (result) = koenig_p;
be461b8f
JJ
1933 if (cfun)
1934 {
1935 do
1936 {
1937 tree fndecl = OVL_CURRENT (fn);
1938 if (TREE_CODE (fndecl) != FUNCTION_DECL
1939 || !TREE_THIS_VOLATILE (fndecl))
1940 break;
1941 fn = OVL_NEXT (fn);
1942 }
1943 while (fn);
1944 if (!fn)
1945 current_function_returns_abnormally = 1;
1946 }
6d80c4b9
MM
1947 return result;
1948 }
c166b898 1949 orig_args = make_tree_vector_copy (*args);
d17811fd
MM
1950 if (!BASELINK_P (fn)
1951 && TREE_CODE (fn) != PSEUDO_DTOR_EXPR
1952 && TREE_TYPE (fn) != unknown_type_node)
1953 fn = build_non_dependent_expr (fn);
c166b898 1954 make_args_non_dependent (*args);
d17811fd
MM
1955 }
1956
eff3a276
MM
1957 if (is_overloaded_fn (fn))
1958 fn = baselink_for_fns (fn);
a723baf1 1959
d17811fd 1960 result = NULL_TREE;
4ba126e4 1961 if (BASELINK_P (fn))
03d82991 1962 {
4ba126e4
MM
1963 tree object;
1964
1965 /* A call to a member function. From [over.call.func]:
1966
1967 If the keyword this is in scope and refers to the class of
1968 that member function, or a derived class thereof, then the
1969 function call is transformed into a qualified function call
1970 using (*this) as the postfix-expression to the left of the
1971 . operator.... [Otherwise] a contrived object of type T
c8094d83 1972 becomes the implied object argument.
4ba126e4 1973
38f1276b 1974 In this situation:
4ba126e4
MM
1975
1976 struct A { void f(); };
1977 struct B : public A {};
1978 struct C : public A { void g() { B::f(); }};
1979
38f1276b
JM
1980 "the class of that member function" refers to `A'. But 11.2
1981 [class.access.base] says that we need to convert 'this' to B* as
1982 part of the access, so we pass 'B' to maybe_dummy_object. */
b4c4a9ec 1983
38f1276b
JM
1984 object = maybe_dummy_object (BINFO_TYPE (BASELINK_ACCESS_BINFO (fn)),
1985 NULL);
b4c4a9ec 1986
d17811fd
MM
1987 if (processing_template_decl)
1988 {
1989 if (type_dependent_expression_p (object))
c166b898
ILT
1990 {
1991 tree ret = build_nt_call_vec (orig_fn, orig_args);
1992 release_tree_vector (orig_args);
1993 return ret;
1994 }
d17811fd
MM
1995 object = build_non_dependent_expr (object);
1996 }
1997
1998 result = build_new_method_call (object, fn, args, NULL_TREE,
c8094d83 1999 (disallow_virtual
63c9a190 2000 ? LOOKUP_NONVIRTUAL : 0),
5ade1ed2
DG
2001 /*fn_p=*/NULL,
2002 complain);
4ba126e4
MM
2003 }
2004 else if (is_overloaded_fn (fn))
16c35a1f
RH
2005 {
2006 /* If the function is an overloaded builtin, resolve it. */
2007 if (TREE_CODE (fn) == FUNCTION_DECL
58646b77
PB
2008 && (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL
2009 || DECL_BUILT_IN_CLASS (fn) == BUILT_IN_MD))
c2255bc4 2010 result = resolve_overloaded_builtin (input_location, fn, *args);
16c35a1f
RH
2011
2012 if (!result)
2013 /* A call to a namespace-scope function. */
5094a795 2014 result = build_new_function_call (fn, args, koenig_p, complain);
16c35a1f 2015 }
a723baf1
MM
2016 else if (TREE_CODE (fn) == PSEUDO_DTOR_EXPR)
2017 {
c166b898 2018 if (!VEC_empty (tree, *args))
a723baf1
MM
2019 error ("arguments to destructor are not allowed");
2020 /* Mark the pseudo-destructor call as having side-effects so
2021 that we do not issue warnings about its use. */
2022 result = build1 (NOP_EXPR,
2023 void_type_node,
2024 TREE_OPERAND (fn, 0));
2025 TREE_SIDE_EFFECTS (result) = 1;
a723baf1 2026 }
4ba126e4 2027 else if (CLASS_TYPE_P (TREE_TYPE (fn)))
d17811fd
MM
2028 /* If the "function" is really an object of class type, it might
2029 have an overloaded `operator ()'. */
c166b898 2030 result = build_op_call (fn, args, complain);
16c35a1f 2031
d17811fd
MM
2032 if (!result)
2033 /* A call where the function is unknown. */
c166b898 2034 result = cp_build_function_call_vec (fn, args, complain);
4ba126e4 2035
d17811fd 2036 if (processing_template_decl)
6d80c4b9 2037 {
c166b898 2038 result = build_call_vec (TREE_TYPE (result), orig_fn, orig_args);
5094a795 2039 KOENIG_LOOKUP_P (result) = koenig_p;
c166b898 2040 release_tree_vector (orig_args);
6d80c4b9 2041 }
c166b898 2042
d17811fd 2043 return result;
b4c4a9ec
MM
2044}
2045
2046/* Finish a call to a postfix increment or decrement or EXPR. (Which
2047 is indicated by CODE, which should be POSTINCREMENT_EXPR or
2048 POSTDECREMENT_EXPR.) */
2049
c8094d83 2050tree
3a978d72 2051finish_increment_expr (tree expr, enum tree_code code)
b4c4a9ec 2052{
5ade1ed2 2053 return build_x_unary_op (code, expr, tf_warning_or_error);
b4c4a9ec
MM
2054}
2055
2056/* Finish a use of `this'. Returns an expression for `this'. */
2057
c8094d83 2058tree
3a978d72 2059finish_this_expr (void)
b4c4a9ec
MM
2060{
2061 tree result;
2062
c6be04ad
JM
2063 if (current_class_ptr)
2064 {
2065 tree type = TREE_TYPE (current_class_ref);
2066
2067 /* In a lambda expression, 'this' refers to the captured 'this'. */
2068 if (LAMBDA_TYPE_P (type))
2069 result = lambda_expr_this_capture (CLASSTYPE_LAMBDA_EXPR (type));
2070 else
2071 result = current_class_ptr;
2072
2073 }
b4c4a9ec
MM
2074 else if (current_function_decl
2075 && DECL_STATIC_FUNCTION_P (current_function_decl))
2076 {
9e637a26 2077 error ("%<this%> is unavailable for static member functions");
b4c4a9ec
MM
2078 result = error_mark_node;
2079 }
2080 else
2081 {
2082 if (current_function_decl)
9e637a26 2083 error ("invalid use of %<this%> in non-member function");
b4c4a9ec 2084 else
9e637a26 2085 error ("invalid use of %<this%> at top level");
b4c4a9ec
MM
2086 result = error_mark_node;
2087 }
2088
2089 return result;
2090}
2091
a723baf1
MM
2092/* Finish a pseudo-destructor expression. If SCOPE is NULL, the
2093 expression was of the form `OBJECT.~DESTRUCTOR' where DESTRUCTOR is
2094 the TYPE for the type given. If SCOPE is non-NULL, the expression
2095 was of the form `OBJECT.SCOPE::~DESTRUCTOR'. */
b4c4a9ec 2096
c8094d83 2097tree
3a978d72 2098finish_pseudo_destructor_expr (tree object, tree scope, tree destructor)
b4c4a9ec 2099{
09b1ccd6 2100 if (object == error_mark_node || destructor == error_mark_node)
a723baf1 2101 return error_mark_node;
40242ccf 2102
50bc768d 2103 gcc_assert (TYPE_P (destructor));
b4c4a9ec 2104
a723baf1
MM
2105 if (!processing_template_decl)
2106 {
2107 if (scope == error_mark_node)
2108 {
2109 error ("invalid qualifying scope in pseudo-destructor name");
2110 return error_mark_node;
2111 }
5cf10afb
AP
2112 if (scope && TYPE_P (scope) && !check_dtor_name (scope, destructor))
2113 {
2114 error ("qualified type %qT does not match destructor name ~%qT",
2115 scope, destructor);
2116 return error_mark_node;
2117 }
2118
c8094d83 2119
26bcf8fc
MM
2120 /* [expr.pseudo] says both:
2121
0cbd7506 2122 The type designated by the pseudo-destructor-name shall be
26bcf8fc
MM
2123 the same as the object type.
2124
0cbd7506 2125 and:
26bcf8fc 2126
0cbd7506 2127 The cv-unqualified versions of the object type and of the
26bcf8fc
MM
2128 type designated by the pseudo-destructor-name shall be the
2129 same type.
2130
0cbd7506
MS
2131 We implement the more generous second sentence, since that is
2132 what most other compilers do. */
c8094d83 2133 if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (object),
26bcf8fc 2134 destructor))
a723baf1 2135 {
a82e1a7d 2136 error ("%qE is not of type %qT", object, destructor);
a723baf1
MM
2137 return error_mark_node;
2138 }
2139 }
b4c4a9ec 2140
f293ce4b 2141 return build3 (PSEUDO_DTOR_EXPR, void_type_node, object, scope, destructor);
b4c4a9ec
MM
2142}
2143
ce4a0391
MM
2144/* Finish an expression of the form CODE EXPR. */
2145
2146tree
3a978d72 2147finish_unary_op_expr (enum tree_code code, tree expr)
ce4a0391 2148{
5ade1ed2 2149 tree result = build_x_unary_op (code, expr, tf_warning_or_error);
7c355bca
ML
2150 /* Inside a template, build_x_unary_op does not fold the
2151 expression. So check whether the result is folded before
2152 setting TREE_NEGATED_INT. */
2153 if (code == NEGATE_EXPR && TREE_CODE (expr) == INTEGER_CST
88b4335f 2154 && TREE_CODE (result) == INTEGER_CST
8df83eae 2155 && !TYPE_UNSIGNED (TREE_TYPE (result))
88b4335f 2156 && INT_CST_LT (result, integer_zero_node))
6fc98adf
MM
2157 {
2158 /* RESULT may be a cached INTEGER_CST, so we must copy it before
2159 setting TREE_NEGATED_INT. */
2160 result = copy_node (result);
2161 TREE_NEGATED_INT (result) = 1;
2162 }
59c0753d 2163 if (TREE_OVERFLOW_P (result) && !TREE_OVERFLOW_P (expr))
c2255bc4 2164 overflow_warning (input_location, result);
59c0753d 2165
ce4a0391
MM
2166 return result;
2167}
2168
a723baf1 2169/* Finish a compound-literal expression. TYPE is the type to which
09357846 2170 the CONSTRUCTOR in COMPOUND_LITERAL is being cast. */
a723baf1
MM
2171
2172tree
09357846 2173finish_compound_literal (tree type, tree compound_literal)
a723baf1 2174{
326a4d4e
JJ
2175 if (type == error_mark_node)
2176 return error_mark_node;
2177
2b643eda
MM
2178 if (!TYPE_OBJ_P (type))
2179 {
2180 error ("compound literal of non-object type %qT", type);
2181 return error_mark_node;
2182 }
2183
a723baf1 2184 if (processing_template_decl)
a723baf1 2185 {
e92fb501
MM
2186 TREE_TYPE (compound_literal) = type;
2187 /* Mark the expression as a compound literal. */
2188 TREE_HAS_CONSTRUCTOR (compound_literal) = 1;
2189 return compound_literal;
a723baf1
MM
2190 }
2191
df794884 2192 type = complete_type (type);
09357846
JM
2193
2194 if (TYPE_NON_AGGREGATE_CLASS (type))
2195 {
2196 /* Trying to deal with a CONSTRUCTOR instead of a TREE_LIST
2197 everywhere that deals with function arguments would be a pain, so
2198 just wrap it in a TREE_LIST. The parser set a flag so we know
2199 that it came from T{} rather than T({}). */
2200 CONSTRUCTOR_IS_DIRECT_INIT (compound_literal) = 1;
2201 compound_literal = build_tree_list (NULL_TREE, compound_literal);
2202 return build_functional_cast (type, compound_literal, tf_error);
2203 }
2204
23bee8f4
JJ
2205 if (TREE_CODE (type) == ARRAY_TYPE
2206 && check_array_initializer (NULL_TREE, type, compound_literal))
2207 return error_mark_node;
df794884
JM
2208 compound_literal = reshape_init (type, compound_literal);
2209 if (TREE_CODE (type) == ARRAY_TYPE)
2210 cp_complete_array_type (&type, compound_literal, false);
2211 compound_literal = digest_init (type, compound_literal);
a3360e77 2212 if ((!at_function_scope_p () || CP_TYPE_CONST_P (type))
09357846
JM
2213 && initializer_constant_valid_p (compound_literal, type))
2214 {
2215 tree decl = create_temporary_var (type);
2216 DECL_INITIAL (decl) = compound_literal;
2217 TREE_STATIC (decl) = 1;
1acb8caa 2218 cp_apply_type_quals_to_decl (cp_type_quals (type), decl);
09357846
JM
2219 decl = pushdecl_top_level (decl);
2220 DECL_NAME (decl) = make_anon_name ();
2221 SET_DECL_ASSEMBLER_NAME (decl, DECL_NAME (decl));
2222 return decl;
2223 }
2224 else
2225 return get_target_expr (compound_literal);
a723baf1
MM
2226}
2227
5f261ba9
MM
2228/* Return the declaration for the function-name variable indicated by
2229 ID. */
2230
2231tree
2232finish_fname (tree id)
2233{
2234 tree decl;
c8094d83 2235
3ba09659 2236 decl = fname_decl (input_location, C_RID_CODE (id), id);
5f261ba9 2237 if (processing_template_decl)
10b1d5e7 2238 decl = DECL_NAME (decl);
5f261ba9
MM
2239 return decl;
2240}
2241
8014a339 2242/* Finish a translation unit. */
ce4a0391 2243
c8094d83 2244void
3a978d72 2245finish_translation_unit (void)
ce4a0391
MM
2246{
2247 /* In case there were missing closebraces,
2248 get us back to the global binding level. */
273a708f 2249 pop_everything ();
ce4a0391
MM
2250 while (current_namespace != global_namespace)
2251 pop_namespace ();
0ba8a114 2252
c6002625 2253 /* Do file scope __FUNCTION__ et al. */
0ba8a114 2254 finish_fname_decls ();
ce4a0391
MM
2255}
2256
b4c4a9ec
MM
2257/* Finish a template type parameter, specified as AGGR IDENTIFIER.
2258 Returns the parameter. */
2259
c8094d83 2260tree
3a978d72 2261finish_template_type_parm (tree aggr, tree identifier)
b4c4a9ec 2262{
6eabb241 2263 if (aggr != class_type_node)
b4c4a9ec 2264 {
cbe5f3b3 2265 permerror (input_location, "template type parameters must use the keyword %<class%> or %<typename%>");
b4c4a9ec
MM
2266 aggr = class_type_node;
2267 }
2268
2269 return build_tree_list (aggr, identifier);
2270}
2271
2272/* Finish a template template parameter, specified as AGGR IDENTIFIER.
2273 Returns the parameter. */
2274
c8094d83 2275tree
3a978d72 2276finish_template_template_parm (tree aggr, tree identifier)
b4c4a9ec 2277{
c2255bc4
AH
2278 tree decl = build_decl (input_location,
2279 TYPE_DECL, identifier, NULL_TREE);
b4c4a9ec
MM
2280 tree tmpl = build_lang_decl (TEMPLATE_DECL, identifier, NULL_TREE);
2281 DECL_TEMPLATE_PARMS (tmpl) = current_template_parms;
2282 DECL_TEMPLATE_RESULT (tmpl) = decl;
c727aa5e 2283 DECL_ARTIFICIAL (decl) = 1;
b4c4a9ec
MM
2284 end_template_decl ();
2285
50bc768d 2286 gcc_assert (DECL_TEMPLATE_PARMS (tmpl));
b37bf5bd 2287
85d85234
DG
2288 check_default_tmpl_args (decl, DECL_TEMPLATE_PARMS (tmpl),
2289 /*is_primary=*/true, /*is_partial=*/false,
2290 /*is_friend=*/0);
2291
b4c4a9ec
MM
2292 return finish_template_type_parm (aggr, tmpl);
2293}
ce4a0391 2294
8ba658ee
MM
2295/* ARGUMENT is the default-argument value for a template template
2296 parameter. If ARGUMENT is invalid, issue error messages and return
2297 the ERROR_MARK_NODE. Otherwise, ARGUMENT itself is returned. */
2298
2299tree
2300check_template_template_default_arg (tree argument)
2301{
2302 if (TREE_CODE (argument) != TEMPLATE_DECL
2303 && TREE_CODE (argument) != TEMPLATE_TEMPLATE_PARM
8ba658ee
MM
2304 && TREE_CODE (argument) != UNBOUND_CLASS_TEMPLATE)
2305 {
a3a503a5 2306 if (TREE_CODE (argument) == TYPE_DECL)
e488a090
VR
2307 error ("invalid use of type %qT as a default value for a template "
2308 "template-parameter", TREE_TYPE (argument));
a3a503a5
GB
2309 else
2310 error ("invalid default argument for a template template parameter");
8ba658ee
MM
2311 return error_mark_node;
2312 }
2313
2314 return argument;
2315}
2316
ce4a0391
MM
2317/* Begin a class definition, as indicated by T. */
2318
2319tree
b9e75696 2320begin_class_definition (tree t, tree attributes)
ce4a0391 2321{
7d2f0ecd 2322 if (error_operand_p (t) || error_operand_p (TYPE_MAIN_DECL (t)))
7437519c
ZW
2323 return error_mark_node;
2324
522d6614
NS
2325 if (processing_template_parmlist)
2326 {
a82e1a7d 2327 error ("definition of %q#T inside template parameter list", t);
522d6614
NS
2328 return error_mark_node;
2329 }
ebf0bf7f
JJ
2330
2331 /* According to the C++ ABI, decimal classes defined in ISO/IEC TR 24733
2332 are passed the same as decimal scalar types. */
cd924144
JM
2333 if (TREE_CODE (t) == RECORD_TYPE
2334 && !processing_template_decl)
ebf0bf7f 2335 {
cd924144
JM
2336 tree ns = TYPE_CONTEXT (t);
2337 if (ns && TREE_CODE (ns) == NAMESPACE_DECL
2338 && DECL_CONTEXT (ns) == std_node
935c0a5d 2339 && DECL_NAME (ns)
cd924144
JM
2340 && !strcmp (IDENTIFIER_POINTER (DECL_NAME (ns)), "decimal"))
2341 {
2342 const char *n = TYPE_NAME_STRING (t);
2343 if ((strcmp (n, "decimal32") == 0)
2344 || (strcmp (n, "decimal64") == 0)
2345 || (strcmp (n, "decimal128") == 0))
2346 TYPE_TRANSPARENT_AGGR (t) = 1;
2347 }
ebf0bf7f
JJ
2348 }
2349
47ee8904
MM
2350 /* A non-implicit typename comes from code like:
2351
2352 template <typename T> struct A {
0cbd7506 2353 template <typename U> struct A<T>::B ...
47ee8904
MM
2354
2355 This is erroneous. */
2356 else if (TREE_CODE (t) == TYPENAME_TYPE)
2357 {
a82e1a7d 2358 error ("invalid definition of qualified type %qT", t);
47ee8904
MM
2359 t = error_mark_node;
2360 }
2361
9e1e64ec 2362 if (t == error_mark_node || ! MAYBE_CLASS_TYPE_P (t))
ce4a0391 2363 {
9e1e64ec 2364 t = make_class_type (RECORD_TYPE);
bd3d082e 2365 pushtag (make_anon_name (), t, /*tag_scope=*/ts_current);
ce4a0391 2366 }
830fcda8 2367
4c571114 2368 if (TYPE_BEING_DEFINED (t))
ce4a0391 2369 {
9e1e64ec 2370 t = make_class_type (TREE_CODE (t));
bd3d082e 2371 pushtag (TYPE_IDENTIFIER (t), t, /*tag_scope=*/ts_current);
ce4a0391 2372 }
ff350acd 2373 maybe_process_partial_specialization (t);
29370796 2374 pushclass (t);
ce4a0391 2375 TYPE_BEING_DEFINED (t) = 1;
b9e75696
JM
2376
2377 cplus_decl_attributes (&t, attributes, (int) ATTR_FLAG_TYPE_IN_PLACE);
2378
c0694c4b
MM
2379 if (flag_pack_struct)
2380 {
2381 tree v;
2382 TYPE_PACKED (t) = 1;
2383 /* Even though the type is being defined for the first time
2384 here, there might have been a forward declaration, so there
2385 might be cv-qualified variants of T. */
2386 for (v = TYPE_NEXT_VARIANT (t); v; v = TYPE_NEXT_VARIANT (v))
2387 TYPE_PACKED (v) = 1;
2388 }
ce4a0391
MM
2389 /* Reset the interface data, at the earliest possible
2390 moment, as it might have been set via a class foo;
2391 before. */
1951a1b6
JM
2392 if (! TYPE_ANONYMOUS_P (t))
2393 {
c533e34d 2394 struct c_fileinfo *finfo = get_fileinfo (input_filename);
5d709b00 2395 CLASSTYPE_INTERFACE_ONLY (t) = finfo->interface_only;
1951a1b6 2396 SET_CLASSTYPE_INTERFACE_UNKNOWN_X
5d709b00 2397 (t, finfo->interface_unknown);
1951a1b6 2398 }
ce4a0391 2399 reset_specialization();
c8094d83 2400
b7975aed
MM
2401 /* Make a declaration for this class in its own scope. */
2402 build_self_reference ();
2403
830fcda8 2404 return t;
ce4a0391
MM
2405}
2406
61a127b3
MM
2407/* Finish the member declaration given by DECL. */
2408
2409void
3a978d72 2410finish_member_declaration (tree decl)
61a127b3
MM
2411{
2412 if (decl == error_mark_node || decl == NULL_TREE)
2413 return;
2414
2415 if (decl == void_type_node)
2416 /* The COMPONENT was a friend, not a member, and so there's
2417 nothing for us to do. */
2418 return;
2419
2420 /* We should see only one DECL at a time. */
50bc768d 2421 gcc_assert (TREE_CHAIN (decl) == NULL_TREE);
61a127b3
MM
2422
2423 /* Set up access control for DECL. */
c8094d83 2424 TREE_PRIVATE (decl)
61a127b3 2425 = (current_access_specifier == access_private_node);
c8094d83 2426 TREE_PROTECTED (decl)
61a127b3
MM
2427 = (current_access_specifier == access_protected_node);
2428 if (TREE_CODE (decl) == TEMPLATE_DECL)
2429 {
17aec3eb
RK
2430 TREE_PRIVATE (DECL_TEMPLATE_RESULT (decl)) = TREE_PRIVATE (decl);
2431 TREE_PROTECTED (DECL_TEMPLATE_RESULT (decl)) = TREE_PROTECTED (decl);
61a127b3
MM
2432 }
2433
2434 /* Mark the DECL as a member of the current class. */
4f1c5b7d 2435 DECL_CONTEXT (decl) = current_class_type;
61a127b3 2436
b1d7b1c0 2437 /* Check for bare parameter packs in the member variable declaration. */
1ad8aeeb 2438 if (TREE_CODE (decl) == FIELD_DECL)
4439d02f 2439 {
7b3e2d46 2440 if (check_for_bare_parameter_packs (TREE_TYPE (decl)))
4439d02f 2441 TREE_TYPE (decl) = error_mark_node;
7b3e2d46 2442 if (check_for_bare_parameter_packs (DECL_ATTRIBUTES (decl)))
4439d02f
DG
2443 DECL_ATTRIBUTES (decl) = NULL_TREE;
2444 }
b1d7b1c0 2445
421844e7
MM
2446 /* [dcl.link]
2447
2448 A C language linkage is ignored for the names of class members
2449 and the member function type of class member functions. */
2450 if (DECL_LANG_SPECIFIC (decl) && DECL_LANGUAGE (decl) == lang_c)
5d2ed28c 2451 SET_DECL_LANGUAGE (decl, lang_cplusplus);
421844e7 2452
61a127b3
MM
2453 /* Put functions on the TYPE_METHODS list and everything else on the
2454 TYPE_FIELDS list. Note that these are built up in reverse order.
2455 We reverse them (to obtain declaration order) in finish_struct. */
c8094d83 2456 if (TREE_CODE (decl) == FUNCTION_DECL
61a127b3
MM
2457 || DECL_FUNCTION_TEMPLATE_P (decl))
2458 {
2459 /* We also need to add this function to the
2460 CLASSTYPE_METHOD_VEC. */
b77fe7b4
NS
2461 if (add_method (current_class_type, decl, NULL_TREE))
2462 {
2463 TREE_CHAIN (decl) = TYPE_METHODS (current_class_type);
2464 TYPE_METHODS (current_class_type) = decl;
f139561c 2465
b77fe7b4
NS
2466 maybe_add_class_template_decl_list (current_class_type, decl,
2467 /*friend_p=*/0);
2468 }
61a127b3 2469 }
f139561c 2470 /* Enter the DECL into the scope of the class. */
98ed9dae 2471 else if ((TREE_CODE (decl) == USING_DECL && !DECL_DEPENDENT_P (decl))
399dedb9 2472 || pushdecl_class_level (decl))
61a127b3
MM
2473 {
2474 /* All TYPE_DECLs go at the end of TYPE_FIELDS. Ordinary fields
2475 go at the beginning. The reason is that lookup_field_1
2476 searches the list in order, and we want a field name to
2477 override a type name so that the "struct stat hack" will
2478 work. In particular:
2479
2480 struct S { enum E { }; int E } s;
2481 s.E = 3;
2482
0e339752 2483 is valid. In addition, the FIELD_DECLs must be maintained in
61a127b3
MM
2484 declaration order so that class layout works as expected.
2485 However, we don't need that order until class layout, so we
2486 save a little time by putting FIELD_DECLs on in reverse order
2487 here, and then reversing them in finish_struct_1. (We could
2488 also keep a pointer to the correct insertion points in the
2489 list.) */
2490
2491 if (TREE_CODE (decl) == TYPE_DECL)
c8094d83 2492 TYPE_FIELDS (current_class_type)
61a127b3
MM
2493 = chainon (TYPE_FIELDS (current_class_type), decl);
2494 else
2495 {
2496 TREE_CHAIN (decl) = TYPE_FIELDS (current_class_type);
2497 TYPE_FIELDS (current_class_type) = decl;
2498 }
8f032717 2499
c8094d83 2500 maybe_add_class_template_decl_list (current_class_type, decl,
f139561c 2501 /*friend_p=*/0);
61a127b3 2502 }
5e2f4cd2
MM
2503
2504 if (pch_file)
2505 note_decl_for_pch (decl);
2506}
2507
2508/* DECL has been declared while we are building a PCH file. Perform
2509 actions that we might normally undertake lazily, but which can be
2510 performed now so that they do not have to be performed in
2511 translation units which include the PCH file. */
2512
2513void
2514note_decl_for_pch (tree decl)
2515{
2516 gcc_assert (pch_file);
2517
5e2f4cd2
MM
2518 /* There's a good chance that we'll have to mangle names at some
2519 point, even if only for emission in debugging information. */
ec0897de
JM
2520 if ((TREE_CODE (decl) == VAR_DECL
2521 || TREE_CODE (decl) == FUNCTION_DECL)
2522 && !processing_template_decl)
5e2f4cd2 2523 mangle_decl (decl);
61a127b3
MM
2524}
2525
306ef644 2526/* Finish processing a complete template declaration. The PARMS are
36a117a5
MM
2527 the template parameters. */
2528
2529void
3a978d72 2530finish_template_decl (tree parms)
36a117a5
MM
2531{
2532 if (parms)
2533 end_template_decl ();
2534 else
2535 end_specialization ();
2536}
2537
509fc277 2538/* Finish processing a template-id (which names a type) of the form
36a117a5 2539 NAME < ARGS >. Return the TYPE_DECL for the type named by the
838dfd8a 2540 template-id. If ENTERING_SCOPE is nonzero we are about to enter
36a117a5
MM
2541 the scope of template-id indicated. */
2542
2543tree
3a978d72 2544finish_template_type (tree name, tree args, int entering_scope)
36a117a5
MM
2545{
2546 tree decl;
2547
2548 decl = lookup_template_class (name, args,
42eaed49 2549 NULL_TREE, NULL_TREE, entering_scope,
23fca1f5 2550 tf_warning_or_error | tf_user);
36a117a5
MM
2551 if (decl != error_mark_node)
2552 decl = TYPE_STUB_DECL (decl);
2553
2554 return decl;
2555}
648f19f6 2556
ea6021e8
MM
2557/* Finish processing a BASE_CLASS with the indicated ACCESS_SPECIFIER.
2558 Return a TREE_LIST containing the ACCESS_SPECIFIER and the
2559 BASE_CLASS, or NULL_TREE if an error occurred. The
aba649ba 2560 ACCESS_SPECIFIER is one of
809e3e7f
NS
2561 access_{default,public,protected_private}_node. For a virtual base
2562 we set TREE_TYPE. */
ea6021e8 2563
c8094d83 2564tree
dbbf88d1 2565finish_base_specifier (tree base, tree access, bool virtual_p)
ea6021e8 2566{
ea6021e8
MM
2567 tree result;
2568
dbbf88d1 2569 if (base == error_mark_node)
acb044ee
GDR
2570 {
2571 error ("invalid base-class specification");
2572 result = NULL_TREE;
2573 }
9e1e64ec
PC
2574 else if (! MAYBE_CLASS_TYPE_P (base))
2575 {
2576 error ("%qT is not a class type", base);
2577 result = NULL_TREE;
2578 }
ea6021e8 2579 else
bb92901d 2580 {
dbbf88d1 2581 if (cp_type_quals (base) != 0)
0cbd7506
MS
2582 {
2583 error ("base class %qT has cv qualifiers", base);
2584 base = TYPE_MAIN_VARIANT (base);
2585 }
dbbf88d1 2586 result = build_tree_list (access, base);
809e3e7f
NS
2587 if (virtual_p)
2588 TREE_TYPE (result) = integer_type_node;
bb92901d 2589 }
ea6021e8
MM
2590
2591 return result;
2592}
61a127b3 2593
8f78f01f 2594/* Issue a diagnostic that NAME cannot be found in SCOPE. DECL is
2b7a3abf
DS
2595 what we found when we tried to do the lookup.
2596 LOCATION is the location of the NAME identifier;
2597 The location is used in the error message*/
22038b2c
NS
2598
2599void
2b7a3abf
DS
2600qualified_name_lookup_error (tree scope, tree name,
2601 tree decl, location_t location)
22038b2c 2602{
1e1b4b37
VR
2603 if (scope == error_mark_node)
2604 ; /* We already complained. */
2605 else if (TYPE_P (scope))
22038b2c
NS
2606 {
2607 if (!COMPLETE_TYPE_P (scope))
69bc6bff
MLI
2608 error_at (location, "incomplete type %qT used in nested name specifier",
2609 scope);
8f78f01f
MM
2610 else if (TREE_CODE (decl) == TREE_LIST)
2611 {
69bc6bff
MLI
2612 error_at (location, "reference to %<%T::%D%> is ambiguous",
2613 scope, name);
8f78f01f
MM
2614 print_candidates (decl);
2615 }
22038b2c 2616 else
69bc6bff 2617 error_at (location, "%qD is not a member of %qT", name, scope);
22038b2c
NS
2618 }
2619 else if (scope != global_namespace)
69bc6bff 2620 error_at (location, "%qD is not a member of %qD", name, scope);
22038b2c 2621 else
69bc6bff 2622 error_at (location, "%<::%D%> has not been declared", name);
22038b2c 2623}
c8094d83 2624
eff3a276
MM
2625/* If FNS is a member function, a set of member functions, or a
2626 template-id referring to one or more member functions, return a
2627 BASELINK for FNS, incorporating the current access context.
2628 Otherwise, return FNS unchanged. */
2629
2630tree
2631baselink_for_fns (tree fns)
2632{
2633 tree fn;
2634 tree cl;
2635
2636 if (BASELINK_P (fns)
eff3a276
MM
2637 || error_operand_p (fns))
2638 return fns;
2639
2640 fn = fns;
2641 if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
2642 fn = TREE_OPERAND (fn, 0);
2643 fn = get_first_fn (fn);
2644 if (!DECL_FUNCTION_MEMBER_P (fn))
2645 return fns;
2646
2647 cl = currently_open_derived_class (DECL_CONTEXT (fn));
2648 if (!cl)
2649 cl = DECL_CONTEXT (fn);
2650 cl = TYPE_BINFO (cl);
5a40306b 2651 return build_baselink (cl, cl, fns, /*optype=*/NULL_TREE);
eff3a276
MM
2652}
2653
d5f4eddd
JM
2654/* Returns true iff DECL is an automatic variable from a function outside
2655 the current one. */
2656
2657static bool
2658outer_automatic_var_p (tree decl)
2659{
2660 return ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == PARM_DECL)
2661 && DECL_FUNCTION_SCOPE_P (decl)
2662 && !TREE_STATIC (decl)
2663 && DECL_CONTEXT (decl) != current_function_decl);
2664}
2665
9660afe0
JM
2666/* Returns true iff DECL is a capture field from a lambda that is not our
2667 immediate context. */
2668
2669static bool
2670outer_lambda_capture_p (tree decl)
2671{
2672 return (TREE_CODE (decl) == FIELD_DECL
2673 && LAMBDA_TYPE_P (DECL_CONTEXT (decl))
19030d77
JM
2674 && (!current_class_type
2675 || !DERIVED_FROM_P (DECL_CONTEXT (decl), current_class_type)));
9660afe0
JM
2676}
2677
b3445994
MM
2678/* ID_EXPRESSION is a representation of parsed, but unprocessed,
2679 id-expression. (See cp_parser_id_expression for details.) SCOPE,
2680 if non-NULL, is the type or namespace used to explicitly qualify
2681 ID_EXPRESSION. DECL is the entity to which that name has been
c8094d83 2682 resolved.
b3445994
MM
2683
2684 *CONSTANT_EXPRESSION_P is true if we are presently parsing a
2685 constant-expression. In that case, *NON_CONSTANT_EXPRESSION_P will
2686 be set to true if this expression isn't permitted in a
2687 constant-expression, but it is otherwise not set by this function.
2688 *ALLOW_NON_CONSTANT_EXPRESSION_P is true if we are parsing a
2689 constant-expression, but a non-constant expression is also
2690 permissible.
2691
02ed62dd
MM
2692 DONE is true if this expression is a complete postfix-expression;
2693 it is false if this expression is followed by '->', '[', '(', etc.
2694 ADDRESS_P is true iff this expression is the operand of '&'.
2695 TEMPLATE_P is true iff the qualified-id was of the form
2696 "A::template B". TEMPLATE_ARG_P is true iff this qualified name
2697 appears as a template argument.
2698
b3445994
MM
2699 If an error occurs, and it is the kind of error that might cause
2700 the parser to abort a tentative parse, *ERROR_MSG is filled in. It
2701 is the caller's responsibility to issue the message. *ERROR_MSG
2702 will be a string with static storage duration, so the caller need
2703 not "free" it.
2704
2705 Return an expression for the entity, after issuing appropriate
2706 diagnostics. This function is also responsible for transforming a
2707 reference to a non-static member into a COMPONENT_REF that makes
c8094d83 2708 the use of "this" explicit.
b3445994
MM
2709
2710 Upon return, *IDK will be filled in appropriately. */
b3445994 2711tree
c8094d83 2712finish_id_expression (tree id_expression,
b3445994
MM
2713 tree decl,
2714 tree scope,
2715 cp_id_kind *idk,
67c03833
JM
2716 bool integral_constant_expression_p,
2717 bool allow_non_integral_constant_expression_p,
2718 bool *non_integral_constant_expression_p,
02ed62dd
MM
2719 bool template_p,
2720 bool done,
2721 bool address_p,
2722 bool template_arg_p,
2b7a3abf
DS
2723 const char **error_msg,
2724 location_t location)
b3445994
MM
2725{
2726 /* Initialize the output parameters. */
2727 *idk = CP_ID_KIND_NONE;
2728 *error_msg = NULL;
2729
2730 if (id_expression == error_mark_node)
2731 return error_mark_node;
2732 /* If we have a template-id, then no further lookup is
2733 required. If the template-id was for a template-class, we
2734 will sometimes have a TYPE_DECL at this point. */
2735 else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
ee935db4 2736 || TREE_CODE (decl) == TYPE_DECL)
b3445994
MM
2737 ;
2738 /* Look up the name. */
c8094d83 2739 else
b3445994
MM
2740 {
2741 if (decl == error_mark_node)
2742 {
2743 /* Name lookup failed. */
c8094d83
MS
2744 if (scope
2745 && (!TYPE_P (scope)
4546865e
MM
2746 || (!dependent_type_p (scope)
2747 && !(TREE_CODE (id_expression) == IDENTIFIER_NODE
2748 && IDENTIFIER_TYPENAME_P (id_expression)
2749 && dependent_type_p (TREE_TYPE (id_expression))))))
b3445994 2750 {
4546865e
MM
2751 /* If the qualifying type is non-dependent (and the name
2752 does not name a conversion operator to a dependent
2753 type), issue an error. */
2b7a3abf 2754 qualified_name_lookup_error (scope, id_expression, decl, location);
b3445994
MM
2755 return error_mark_node;
2756 }
2757 else if (!scope)
2758 {
2759 /* It may be resolved via Koenig lookup. */
2760 *idk = CP_ID_KIND_UNQUALIFIED;
2761 return id_expression;
2762 }
4546865e
MM
2763 else
2764 decl = id_expression;
b3445994
MM
2765 }
2766 /* If DECL is a variable that would be out of scope under
2767 ANSI/ISO rules, but in scope in the ARM, name lookup
2768 will succeed. Issue a diagnostic here. */
2769 else
2770 decl = check_for_out_of_scope_variable (decl);
2771
2772 /* Remember that the name was used in the definition of
2773 the current class so that we can check later to see if
2774 the meaning would have been different after the class
2775 was entirely defined. */
2776 if (!scope && decl != error_mark_node)
2777 maybe_note_name_used_in_class (id_expression, decl);
8ca4bf25 2778
d5f4eddd
JM
2779 /* Disallow uses of local variables from containing functions, except
2780 within lambda-expressions. */
9660afe0
JM
2781 if ((outer_automatic_var_p (decl)
2782 || outer_lambda_capture_p (decl))
d5f4eddd
JM
2783 /* It's not a use (3.2) if we're in an unevaluated context. */
2784 && !cp_unevaluated_operand)
8ca4bf25 2785 {
d5f4eddd
JM
2786 tree context = DECL_CONTEXT (decl);
2787 tree containing_function = current_function_decl;
2788 tree lambda_stack = NULL_TREE;
2789 tree lambda_expr = NULL_TREE;
9660afe0 2790 tree initializer = decl;
d5f4eddd
JM
2791
2792 /* Core issue 696: "[At the July 2009 meeting] the CWG expressed
2793 support for an approach in which a reference to a local
2794 [constant] automatic variable in a nested class or lambda body
2795 would enter the expression as an rvalue, which would reduce
2796 the complexity of the problem"
2797
2798 FIXME update for final resolution of core issue 696. */
2799 if (DECL_INTEGRAL_CONSTANT_VAR_P (decl))
2800 return integral_constant_value (decl);
2801
9660afe0
JM
2802 if (TYPE_P (context))
2803 {
2804 /* Implicit capture of an explicit capture. */
2805 context = lambda_function (context);
2806 initializer = thisify_lambda_field (decl);
2807 }
2808
d5f4eddd
JM
2809 /* If we are in a lambda function, we can move out until we hit
2810 1. the context,
2811 2. a non-lambda function, or
2812 3. a non-default capturing lambda function. */
2813 while (context != containing_function
2814 && LAMBDA_FUNCTION_P (containing_function))
2815 {
2816 lambda_expr = CLASSTYPE_LAMBDA_EXPR
2817 (DECL_CONTEXT (containing_function));
2818
2819 if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr)
2820 == CPLD_NONE)
2821 break;
2822
2823 lambda_stack = tree_cons (NULL_TREE,
2824 lambda_expr,
2825 lambda_stack);
2826
2827 containing_function
2828 = decl_function_context (containing_function);
2829 }
2830
2831 if (context == containing_function)
2832 {
2833 decl = add_default_capture (lambda_stack,
2834 /*id=*/DECL_NAME (decl),
9660afe0 2835 initializer);
d5f4eddd
JM
2836 }
2837 else if (lambda_expr)
2838 {
2839 error ("%qD is not captured", decl);
2840 return error_mark_node;
2841 }
2842 else
8ca4bf25
MM
2843 {
2844 error (TREE_CODE (decl) == VAR_DECL
2845 ? "use of %<auto%> variable from containing function"
2846 : "use of parameter from containing function");
2847 error (" %q+#D declared here", decl);
2848 return error_mark_node;
2849 }
2850 }
b3445994
MM
2851 }
2852
2853 /* If we didn't find anything, or what we found was a type,
2854 then this wasn't really an id-expression. */
2855 if (TREE_CODE (decl) == TEMPLATE_DECL
2856 && !DECL_FUNCTION_TEMPLATE_P (decl))
2857 {
2858 *error_msg = "missing template arguments";
2859 return error_mark_node;
2860 }
2861 else if (TREE_CODE (decl) == TYPE_DECL
2862 || TREE_CODE (decl) == NAMESPACE_DECL)
2863 {
2864 *error_msg = "expected primary-expression";
2865 return error_mark_node;
2866 }
2867
2868 /* If the name resolved to a template parameter, there is no
931a9c05
GB
2869 need to look it up again later. */
2870 if ((TREE_CODE (decl) == CONST_DECL && DECL_TEMPLATE_PARM_P (decl))
2871 || TREE_CODE (decl) == TEMPLATE_PARM_INDEX)
b3445994 2872 {
db24eb1f 2873 tree r;
c8094d83 2874
b3445994 2875 *idk = CP_ID_KIND_NONE;
931a9c05
GB
2876 if (TREE_CODE (decl) == TEMPLATE_PARM_INDEX)
2877 decl = TEMPLATE_PARM_DECL (decl);
db24eb1f 2878 r = convert_from_reference (DECL_INITIAL (decl));
c8094d83
MS
2879
2880 if (integral_constant_expression_p
68deab91 2881 && !dependent_type_p (TREE_TYPE (decl))
db24eb1f 2882 && !(INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (r))))
931a9c05 2883 {
67c03833 2884 if (!allow_non_integral_constant_expression_p)
a82e1a7d 2885 error ("template parameter %qD of type %qT is not allowed in "
931a9c05
GB
2886 "an integral constant expression because it is not of "
2887 "integral or enumeration type", decl, TREE_TYPE (decl));
67c03833 2888 *non_integral_constant_expression_p = true;
931a9c05 2889 }
db24eb1f 2890 return r;
931a9c05 2891 }
c8094d83 2892 /* Similarly, we resolve enumeration constants to their
931a9c05
GB
2893 underlying values. */
2894 else if (TREE_CODE (decl) == CONST_DECL)
2895 {
2896 *idk = CP_ID_KIND_NONE;
2897 if (!processing_template_decl)
6193b8b7
DJ
2898 {
2899 used_types_insert (TREE_TYPE (decl));
2900 return DECL_INITIAL (decl);
2901 }
b3445994
MM
2902 return decl;
2903 }
2904 else
2905 {
2906 bool dependent_p;
2907
2908 /* If the declaration was explicitly qualified indicate
2909 that. The semantics of `A::f(3)' are different than
2910 `f(3)' if `f' is virtual. */
c8094d83 2911 *idk = (scope
b3445994
MM
2912 ? CP_ID_KIND_QUALIFIED
2913 : (TREE_CODE (decl) == TEMPLATE_ID_EXPR
2914 ? CP_ID_KIND_TEMPLATE_ID
2915 : CP_ID_KIND_UNQUALIFIED));
2916
2917
2918 /* [temp.dep.expr]
2919
2920 An id-expression is type-dependent if it contains an
2921 identifier that was declared with a dependent type.
2922
b3445994
MM
2923 The standard is not very specific about an id-expression that
2924 names a set of overloaded functions. What if some of them
2925 have dependent types and some of them do not? Presumably,
2926 such a name should be treated as a dependent name. */
2927 /* Assume the name is not dependent. */
2928 dependent_p = false;
2929 if (!processing_template_decl)
2930 /* No names are dependent outside a template. */
2931 ;
2932 /* A template-id where the name of the template was not resolved
2933 is definitely dependent. */
2934 else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
c8094d83 2935 && (TREE_CODE (TREE_OPERAND (decl, 0))
b3445994
MM
2936 == IDENTIFIER_NODE))
2937 dependent_p = true;
2938 /* For anything except an overloaded function, just check its
2939 type. */
2940 else if (!is_overloaded_fn (decl))
c8094d83 2941 dependent_p
b3445994
MM
2942 = dependent_type_p (TREE_TYPE (decl));
2943 /* For a set of overloaded functions, check each of the
2944 functions. */
2945 else
2946 {
2947 tree fns = decl;
2948
2949 if (BASELINK_P (fns))
2950 fns = BASELINK_FUNCTIONS (fns);
2951
2952 /* For a template-id, check to see if the template
2953 arguments are dependent. */
2954 if (TREE_CODE (fns) == TEMPLATE_ID_EXPR)
2955 {
2956 tree args = TREE_OPERAND (fns, 1);
2957 dependent_p = any_dependent_template_arguments_p (args);
2958 /* The functions are those referred to by the
2959 template-id. */
2960 fns = TREE_OPERAND (fns, 0);
2961 }
2962
2963 /* If there are no dependent template arguments, go through
cd0be382 2964 the overloaded functions. */
b3445994
MM
2965 while (fns && !dependent_p)
2966 {
2967 tree fn = OVL_CURRENT (fns);
2968
2969 /* Member functions of dependent classes are
2970 dependent. */
2971 if (TREE_CODE (fn) == FUNCTION_DECL
2972 && type_dependent_expression_p (fn))
2973 dependent_p = true;
2974 else if (TREE_CODE (fn) == TEMPLATE_DECL
2975 && dependent_template_p (fn))
2976 dependent_p = true;
2977
2978 fns = OVL_NEXT (fns);
2979 }
2980 }
2981
2982 /* If the name was dependent on a template parameter, we will
2983 resolve the name at instantiation time. */
2984 if (dependent_p)
2985 {
2986 /* Create a SCOPE_REF for qualified names, if the scope is
2987 dependent. */
2988 if (scope)
2989 {
02ed62dd
MM
2990 if (TYPE_P (scope))
2991 {
2992 if (address_p && done)
2993 decl = finish_qualified_id_expr (scope, decl,
2994 done, address_p,
2995 template_p,
2996 template_arg_p);
7e361ae6
JM
2997 else
2998 {
2999 tree type = NULL_TREE;
3000 if (DECL_P (decl) && !dependent_scope_p (scope))
3001 type = TREE_TYPE (decl);
3002 decl = build_qualified_name (type,
3003 scope,
3004 id_expression,
3005 template_p);
3006 }
02ed62dd
MM
3007 }
3008 if (TREE_TYPE (decl))
3009 decl = convert_from_reference (decl);
3010 return decl;
b3445994
MM
3011 }
3012 /* A TEMPLATE_ID already contains all the information we
3013 need. */
3014 if (TREE_CODE (id_expression) == TEMPLATE_ID_EXPR)
3015 return id_expression;
10b1d5e7 3016 *idk = CP_ID_KIND_UNQUALIFIED_DEPENDENT;
5a98fa7b
MM
3017 /* If we found a variable, then name lookup during the
3018 instantiation will always resolve to the same VAR_DECL
3019 (or an instantiation thereof). */
3c398f34
MM
3020 if (TREE_CODE (decl) == VAR_DECL
3021 || TREE_CODE (decl) == PARM_DECL)
db24eb1f 3022 return convert_from_reference (decl);
bad1f462
KL
3023 /* The same is true for FIELD_DECL, but we also need to
3024 make sure that the syntax is correct. */
3025 else if (TREE_CODE (decl) == FIELD_DECL)
a26ddf11
KL
3026 {
3027 /* Since SCOPE is NULL here, this is an unqualified name.
3028 Access checking has been performed during name lookup
3029 already. Turn off checking to avoid duplicate errors. */
3030 push_deferring_access_checks (dk_no_check);
3031 decl = finish_non_static_data_member
2defb926 3032 (decl, NULL_TREE,
a26ddf11
KL
3033 /*qualifying_scope=*/NULL_TREE);
3034 pop_deferring_access_checks ();
3035 return decl;
3036 }
10b1d5e7 3037 return id_expression;
b3445994
MM
3038 }
3039
3040 /* Only certain kinds of names are allowed in constant
0cbd7506
MS
3041 expression. Enumerators and template parameters have already
3042 been handled above. */
c30b4add 3043 if (integral_constant_expression_p
100d337a
MA
3044 && ! DECL_INTEGRAL_CONSTANT_VAR_P (decl)
3045 && ! builtin_valid_in_constant_expr_p (decl))
b3445994 3046 {
c30b4add 3047 if (!allow_non_integral_constant_expression_p)
b3445994 3048 {
a82e1a7d 3049 error ("%qD cannot appear in a constant-expression", decl);
c30b4add 3050 return error_mark_node;
b3445994 3051 }
c30b4add 3052 *non_integral_constant_expression_p = true;
b3445994 3053 }
c8094d83 3054
415d4636 3055 if (TREE_CODE (decl) == NAMESPACE_DECL)
9e95d15f 3056 {
a82e1a7d 3057 error ("use of namespace %qD as expression", decl);
9e95d15f
NS
3058 return error_mark_node;
3059 }
3060 else if (DECL_CLASS_TEMPLATE_P (decl))
3061 {
a82e1a7d 3062 error ("use of class template %qT as expression", decl);
9e95d15f
NS
3063 return error_mark_node;
3064 }
3065 else if (TREE_CODE (decl) == TREE_LIST)
3066 {
3067 /* Ambiguous reference to base members. */
a82e1a7d 3068 error ("request for member %qD is ambiguous in "
9e95d15f
NS
3069 "multiple inheritance lattice", id_expression);
3070 print_candidates (decl);
3071 return error_mark_node;
3072 }
415d4636
MM
3073
3074 /* Mark variable-like entities as used. Functions are similarly
3075 marked either below or after overload resolution. */
3076 if (TREE_CODE (decl) == VAR_DECL
3077 || TREE_CODE (decl) == PARM_DECL
3078 || TREE_CODE (decl) == RESULT_DECL)
3079 mark_used (decl);
3080
3081 if (scope)
3082 {
c8094d83 3083 decl = (adjust_result_of_qualified_name_lookup
415d4636 3084 (decl, scope, current_class_type));
e20bcc5e
JH
3085
3086 if (TREE_CODE (decl) == FUNCTION_DECL)
3087 mark_used (decl);
3088
415d4636 3089 if (TREE_CODE (decl) == FIELD_DECL || BASELINK_P (decl))
02ed62dd
MM
3090 decl = finish_qualified_id_expr (scope,
3091 decl,
3092 done,
3093 address_p,
3094 template_p,
3095 template_arg_p);
db24eb1f
NS
3096 else
3097 {
3098 tree r = convert_from_reference (decl);
c8094d83 3099
d3a79fcc
JM
3100 /* In a template, return a SCOPE_REF for most qualified-ids
3101 so that we can check access at instantiation time. But if
3102 we're looking at a member of the current instantiation, we
3103 know we have access and building up the SCOPE_REF confuses
3104 non-type template argument handling. */
3105 if (processing_template_decl && TYPE_P (scope)
3106 && !currently_open_class (scope))
02ed62dd
MM
3107 r = build_qualified_name (TREE_TYPE (r),
3108 scope, decl,
3109 template_p);
db24eb1f
NS
3110 decl = r;
3111 }
415d4636 3112 }
9e95d15f 3113 else if (TREE_CODE (decl) == FIELD_DECL)
a26ddf11
KL
3114 {
3115 /* Since SCOPE is NULL here, this is an unqualified name.
3116 Access checking has been performed during name lookup
3117 already. Turn off checking to avoid duplicate errors. */
3118 push_deferring_access_checks (dk_no_check);
2defb926 3119 decl = finish_non_static_data_member (decl, NULL_TREE,
a26ddf11
KL
3120 /*qualifying_scope=*/NULL_TREE);
3121 pop_deferring_access_checks ();
3122 }
9e95d15f
NS
3123 else if (is_overloaded_fn (decl))
3124 {
eff3a276 3125 tree first_fn;
b3445994 3126
294e855f 3127 first_fn = get_first_fn (decl);
9e95d15f
NS
3128 if (TREE_CODE (first_fn) == TEMPLATE_DECL)
3129 first_fn = DECL_TEMPLATE_RESULT (first_fn);
415d4636
MM
3130
3131 if (!really_overloaded_fn (decl))
3132 mark_used (first_fn);
3133
02ed62dd
MM
3134 if (!template_arg_p
3135 && TREE_CODE (first_fn) == FUNCTION_DECL
821eaf2a
MM
3136 && DECL_FUNCTION_MEMBER_P (first_fn)
3137 && !shared_member_p (decl))
9e95d15f
NS
3138 {
3139 /* A set of member functions. */
3140 decl = maybe_dummy_object (DECL_CONTEXT (first_fn), 0);
02ed62dd 3141 return finish_class_member_access_expr (decl, id_expression,
5ade1ed2
DG
3142 /*template_p=*/false,
3143 tf_warning_or_error);
9e95d15f 3144 }
eff3a276
MM
3145
3146 decl = baselink_for_fns (decl);
9e95d15f
NS
3147 }
3148 else
3149 {
9e95d15f 3150 if (DECL_P (decl) && DECL_NONLOCAL (decl)
24f58e74 3151 && DECL_CLASS_SCOPE_P (decl))
9e95d15f 3152 {
24f58e74
PC
3153 tree context = context_for_name_lookup (decl);
3154 if (context != current_class_type)
3155 {
3156 tree path = currently_open_derived_class (context);
3157 perform_or_defer_access_check (TYPE_BINFO (path),
3158 decl, decl);
3159 }
9e95d15f 3160 }
c8094d83 3161
db24eb1f 3162 decl = convert_from_reference (decl);
9e95d15f 3163 }
b3445994
MM
3164 }
3165
3166 if (TREE_DEPRECATED (decl))
9b86d6bb 3167 warn_deprecated_use (decl, NULL_TREE);
b3445994
MM
3168
3169 return decl;
3170}
3171
0213a355
JM
3172/* Implement the __typeof keyword: Return the type of EXPR, suitable for
3173 use as a type-specifier. */
3174
b894fc05 3175tree
3a978d72 3176finish_typeof (tree expr)
b894fc05 3177{
65a5559b
MM
3178 tree type;
3179
dffbbe80 3180 if (type_dependent_expression_p (expr))
b894fc05 3181 {
9e1e64ec 3182 type = cxx_make_type (TYPEOF_TYPE);
eb34af89 3183 TYPEOF_TYPE_EXPR (type) = expr;
3ad6a8e1 3184 SET_TYPE_STRUCTURAL_EQUALITY (type);
b894fc05 3185
65a5559b 3186 return type;
b894fc05
JM
3187 }
3188
03a904b5
JJ
3189 expr = mark_type_use (expr);
3190
3c38f0ff 3191 type = unlowered_expr_type (expr);
65a5559b
MM
3192
3193 if (!type || type == unknown_type_node)
3194 {
a82e1a7d 3195 error ("type of %qE is unknown", expr);
65a5559b
MM
3196 return error_mark_node;
3197 }
3198
3199 return type;
b894fc05 3200}
558475f0 3201
c291f8b1
VR
3202/* Perform C++-specific checks for __builtin_offsetof before calling
3203 fold_offsetof. */
3204
3205tree
3206finish_offsetof (tree expr)
3207{
4c65a534
VR
3208 if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
3209 {
3210 error ("cannot apply %<offsetof%> to destructor %<~%T%>",
3211 TREE_OPERAND (expr, 2));
3212 return error_mark_node;
3213 }
c291f8b1
VR
3214 if (TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE
3215 || TREE_CODE (TREE_TYPE (expr)) == METHOD_TYPE
fbfc8363 3216 || TREE_TYPE (expr) == unknown_type_node)
c291f8b1 3217 {
1916c916
VR
3218 if (TREE_CODE (expr) == COMPONENT_REF
3219 || TREE_CODE (expr) == COMPOUND_EXPR)
0a9367cb
VR
3220 expr = TREE_OPERAND (expr, 1);
3221 error ("cannot apply %<offsetof%> to member function %qD", expr);
c291f8b1
VR
3222 return error_mark_node;
3223 }
60c4d135
JJ
3224 if (TREE_CODE (expr) == INDIRECT_REF && REFERENCE_REF_P (expr))
3225 expr = TREE_OPERAND (expr, 0);
6d4d7b0e 3226 return fold_offsetof (expr, NULL_TREE);
c291f8b1
VR
3227}
3228
9eeb200f
JM
3229/* Replace the AGGR_INIT_EXPR at *TP with an equivalent CALL_EXPR. This
3230 function is broken out from the above for the benefit of the tree-ssa
3231 project. */
3232
3233void
3234simplify_aggr_init_expr (tree *tp)
3235{
3236 tree aggr_init_expr = *tp;
3237
3eb24f73 3238 /* Form an appropriate CALL_EXPR. */
5039610b
SL
3239 tree fn = AGGR_INIT_EXPR_FN (aggr_init_expr);
3240 tree slot = AGGR_INIT_EXPR_SLOT (aggr_init_expr);
2692eb7d 3241 tree type = TREE_TYPE (slot);
9eeb200f
JM
3242
3243 tree call_expr;
3244 enum style_t { ctor, arg, pcc } style;
4977bab6 3245
3eb24f73 3246 if (AGGR_INIT_VIA_CTOR_P (aggr_init_expr))
4977bab6
ZW
3247 style = ctor;
3248#ifdef PCC_STATIC_STRUCT_RETURN
3249 else if (1)
3250 style = pcc;
3251#endif
4977bab6 3252 else
315fb5db
NS
3253 {
3254 gcc_assert (TREE_ADDRESSABLE (type));
3255 style = arg;
3256 }
4977bab6 3257
db3927fb
AH
3258 call_expr = build_call_array_loc (input_location,
3259 TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))),
3260 fn,
3261 aggr_init_expr_nargs (aggr_init_expr),
3262 AGGR_INIT_EXPR_ARGP (aggr_init_expr));
d8a0d13e 3263 TREE_NOTHROW (call_expr) = TREE_NOTHROW (aggr_init_expr);
5039610b 3264
fa47911c 3265 if (style == ctor)
3eb24f73 3266 {
fa47911c
JM
3267 /* Replace the first argument to the ctor with the address of the
3268 slot. */
dffd7eb6 3269 cxx_mark_addressable (slot);
5039610b
SL
3270 CALL_EXPR_ARG (call_expr, 0) =
3271 build1 (ADDR_EXPR, build_pointer_type (type), slot);
3eb24f73 3272 }
5039610b 3273 else if (style == arg)
fa47911c
JM
3274 {
3275 /* Just mark it addressable here, and leave the rest to
3276 expand_call{,_inline}. */
3277 cxx_mark_addressable (slot);
3278 CALL_EXPR_RETURN_SLOT_OPT (call_expr) = true;
941f78d1 3279 call_expr = build2 (INIT_EXPR, TREE_TYPE (call_expr), slot, call_expr);
fa47911c 3280 }
4977bab6 3281 else if (style == pcc)
3eb24f73 3282 {
4977bab6
ZW
3283 /* If we're using the non-reentrant PCC calling convention, then we
3284 need to copy the returned value out of the static buffer into the
3285 SLOT. */
78757caa 3286 push_deferring_access_checks (dk_no_check);
46af705a 3287 call_expr = build_aggr_init (slot, call_expr,
5ade1ed2
DG
3288 DIRECT_BIND | LOOKUP_ONLYCONVERTING,
3289 tf_warning_or_error);
78757caa 3290 pop_deferring_access_checks ();
d17791d6 3291 call_expr = build2 (COMPOUND_EXPR, TREE_TYPE (slot), call_expr, slot);
3eb24f73 3292 }
3eb24f73 3293
450a927a
JM
3294 if (AGGR_INIT_ZERO_FIRST (aggr_init_expr))
3295 {
3296 tree init = build_zero_init (type, NULL_TREE,
3297 /*static_storage_p=*/false);
3298 init = build2 (INIT_EXPR, void_type_node, slot, init);
3299 call_expr = build2 (COMPOUND_EXPR, TREE_TYPE (call_expr),
3300 init, call_expr);
3301 }
3302
3eb24f73 3303 *tp = call_expr;
3eb24f73
MM
3304}
3305
31f8e4f3
MM
3306/* Emit all thunks to FN that should be emitted when FN is emitted. */
3307
e89d6010 3308void
3a978d72 3309emit_associated_thunks (tree fn)
31f8e4f3
MM
3310{
3311 /* When we use vcall offsets, we emit thunks with the virtual
3312 functions to which they thunk. The whole point of vcall offsets
3313 is so that you can know statically the entire set of thunks that
3314 will ever be needed for a given virtual function, thereby
3315 enabling you to output all the thunks with the function itself. */
4537ec0c
DN
3316 if (DECL_VIRTUAL_P (fn)
3317 /* Do not emit thunks for extern template instantiations. */
3318 && ! DECL_REALLY_EXTERN (fn))
31f8e4f3 3319 {
bb5e8a7f 3320 tree thunk;
c8094d83 3321
bb5e8a7f 3322 for (thunk = DECL_THUNKS (fn); thunk; thunk = TREE_CHAIN (thunk))
4977bab6 3323 {
e00853fd 3324 if (!THUNK_ALIAS (thunk))
4977bab6 3325 {
bb885938
NS
3326 use_thunk (thunk, /*emit_p=*/1);
3327 if (DECL_RESULT_THUNK_P (thunk))
3328 {
3329 tree probe;
c8094d83 3330
bb885938
NS
3331 for (probe = DECL_THUNKS (thunk);
3332 probe; probe = TREE_CHAIN (probe))
3333 use_thunk (probe, /*emit_p=*/1);
3334 }
4977bab6 3335 }
bb885938 3336 else
50bc768d 3337 gcc_assert (!DECL_THUNKS (thunk));
4977bab6 3338 }
31f8e4f3
MM
3339 }
3340}
3341
558475f0
MM
3342/* Generate RTL for FN. */
3343
b2583345
JJ
3344bool
3345expand_or_defer_fn_1 (tree fn)
8cd2462c
JH
3346{
3347 /* When the parser calls us after finishing the body of a template
c353b8e3
MM
3348 function, we don't really want to expand the body. */
3349 if (processing_template_decl)
8cd2462c
JH
3350 {
3351 /* Normally, collection only occurs in rest_of_compilation. So,
3352 if we don't collect here, we never collect junk generated
3353 during the processing of templates until we hit a
27250734
MM
3354 non-template function. It's not safe to do this inside a
3355 nested class, though, as the parser may have local state that
3356 is not a GC root. */
3357 if (!function_depth)
3358 ggc_collect ();
b2583345 3359 return false;
8cd2462c
JH
3360 }
3361
a406865a 3362 gcc_assert (DECL_SAVED_TREE (fn));
726a989a 3363
8cd2462c
JH
3364 /* If this is a constructor or destructor body, we have to clone
3365 it. */
3366 if (maybe_clone_body (fn))
3367 {
3368 /* We don't want to process FN again, so pretend we've written
3369 it out, even though we haven't. */
3370 TREE_ASM_WRITTEN (fn) = 1;
c6a21142 3371 DECL_SAVED_TREE (fn) = NULL_TREE;
b2583345 3372 return false;
8cd2462c
JH
3373 }
3374
4684cd27
MM
3375 /* We make a decision about linkage for these functions at the end
3376 of the compilation. Until that point, we do not want the back
3377 end to output them -- but we do want it to see the bodies of
1a10290c 3378 these functions so that it can inline them as appropriate. */
4684cd27
MM
3379 if (DECL_DECLARED_INLINE_P (fn) || DECL_IMPLICIT_INSTANTIATION (fn))
3380 {
1ef0df47
MM
3381 if (DECL_INTERFACE_KNOWN (fn))
3382 /* We've already made a decision as to how this function will
3383 be handled. */;
3384 else if (!at_eof)
4684cd27
MM
3385 {
3386 DECL_EXTERNAL (fn) = 1;
3387 DECL_NOT_REALLY_EXTERN (fn) = 1;
3388 note_vague_linkage_fn (fn);
1ef0df47
MM
3389 /* A non-template inline function with external linkage will
3390 always be COMDAT. As we must eventually determine the
3391 linkage of all functions, and as that causes writes to
3392 the data mapped in from the PCH file, it's advantageous
3393 to mark the functions at this point. */
3394 if (!DECL_IMPLICIT_INSTANTIATION (fn))
3395 {
3396 /* This function must have external linkage, as
3397 otherwise DECL_INTERFACE_KNOWN would have been
3398 set. */
3399 gcc_assert (TREE_PUBLIC (fn));
3400 comdat_linkage (fn);
3401 DECL_INTERFACE_KNOWN (fn) = 1;
3402 }
4684cd27
MM
3403 }
3404 else
3405 import_export_decl (fn);
1a10290c
MM
3406
3407 /* If the user wants us to keep all inline functions, then mark
3408 this function as needed so that finish_file will make sure to
fe2978fb
MM
3409 output it later. Similarly, all dllexport'd functions must
3410 be emitted; there may be callers in other DLLs. */
3fc20697
RG
3411 if ((flag_keep_inline_functions
3412 && DECL_DECLARED_INLINE_P (fn)
3413 && !DECL_REALLY_EXTERN (fn))
fe2978fb 3414 || lookup_attribute ("dllexport", DECL_ATTRIBUTES (fn)))
1a10290c 3415 mark_needed (fn);
4684cd27
MM
3416 }
3417
8cd2462c
JH
3418 /* There's no reason to do any of the work here if we're only doing
3419 semantic analysis; this code just generates RTL. */
3420 if (flag_syntax_only)
b2583345
JJ
3421 return false;
3422
3423 return true;
3424}
8cd2462c 3425
b2583345
JJ
3426void
3427expand_or_defer_fn (tree fn)
3428{
3429 if (expand_or_defer_fn_1 (fn))
3430 {
3431 function_depth++;
99edd65d 3432
b2583345
JJ
3433 /* Expand or defer, at the whim of the compilation unit manager. */
3434 cgraph_finalize_function (fn, function_depth > 1);
6744a6ab 3435 emit_associated_thunks (fn);
99edd65d 3436
b2583345
JJ
3437 function_depth--;
3438 }
8cd2462c
JH
3439}
3440
6de9cd9a
DN
3441struct nrv_data
3442{
3443 tree var;
3444 tree result;
3445 htab_t visited;
3446};
0d97bf4c 3447
6de9cd9a
DN
3448/* Helper function for walk_tree, used by finalize_nrv below. */
3449
3450static tree
3451finalize_nrv_r (tree* tp, int* walk_subtrees, void* data)
0d97bf4c 3452{
6de9cd9a
DN
3453 struct nrv_data *dp = (struct nrv_data *)data;
3454 void **slot;
07b2f2fd
JM
3455
3456 /* No need to walk into types. There wouldn't be any need to walk into
3457 non-statements, except that we have to consider STMT_EXPRs. */
0d97bf4c
JM
3458 if (TYPE_P (*tp))
3459 *walk_subtrees = 0;
6de9cd9a
DN
3460 /* Change all returns to just refer to the RESULT_DECL; this is a nop,
3461 but differs from using NULL_TREE in that it indicates that we care
3462 about the value of the RESULT_DECL. */
5088b058
RH
3463 else if (TREE_CODE (*tp) == RETURN_EXPR)
3464 TREE_OPERAND (*tp, 0) = dp->result;
6de9cd9a
DN
3465 /* Change all cleanups for the NRV to only run when an exception is
3466 thrown. */
07b2f2fd 3467 else if (TREE_CODE (*tp) == CLEANUP_STMT
6de9cd9a 3468 && CLEANUP_DECL (*tp) == dp->var)
659e5a7a 3469 CLEANUP_EH_ONLY (*tp) = 1;
350fae66 3470 /* Replace the DECL_EXPR for the NRV with an initialization of the
6de9cd9a 3471 RESULT_DECL, if needed. */
350fae66
RK
3472 else if (TREE_CODE (*tp) == DECL_EXPR
3473 && DECL_EXPR_DECL (*tp) == dp->var)
6de9cd9a
DN
3474 {
3475 tree init;
3476 if (DECL_INITIAL (dp->var)
3477 && DECL_INITIAL (dp->var) != error_mark_node)
2d188530
JJ
3478 init = build2 (INIT_EXPR, void_type_node, dp->result,
3479 DECL_INITIAL (dp->var));
6de9cd9a 3480 else
c2255bc4 3481 init = build_empty_stmt (EXPR_LOCATION (*tp));
2d188530 3482 DECL_INITIAL (dp->var) = NULL_TREE;
5e278028 3483 SET_EXPR_LOCATION (init, EXPR_LOCATION (*tp));
6de9cd9a
DN
3484 *tp = init;
3485 }
3486 /* And replace all uses of the NRV with the RESULT_DECL. */
3487 else if (*tp == dp->var)
3488 *tp = dp->result;
3489
3490 /* Avoid walking into the same tree more than once. Unfortunately, we
3491 can't just use walk_tree_without duplicates because it would only call
3492 us for the first occurrence of dp->var in the function body. */
3493 slot = htab_find_slot (dp->visited, *tp, INSERT);
3494 if (*slot)
3495 *walk_subtrees = 0;
3496 else
3497 *slot = *tp;
0d97bf4c
JM
3498
3499 /* Keep iterating. */
3500 return NULL_TREE;
3501}
3502
6de9cd9a 3503/* Called from finish_function to implement the named return value
5088b058 3504 optimization by overriding all the RETURN_EXPRs and pertinent
6de9cd9a
DN
3505 CLEANUP_STMTs and replacing all occurrences of VAR with RESULT, the
3506 RESULT_DECL for the function. */
f444e36b 3507
4985cde3 3508void
6de9cd9a 3509finalize_nrv (tree *tp, tree var, tree result)
f444e36b 3510{
6de9cd9a
DN
3511 struct nrv_data data;
3512
add86e09 3513 /* Copy name from VAR to RESULT. */
6de9cd9a 3514 DECL_NAME (result) = DECL_NAME (var);
6de9cd9a
DN
3515 /* Don't forget that we take its address. */
3516 TREE_ADDRESSABLE (result) = TREE_ADDRESSABLE (var);
add86e09
JJ
3517 /* Finally set DECL_VALUE_EXPR to avoid assigning
3518 a stack slot at -O0 for the original var and debug info
3519 uses RESULT location for VAR. */
3520 SET_DECL_VALUE_EXPR (var, result);
3521 DECL_HAS_VALUE_EXPR_P (var) = 1;
6de9cd9a
DN
3522
3523 data.var = var;
3524 data.result = result;
3525 data.visited = htab_create (37, htab_hash_pointer, htab_eq_pointer, NULL);
14588106 3526 cp_walk_tree (tp, finalize_nrv_r, &data, 0);
6de9cd9a 3527 htab_delete (data.visited);
b850de4f 3528}
1799e5d5 3529\f
7a0112e7
JJ
3530/* Return the declaration for the function called by CALL_EXPR T,
3531 TYPE is the class type of the clause decl. */
3532
3533static tree
3534omp_clause_info_fndecl (tree t, tree type)
3535{
3536 tree ret = get_callee_fndecl (t);
3537
3538 if (ret)
3539 return ret;
3540
3541 gcc_assert (TREE_CODE (t) == CALL_EXPR);
3542 t = CALL_EXPR_FN (t);
3543 STRIP_NOPS (t);
3544 if (TREE_CODE (t) == OBJ_TYPE_REF)
3545 {
3546 t = cp_fold_obj_type_ref (t, type);
3547 if (TREE_CODE (t) == ADDR_EXPR
3548 && TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL)
3549 return TREE_OPERAND (t, 0);
3550 }
3551
3552 return NULL_TREE;
3553}
3554
a68ab351
JJ
3555/* Create CP_OMP_CLAUSE_INFO for clause C. Returns true if it is invalid. */
3556
3557bool
3558cxx_omp_create_clause_info (tree c, tree type, bool need_default_ctor,
3559 bool need_copy_ctor, bool need_copy_assignment)
3560{
3561 int save_errorcount = errorcount;
3562 tree info, t;
3563
3564 /* Always allocate 3 elements for simplicity. These are the
3565 function decls for the ctor, dtor, and assignment op.
3566 This layout is known to the three lang hooks,
3567 cxx_omp_clause_default_init, cxx_omp_clause_copy_init,
3568 and cxx_omp_clause_assign_op. */
3569 info = make_tree_vec (3);
3570 CP_OMP_CLAUSE_INFO (c) = info;
3571
3572 if (need_default_ctor
066ec0a4 3573 || (need_copy_ctor && !TYPE_HAS_TRIVIAL_COPY_CTOR (type)))
a68ab351 3574 {
c166b898
ILT
3575 VEC(tree,gc) *vec;
3576
a68ab351 3577 if (need_default_ctor)
c166b898 3578 vec = NULL;
a68ab351
JJ
3579 else
3580 {
3581 t = build_int_cst (build_pointer_type (type), 0);
3582 t = build1 (INDIRECT_REF, type, t);
c166b898 3583 vec = make_tree_vector_single (t);
a68ab351
JJ
3584 }
3585 t = build_special_member_call (NULL_TREE, complete_ctor_identifier,
c166b898 3586 &vec, type, LOOKUP_NORMAL,
a68ab351
JJ
3587 tf_warning_or_error);
3588
c166b898
ILT
3589 if (vec != NULL)
3590 release_tree_vector (vec);
3591
a68ab351
JJ
3592 if (targetm.cxx.cdtor_returns_this () || errorcount)
3593 /* Because constructors and destructors return this,
3594 the call will have been cast to "void". Remove the
3595 cast here. We would like to use STRIP_NOPS, but it
3596 wouldn't work here because TYPE_MODE (t) and
3597 TYPE_MODE (TREE_OPERAND (t, 0)) are different.
3598 They are VOIDmode and Pmode, respectively. */
3599 if (TREE_CODE (t) == NOP_EXPR)
3600 t = TREE_OPERAND (t, 0);
3601
3602 TREE_VEC_ELT (info, 0) = get_callee_fndecl (t);
3603 }
3604
3605 if ((need_default_ctor || need_copy_ctor)
3606 && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
3607 {
3608 t = build_int_cst (build_pointer_type (type), 0);
3609 t = build1 (INDIRECT_REF, type, t);
3610 t = build_special_member_call (t, complete_dtor_identifier,
3611 NULL, type, LOOKUP_NORMAL,
3612 tf_warning_or_error);
3613
3614 if (targetm.cxx.cdtor_returns_this () || errorcount)
3615 /* Because constructors and destructors return this,
3616 the call will have been cast to "void". Remove the
3617 cast here. We would like to use STRIP_NOPS, but it
3618 wouldn't work here because TYPE_MODE (t) and
3619 TYPE_MODE (TREE_OPERAND (t, 0)) are different.
3620 They are VOIDmode and Pmode, respectively. */
3621 if (TREE_CODE (t) == NOP_EXPR)
3622 t = TREE_OPERAND (t, 0);
3623
3624 TREE_VEC_ELT (info, 1) = omp_clause_info_fndecl (t, type);
3625 }
3626
066ec0a4 3627 if (need_copy_assignment && !TYPE_HAS_TRIVIAL_COPY_ASSIGN (type))
a68ab351 3628 {
c166b898
ILT
3629 VEC(tree,gc) *vec;
3630
a68ab351
JJ
3631 t = build_int_cst (build_pointer_type (type), 0);
3632 t = build1 (INDIRECT_REF, type, t);
c166b898 3633 vec = make_tree_vector_single (t);
a68ab351 3634 t = build_special_member_call (t, ansi_assopname (NOP_EXPR),
c166b898 3635 &vec, type, LOOKUP_NORMAL,
a68ab351 3636 tf_warning_or_error);
c166b898 3637 release_tree_vector (vec);
a68ab351
JJ
3638
3639 /* We'll have called convert_from_reference on the call, which
3640 may well have added an indirect_ref. It's unneeded here,
3641 and in the way, so kill it. */
3642 if (TREE_CODE (t) == INDIRECT_REF)
3643 t = TREE_OPERAND (t, 0);
3644
3645 TREE_VEC_ELT (info, 2) = omp_clause_info_fndecl (t, type);
3646 }
3647
3648 return errorcount != save_errorcount;
3649}
3650
1799e5d5
RH
3651/* For all elements of CLAUSES, validate them vs OpenMP constraints.
3652 Remove any elements from the list that are invalid. */
3653
3654tree
3655finish_omp_clauses (tree clauses)
3656{
3657 bitmap_head generic_head, firstprivate_head, lastprivate_head;
3658 tree c, t, *pc = &clauses;
3659 const char *name;
3660
3661 bitmap_obstack_initialize (NULL);
3662 bitmap_initialize (&generic_head, &bitmap_default_obstack);
3663 bitmap_initialize (&firstprivate_head, &bitmap_default_obstack);
3664 bitmap_initialize (&lastprivate_head, &bitmap_default_obstack);
3665
3666 for (pc = &clauses, c = clauses; c ; c = *pc)
3667 {
3668 bool remove = false;
3669
3670 switch (OMP_CLAUSE_CODE (c))
3671 {
3672 case OMP_CLAUSE_SHARED:
3673 name = "shared";
3674 goto check_dup_generic;
3675 case OMP_CLAUSE_PRIVATE:
3676 name = "private";
3677 goto check_dup_generic;
3678 case OMP_CLAUSE_REDUCTION:
3679 name = "reduction";
3680 goto check_dup_generic;
3681 case OMP_CLAUSE_COPYPRIVATE:
3682 name = "copyprivate";
3683 goto check_dup_generic;
3684 case OMP_CLAUSE_COPYIN:
3685 name = "copyin";
3686 goto check_dup_generic;
3687 check_dup_generic:
3688 t = OMP_CLAUSE_DECL (c);
3689 if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != PARM_DECL)
3690 {
3691 if (processing_template_decl)
3692 break;
76dc15d4
JJ
3693 if (DECL_P (t))
3694 error ("%qD is not a variable in clause %qs", t, name);
3695 else
3696 error ("%qE is not a variable in clause %qs", t, name);
1799e5d5
RH
3697 remove = true;
3698 }
3699 else if (bitmap_bit_p (&generic_head, DECL_UID (t))
3700 || bitmap_bit_p (&firstprivate_head, DECL_UID (t))
3701 || bitmap_bit_p (&lastprivate_head, DECL_UID (t)))
3702 {
76dc15d4 3703 error ("%qD appears more than once in data clauses", t);
1799e5d5
RH
3704 remove = true;
3705 }
3706 else
3707 bitmap_set_bit (&generic_head, DECL_UID (t));
3708 break;
3709
3710 case OMP_CLAUSE_FIRSTPRIVATE:
3711 t = OMP_CLAUSE_DECL (c);
3712 if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != PARM_DECL)
3713 {
3714 if (processing_template_decl)
3715 break;
85b20612
JJ
3716 if (DECL_P (t))
3717 error ("%qD is not a variable in clause %<firstprivate%>", t);
3718 else
3719 error ("%qE is not a variable in clause %<firstprivate%>", t);
1799e5d5
RH
3720 remove = true;
3721 }
3722 else if (bitmap_bit_p (&generic_head, DECL_UID (t))
3723 || bitmap_bit_p (&firstprivate_head, DECL_UID (t)))
3724 {
85b20612 3725 error ("%qD appears more than once in data clauses", t);
1799e5d5
RH
3726 remove = true;
3727 }
3728 else
3729 bitmap_set_bit (&firstprivate_head, DECL_UID (t));
3730 break;
3731
3732 case OMP_CLAUSE_LASTPRIVATE:
3733 t = OMP_CLAUSE_DECL (c);
3734 if (TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != PARM_DECL)
3735 {
3736 if (processing_template_decl)
3737 break;
85b20612
JJ
3738 if (DECL_P (t))
3739 error ("%qD is not a variable in clause %<lastprivate%>", t);
3740 else
3741 error ("%qE is not a variable in clause %<lastprivate%>", t);
1799e5d5
RH
3742 remove = true;
3743 }
3744 else if (bitmap_bit_p (&generic_head, DECL_UID (t))
3745 || bitmap_bit_p (&lastprivate_head, DECL_UID (t)))
3746 {
85b20612 3747 error ("%qD appears more than once in data clauses", t);
1799e5d5
RH
3748 remove = true;
3749 }
3750 else
3751 bitmap_set_bit (&lastprivate_head, DECL_UID (t));
3752 break;
3753
3754 case OMP_CLAUSE_IF:
3755 t = OMP_CLAUSE_IF_EXPR (c);
3756 t = maybe_convert_cond (t);
3757 if (t == error_mark_node)
3758 remove = true;
3759 OMP_CLAUSE_IF_EXPR (c) = t;
3760 break;
3761
3762 case OMP_CLAUSE_NUM_THREADS:
3763 t = OMP_CLAUSE_NUM_THREADS_EXPR (c);
3764 if (t == error_mark_node)
3765 remove = true;
6e684eee
JJ
3766 else if (!type_dependent_expression_p (t)
3767 && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
1799e5d5
RH
3768 {
3769 error ("num_threads expression must be integral");
3770 remove = true;
3771 }
3772 break;
3773
3774 case OMP_CLAUSE_SCHEDULE:
3775 t = OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c);
3776 if (t == NULL)
3777 ;
3778 else if (t == error_mark_node)
3779 remove = true;
6e684eee
JJ
3780 else if (!type_dependent_expression_p (t)
3781 && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
1799e5d5
RH
3782 {
3783 error ("schedule chunk size expression must be integral");
3784 remove = true;
3785 }
3786 break;
3787
3788 case OMP_CLAUSE_NOWAIT:
3789 case OMP_CLAUSE_ORDERED:
3790 case OMP_CLAUSE_DEFAULT:
a68ab351
JJ
3791 case OMP_CLAUSE_UNTIED:
3792 case OMP_CLAUSE_COLLAPSE:
1799e5d5
RH
3793 break;
3794
3795 default:
3796 gcc_unreachable ();
3797 }
3798
3799 if (remove)
3800 *pc = OMP_CLAUSE_CHAIN (c);
3801 else
3802 pc = &OMP_CLAUSE_CHAIN (c);
3803 }
3804
3805 for (pc = &clauses, c = clauses; c ; c = *pc)
3806 {
81f40b79 3807 enum omp_clause_code c_kind = OMP_CLAUSE_CODE (c);
1799e5d5
RH
3808 bool remove = false;
3809 bool need_complete_non_reference = false;
3810 bool need_default_ctor = false;
3811 bool need_copy_ctor = false;
3812 bool need_copy_assignment = false;
3813 bool need_implicitly_determined = false;
3814 tree type, inner_type;
3815
3816 switch (c_kind)
3817 {
3818 case OMP_CLAUSE_SHARED:
3819 name = "shared";
3820 need_implicitly_determined = true;
3821 break;
3822 case OMP_CLAUSE_PRIVATE:
3823 name = "private";
3824 need_complete_non_reference = true;
3825 need_default_ctor = true;
3826 need_implicitly_determined = true;
3827 break;
3828 case OMP_CLAUSE_FIRSTPRIVATE:
3829 name = "firstprivate";
3830 need_complete_non_reference = true;
3831 need_copy_ctor = true;
3832 need_implicitly_determined = true;
3833 break;
3834 case OMP_CLAUSE_LASTPRIVATE:
3835 name = "lastprivate";
3836 need_complete_non_reference = true;
3837 need_copy_assignment = true;
3838 need_implicitly_determined = true;
3839 break;
3840 case OMP_CLAUSE_REDUCTION:
3841 name = "reduction";
3842 need_implicitly_determined = true;
3843 break;
3844 case OMP_CLAUSE_COPYPRIVATE:
3845 name = "copyprivate";
3846 need_copy_assignment = true;
3847 break;
3848 case OMP_CLAUSE_COPYIN:
3849 name = "copyin";
3850 need_copy_assignment = true;
3851 break;
3852 default:
3853 pc = &OMP_CLAUSE_CHAIN (c);
3854 continue;
3855 }
3856
3857 t = OMP_CLAUSE_DECL (c);
3858 if (processing_template_decl
3859 && TREE_CODE (t) != VAR_DECL && TREE_CODE (t) != PARM_DECL)
3860 {
3861 pc = &OMP_CLAUSE_CHAIN (c);
3862 continue;
3863 }
3864
3865 switch (c_kind)
3866 {
3867 case OMP_CLAUSE_LASTPRIVATE:
3868 if (!bitmap_bit_p (&firstprivate_head, DECL_UID (t)))
3869 need_default_ctor = true;
3870 break;
3871
3872 case OMP_CLAUSE_REDUCTION:
3873 if (AGGREGATE_TYPE_P (TREE_TYPE (t))
3874 || POINTER_TYPE_P (TREE_TYPE (t)))
3875 {
3876 error ("%qE has invalid type for %<reduction%>", t);
3877 remove = true;
3878 }
3879 else if (FLOAT_TYPE_P (TREE_TYPE (t)))
3880 {
3881 enum tree_code r_code = OMP_CLAUSE_REDUCTION_CODE (c);
3882 switch (r_code)
3883 {
3884 case PLUS_EXPR:
3885 case MULT_EXPR:
3886 case MINUS_EXPR:
3887 break;
3888 default:
3889 error ("%qE has invalid type for %<reduction(%s)%>",
3890 t, operator_name_info[r_code].name);
3891 remove = true;
3892 }
3893 }
3894 break;
3895
3896 case OMP_CLAUSE_COPYIN:
3897 if (TREE_CODE (t) != VAR_DECL || !DECL_THREAD_LOCAL_P (t))
3898 {
3899 error ("%qE must be %<threadprivate%> for %<copyin%>", t);
3900 remove = true;
3901 }
3902 break;
3903
3904 default:
3905 break;
3906 }
3907
3908 if (need_complete_non_reference)
3909 {
3910 t = require_complete_type (t);
3911 if (t == error_mark_node)
3912 remove = true;
3913 else if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
3914 {
3915 error ("%qE has reference type for %qs", t, name);
3916 remove = true;
3917 }
3918 }
3919 if (need_implicitly_determined)
3920 {
3921 const char *share_name = NULL;
3922
3923 if (TREE_CODE (t) == VAR_DECL && DECL_THREAD_LOCAL_P (t))
3924 share_name = "threadprivate";
3925 else switch (cxx_omp_predetermined_sharing (t))
3926 {
3927 case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
3928 break;
3929 case OMP_CLAUSE_DEFAULT_SHARED:
3930 share_name = "shared";
3931 break;
3932 case OMP_CLAUSE_DEFAULT_PRIVATE:
3933 share_name = "private";
3934 break;
3935 default:
3936 gcc_unreachable ();
3937 }
3938 if (share_name)
3939 {
3940 error ("%qE is predetermined %qs for %qs",
3941 t, share_name, name);
3942 remove = true;
3943 }
3944 }
3945
3946 /* We're interested in the base element, not arrays. */
3947 inner_type = type = TREE_TYPE (t);
3948 while (TREE_CODE (inner_type) == ARRAY_TYPE)
3949 inner_type = TREE_TYPE (inner_type);
3950
84dc00e8 3951 /* Check for special function availability by building a call to one.
1799e5d5
RH
3952 Save the results, because later we won't be in the right context
3953 for making these queries. */
3954 if (CLASS_TYPE_P (inner_type)
6f719560 3955 && (need_default_ctor || need_copy_ctor || need_copy_assignment)
a68ab351
JJ
3956 && !type_dependent_expression_p (t)
3957 && cxx_omp_create_clause_info (c, inner_type, need_default_ctor,
3958 need_copy_ctor, need_copy_assignment))
3959 remove = true;
1799e5d5
RH
3960
3961 if (remove)
3962 *pc = OMP_CLAUSE_CHAIN (c);
3963 else
3964 pc = &OMP_CLAUSE_CHAIN (c);
3965 }
3966
3967 bitmap_obstack_release (NULL);
3968 return clauses;
3969}
3970
3971/* For all variables in the tree_list VARS, mark them as thread local. */
3972
3973void
3974finish_omp_threadprivate (tree vars)
3975{
3976 tree t;
3977
3978 /* Mark every variable in VARS to be assigned thread local storage. */
3979 for (t = vars; t; t = TREE_CHAIN (t))
3980 {
3981 tree v = TREE_PURPOSE (t);
3982
edb6000e
JJ
3983 if (error_operand_p (v))
3984 ;
3985 else if (TREE_CODE (v) != VAR_DECL)
3986 error ("%<threadprivate%> %qD is not file, namespace "
3987 "or block scope variable", v);
1799e5d5
RH
3988 /* If V had already been marked threadprivate, it doesn't matter
3989 whether it had been used prior to this point. */
edb6000e 3990 else if (TREE_USED (v)
1799e5d5
RH
3991 && (DECL_LANG_SPECIFIC (v) == NULL
3992 || !CP_DECL_THREADPRIVATE_P (v)))
3993 error ("%qE declared %<threadprivate%> after first use", v);
3994 else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
3995 error ("automatic variable %qE cannot be %<threadprivate%>", v);
3996 else if (! COMPLETE_TYPE_P (TREE_TYPE (v)))
3997 error ("%<threadprivate%> %qE has incomplete type", v);
a68ab351
JJ
3998 else if (TREE_STATIC (v) && TYPE_P (CP_DECL_CONTEXT (v))
3999 && CP_DECL_CONTEXT (v) != current_class_type)
4000 error ("%<threadprivate%> %qE directive not "
4001 "in %qT definition", v, CP_DECL_CONTEXT (v));
1799e5d5
RH
4002 else
4003 {
4004 /* Allocate a LANG_SPECIFIC structure for V, if needed. */
4005 if (DECL_LANG_SPECIFIC (v) == NULL)
4006 {
4007 retrofit_lang_decl (v);
4008
4009 /* Make sure that DECL_DISCRIMINATOR_P continues to be true
4010 after the allocation of the lang_decl structure. */
4011 if (DECL_DISCRIMINATOR_P (v))
b97e8a14 4012 DECL_LANG_SPECIFIC (v)->u.base.u2sel = 1;
1799e5d5
RH
4013 }
4014
4015 if (! DECL_THREAD_LOCAL_P (v))
4016 {
4017 DECL_TLS_MODEL (v) = decl_default_tls_model (v);
4018 /* If rtl has been already set for this var, call
4019 make_decl_rtl once again, so that encode_section_info
4020 has a chance to look at the new decl flags. */
4021 if (DECL_RTL_SET_P (v))
4022 make_decl_rtl (v);
4023 }
4024 CP_DECL_THREADPRIVATE_P (v) = 1;
4025 }
4026 }
4027}
4028
4029/* Build an OpenMP structured block. */
4030
4031tree
4032begin_omp_structured_block (void)
4033{
4034 return do_pushlevel (sk_omp);
4035}
4036
4037tree
4038finish_omp_structured_block (tree block)
4039{
4040 return do_poplevel (block);
4041}
4042
84dc00e8 4043/* Similarly, except force the retention of the BLOCK. */
1799e5d5
RH
4044
4045tree
4046begin_omp_parallel (void)
4047{
4048 keep_next_level (true);
4049 return begin_omp_structured_block ();
4050}
4051
4052tree
4053finish_omp_parallel (tree clauses, tree body)
4054{
4055 tree stmt;
4056
4057 body = finish_omp_structured_block (body);
b850de4f 4058
1799e5d5
RH
4059 stmt = make_node (OMP_PARALLEL);
4060 TREE_TYPE (stmt) = void_type_node;
4061 OMP_PARALLEL_CLAUSES (stmt) = clauses;
4062 OMP_PARALLEL_BODY (stmt) = body;
54f7877c 4063
1799e5d5
RH
4064 return add_stmt (stmt);
4065}
4066
a68ab351
JJ
4067tree
4068begin_omp_task (void)
4069{
4070 keep_next_level (true);
4071 return begin_omp_structured_block ();
4072}
4073
4074tree
4075finish_omp_task (tree clauses, tree body)
4076{
4077 tree stmt;
4078
4079 body = finish_omp_structured_block (body);
4080
4081 stmt = make_node (OMP_TASK);
4082 TREE_TYPE (stmt) = void_type_node;
4083 OMP_TASK_CLAUSES (stmt) = clauses;
4084 OMP_TASK_BODY (stmt) = body;
4085
4086 return add_stmt (stmt);
4087}
4088
4089/* Helper function for finish_omp_for. Convert Ith random access iterator
4090 into integral iterator. Return FALSE if successful. */
4091
4092static bool
4093handle_omp_for_class_iterator (int i, location_t locus, tree declv, tree initv,
4094 tree condv, tree incrv, tree *body,
4095 tree *pre_body, tree clauses)
4096{
4097 tree diff, iter_init, iter_incr = NULL, last;
4098 tree incr_var = NULL, orig_pre_body, orig_body, c;
4099 tree decl = TREE_VEC_ELT (declv, i);
4100 tree init = TREE_VEC_ELT (initv, i);
4101 tree cond = TREE_VEC_ELT (condv, i);
4102 tree incr = TREE_VEC_ELT (incrv, i);
4103 tree iter = decl;
4104 location_t elocus = locus;
4105
4106 if (init && EXPR_HAS_LOCATION (init))
4107 elocus = EXPR_LOCATION (init);
4108
4109 switch (TREE_CODE (cond))
4110 {
4111 case GT_EXPR:
4112 case GE_EXPR:
4113 case LT_EXPR:
4114 case LE_EXPR:
c5cdb03f
JJ
4115 if (TREE_OPERAND (cond, 1) == iter)
4116 cond = build2 (swap_tree_comparison (TREE_CODE (cond)),
4117 TREE_TYPE (cond), iter, TREE_OPERAND (cond, 0));
a68ab351
JJ
4118 if (TREE_OPERAND (cond, 0) != iter)
4119 cond = error_mark_node;
4120 else
4121 {
4122 tree tem = build_x_binary_op (TREE_CODE (cond), iter, ERROR_MARK,
4123 TREE_OPERAND (cond, 1), ERROR_MARK,
4124 NULL, tf_warning_or_error);
4125 if (error_operand_p (tem))
4126 return true;
4127 }
4128 break;
4129 default:
4130 cond = error_mark_node;
4131 break;
4132 }
4133 if (cond == error_mark_node)
4134 {
69bc6bff 4135 error_at (elocus, "invalid controlling predicate");
a68ab351
JJ
4136 return true;
4137 }
4138 diff = build_x_binary_op (MINUS_EXPR, TREE_OPERAND (cond, 1),
4139 ERROR_MARK, iter, ERROR_MARK, NULL,
4140 tf_warning_or_error);
4141 if (error_operand_p (diff))
4142 return true;
4143 if (TREE_CODE (TREE_TYPE (diff)) != INTEGER_TYPE)
4144 {
69bc6bff
MLI
4145 error_at (elocus, "difference between %qE and %qD does not have integer type",
4146 TREE_OPERAND (cond, 1), iter);
a68ab351
JJ
4147 return true;
4148 }
4149
4150 switch (TREE_CODE (incr))
4151 {
4152 case PREINCREMENT_EXPR:
4153 case PREDECREMENT_EXPR:
4154 case POSTINCREMENT_EXPR:
4155 case POSTDECREMENT_EXPR:
4156 if (TREE_OPERAND (incr, 0) != iter)
4157 {
4158 incr = error_mark_node;
4159 break;
4160 }
4161 iter_incr = build_x_unary_op (TREE_CODE (incr), iter,
4162 tf_warning_or_error);
4163 if (error_operand_p (iter_incr))
4164 return true;
4165 else if (TREE_CODE (incr) == PREINCREMENT_EXPR
4166 || TREE_CODE (incr) == POSTINCREMENT_EXPR)
4167 incr = integer_one_node;
4168 else
4169 incr = integer_minus_one_node;
4170 break;
4171 case MODIFY_EXPR:
4172 if (TREE_OPERAND (incr, 0) != iter)
4173 incr = error_mark_node;
4174 else if (TREE_CODE (TREE_OPERAND (incr, 1)) == PLUS_EXPR
4175 || TREE_CODE (TREE_OPERAND (incr, 1)) == MINUS_EXPR)
4176 {
4177 tree rhs = TREE_OPERAND (incr, 1);
4178 if (TREE_OPERAND (rhs, 0) == iter)
4179 {
4180 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 1)))
4181 != INTEGER_TYPE)
4182 incr = error_mark_node;
4183 else
4184 {
4185 iter_incr = build_x_modify_expr (iter, TREE_CODE (rhs),
4186 TREE_OPERAND (rhs, 1),
4187 tf_warning_or_error);
4188 if (error_operand_p (iter_incr))
4189 return true;
4190 incr = TREE_OPERAND (rhs, 1);
4191 incr = cp_convert (TREE_TYPE (diff), incr);
4192 if (TREE_CODE (rhs) == MINUS_EXPR)
4193 {
4194 incr = build1 (NEGATE_EXPR, TREE_TYPE (diff), incr);
4195 incr = fold_if_not_in_template (incr);
4196 }
4197 if (TREE_CODE (incr) != INTEGER_CST
4198 && (TREE_CODE (incr) != NOP_EXPR
4199 || (TREE_CODE (TREE_OPERAND (incr, 0))
4200 != INTEGER_CST)))
4201 iter_incr = NULL;
4202 }
4203 }
4204 else if (TREE_OPERAND (rhs, 1) == iter)
4205 {
4206 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 0))) != INTEGER_TYPE
4207 || TREE_CODE (rhs) != PLUS_EXPR)
4208 incr = error_mark_node;
4209 else
4210 {
4211 iter_incr = build_x_binary_op (PLUS_EXPR,
4212 TREE_OPERAND (rhs, 0),
4213 ERROR_MARK, iter,
4214 ERROR_MARK, NULL,
4215 tf_warning_or_error);
4216 if (error_operand_p (iter_incr))
4217 return true;
4218 iter_incr = build_x_modify_expr (iter, NOP_EXPR,
4219 iter_incr,
4220 tf_warning_or_error);
4221 if (error_operand_p (iter_incr))
4222 return true;
4223 incr = TREE_OPERAND (rhs, 0);
4224 iter_incr = NULL;
4225 }
4226 }
4227 else
4228 incr = error_mark_node;
4229 }
4230 else
4231 incr = error_mark_node;
4232 break;
4233 default:
4234 incr = error_mark_node;
4235 break;
4236 }
4237
4238 if (incr == error_mark_node)
4239 {
69bc6bff 4240 error_at (elocus, "invalid increment expression");
a68ab351
JJ
4241 return true;
4242 }
4243
4244 incr = cp_convert (TREE_TYPE (diff), incr);
4245 for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
4246 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
4247 && OMP_CLAUSE_DECL (c) == iter)
4248 break;
4249
4250 decl = create_temporary_var (TREE_TYPE (diff));
4251 pushdecl (decl);
4252 add_decl_expr (decl);
4253 last = create_temporary_var (TREE_TYPE (diff));
4254 pushdecl (last);
4255 add_decl_expr (last);
4256 if (c && iter_incr == NULL)
4257 {
4258 incr_var = create_temporary_var (TREE_TYPE (diff));
4259 pushdecl (incr_var);
4260 add_decl_expr (incr_var);
4261 }
4262 gcc_assert (stmts_are_full_exprs_p ());
4263
4264 orig_pre_body = *pre_body;
4265 *pre_body = push_stmt_list ();
4266 if (orig_pre_body)
4267 add_stmt (orig_pre_body);
4268 if (init != NULL)
4269 finish_expr_stmt (build_x_modify_expr (iter, NOP_EXPR, init,
4270 tf_warning_or_error));
4271 init = build_int_cst (TREE_TYPE (diff), 0);
4272 if (c && iter_incr == NULL)
4273 {
4274 finish_expr_stmt (build_x_modify_expr (incr_var, NOP_EXPR,
4275 incr, tf_warning_or_error));
4276 incr = incr_var;
4277 iter_incr = build_x_modify_expr (iter, PLUS_EXPR, incr,
4278 tf_warning_or_error);
4279 }
4280 finish_expr_stmt (build_x_modify_expr (last, NOP_EXPR, init,
4281 tf_warning_or_error));
4282 *pre_body = pop_stmt_list (*pre_body);
4283
ba47d38d
AH
4284 cond = cp_build_binary_op (elocus,
4285 TREE_CODE (cond), decl, diff,
a68ab351 4286 tf_warning_or_error);
32e8bb8e 4287 incr = build_modify_expr (elocus, decl, NULL_TREE, PLUS_EXPR,
c2255bc4 4288 elocus, incr, NULL_TREE);
a68ab351
JJ
4289
4290 orig_body = *body;
4291 *body = push_stmt_list ();
4292 iter_init = build2 (MINUS_EXPR, TREE_TYPE (diff), decl, last);
4293 iter_init = build_x_modify_expr (iter, PLUS_EXPR, iter_init,
4294 tf_warning_or_error);
4295 iter_init = build1 (NOP_EXPR, void_type_node, iter_init);
4296 finish_expr_stmt (iter_init);
4297 finish_expr_stmt (build_x_modify_expr (last, NOP_EXPR, decl,
4298 tf_warning_or_error));
4299 add_stmt (orig_body);
4300 *body = pop_stmt_list (*body);
4301
4302 if (c)
4303 {
4304 OMP_CLAUSE_LASTPRIVATE_STMT (c) = push_stmt_list ();
4305 finish_expr_stmt (iter_incr);
4306 OMP_CLAUSE_LASTPRIVATE_STMT (c)
4307 = pop_stmt_list (OMP_CLAUSE_LASTPRIVATE_STMT (c));
4308 }
4309
4310 TREE_VEC_ELT (declv, i) = decl;
4311 TREE_VEC_ELT (initv, i) = init;
4312 TREE_VEC_ELT (condv, i) = cond;
4313 TREE_VEC_ELT (incrv, i) = incr;
4314
4315 return false;
4316}
4317
1799e5d5
RH
4318/* Build and validate an OMP_FOR statement. CLAUSES, BODY, COND, INCR
4319 are directly for their associated operands in the statement. DECL
4320 and INIT are a combo; if DECL is NULL then INIT ought to be a
4321 MODIFY_EXPR, and the DECL should be extracted. PRE_BODY are
4322 optional statements that need to go before the loop into its
4323 sk_omp scope. */
4324
4325tree
a68ab351
JJ
4326finish_omp_for (location_t locus, tree declv, tree initv, tree condv,
4327 tree incrv, tree body, tree pre_body, tree clauses)
4328{
4329 tree omp_for = NULL, orig_incr = NULL;
4330 tree decl, init, cond, incr;
4331 location_t elocus;
4332 int i;
4333
4334 gcc_assert (TREE_VEC_LENGTH (declv) == TREE_VEC_LENGTH (initv));
4335 gcc_assert (TREE_VEC_LENGTH (declv) == TREE_VEC_LENGTH (condv));
4336 gcc_assert (TREE_VEC_LENGTH (declv) == TREE_VEC_LENGTH (incrv));
4337 for (i = 0; i < TREE_VEC_LENGTH (declv); i++)
4338 {
4339 decl = TREE_VEC_ELT (declv, i);
4340 init = TREE_VEC_ELT (initv, i);
4341 cond = TREE_VEC_ELT (condv, i);
4342 incr = TREE_VEC_ELT (incrv, i);
4343 elocus = locus;
4344
4345 if (decl == NULL)
4346 {
4347 if (init != NULL)
4348 switch (TREE_CODE (init))
1799e5d5 4349 {
a68ab351 4350 case MODIFY_EXPR:
1799e5d5 4351 decl = TREE_OPERAND (init, 0);
a68ab351
JJ
4352 init = TREE_OPERAND (init, 1);
4353 break;
4354 case MODOP_EXPR:
4355 if (TREE_CODE (TREE_OPERAND (init, 1)) == NOP_EXPR)
4356 {
4357 decl = TREE_OPERAND (init, 0);
4358 init = TREE_OPERAND (init, 2);
4359 }
4360 break;
4361 default:
4362 break;
1799e5d5 4363 }
1799e5d5 4364
a68ab351
JJ
4365 if (decl == NULL)
4366 {
69bc6bff
MLI
4367 error_at (locus,
4368 "expected iteration declaration or initialization");
a68ab351
JJ
4369 return NULL;
4370 }
1799e5d5 4371 }
1799e5d5 4372
a68ab351
JJ
4373 if (init && EXPR_HAS_LOCATION (init))
4374 elocus = EXPR_LOCATION (init);
1799e5d5
RH
4375
4376 if (cond == NULL)
4377 {
69bc6bff 4378 error_at (elocus, "missing controlling predicate");
1799e5d5
RH
4379 return NULL;
4380 }
4381
4382 if (incr == NULL)
4383 {
69bc6bff 4384 error_at (elocus, "missing increment expression");
1799e5d5
RH
4385 return NULL;
4386 }
4387
a68ab351
JJ
4388 TREE_VEC_ELT (declv, i) = decl;
4389 TREE_VEC_ELT (initv, i) = init;
4390 }
4391
4392 if (dependent_omp_for_p (declv, initv, condv, incrv))
4393 {
4394 tree stmt;
4395
1799e5d5
RH
4396 stmt = make_node (OMP_FOR);
4397
a68ab351
JJ
4398 for (i = 0; i < TREE_VEC_LENGTH (declv); i++)
4399 {
4400 /* This is really just a place-holder. We'll be decomposing this
4401 again and going through the cp_build_modify_expr path below when
4402 we instantiate the thing. */
4403 TREE_VEC_ELT (initv, i)
4404 = build2 (MODIFY_EXPR, void_type_node, TREE_VEC_ELT (declv, i),
4405 TREE_VEC_ELT (initv, i));
4406 }
1799e5d5
RH
4407
4408 TREE_TYPE (stmt) = void_type_node;
a68ab351
JJ
4409 OMP_FOR_INIT (stmt) = initv;
4410 OMP_FOR_COND (stmt) = condv;
4411 OMP_FOR_INCR (stmt) = incrv;
1799e5d5
RH
4412 OMP_FOR_BODY (stmt) = body;
4413 OMP_FOR_PRE_BODY (stmt) = pre_body;
a68ab351 4414 OMP_FOR_CLAUSES (stmt) = clauses;
1799e5d5
RH
4415
4416 SET_EXPR_LOCATION (stmt, locus);
4417 return add_stmt (stmt);
4418 }
4419
a68ab351
JJ
4420 if (processing_template_decl)
4421 orig_incr = make_tree_vec (TREE_VEC_LENGTH (incrv));
1799e5d5 4422
a68ab351 4423 for (i = 0; i < TREE_VEC_LENGTH (declv); )
dadb19e0 4424 {
a68ab351
JJ
4425 decl = TREE_VEC_ELT (declv, i);
4426 init = TREE_VEC_ELT (initv, i);
4427 cond = TREE_VEC_ELT (condv, i);
4428 incr = TREE_VEC_ELT (incrv, i);
4429 if (orig_incr)
4430 TREE_VEC_ELT (orig_incr, i) = incr;
4431 elocus = locus;
4432
4433 if (init && EXPR_HAS_LOCATION (init))
dadb19e0 4434 elocus = EXPR_LOCATION (init);
dadb19e0 4435
a68ab351
JJ
4436 if (!DECL_P (decl))
4437 {
69bc6bff 4438 error_at (elocus, "expected iteration declaration or initialization");
a68ab351
JJ
4439 return NULL;
4440 }
969c111d 4441
a68ab351
JJ
4442 if (incr && TREE_CODE (incr) == MODOP_EXPR)
4443 {
4444 if (orig_incr)
4445 TREE_VEC_ELT (orig_incr, i) = incr;
4446 incr = cp_build_modify_expr (TREE_OPERAND (incr, 0),
4447 TREE_CODE (TREE_OPERAND (incr, 1)),
4448 TREE_OPERAND (incr, 2),
4449 tf_warning_or_error);
4450 }
4451
4452 if (CLASS_TYPE_P (TREE_TYPE (decl)))
4453 {
4454 if (handle_omp_for_class_iterator (i, locus, declv, initv, condv,
4455 incrv, &body, &pre_body, clauses))
4456 return NULL;
4457 continue;
4458 }
4459
4460 if (!INTEGRAL_TYPE_P (TREE_TYPE (decl))
4461 && TREE_CODE (TREE_TYPE (decl)) != POINTER_TYPE)
4462 {
69bc6bff 4463 error_at (elocus, "invalid type for iteration variable %qE", decl);
a68ab351
JJ
4464 return NULL;
4465 }
969c111d 4466
b2ebd268 4467 if (!processing_template_decl)
8569b2d0
JJ
4468 {
4469 init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
4470 init = cp_build_modify_expr (decl, NOP_EXPR, init, tf_warning_or_error);
4471 }
4472 else
4473 init = build2 (MODIFY_EXPR, void_type_node, decl, init);
e4ebaef3
JJ
4474 if (cond
4475 && TREE_SIDE_EFFECTS (cond)
4476 && COMPARISON_CLASS_P (cond)
4477 && !processing_template_decl)
a68ab351 4478 {
e4ebaef3
JJ
4479 tree t = TREE_OPERAND (cond, 0);
4480 if (TREE_SIDE_EFFECTS (t)
4481 && t != decl
4482 && (TREE_CODE (t) != NOP_EXPR
4483 || TREE_OPERAND (t, 0) != decl))
4484 TREE_OPERAND (cond, 0)
4485 = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
a68ab351 4486
e4ebaef3
JJ
4487 t = TREE_OPERAND (cond, 1);
4488 if (TREE_SIDE_EFFECTS (t)
4489 && t != decl
4490 && (TREE_CODE (t) != NOP_EXPR
4491 || TREE_OPERAND (t, 0) != decl))
4492 TREE_OPERAND (cond, 1)
a68ab351
JJ
4493 = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
4494 }
4495 if (decl == error_mark_node || init == error_mark_node)
4496 return NULL;
4497
4498 TREE_VEC_ELT (declv, i) = decl;
4499 TREE_VEC_ELT (initv, i) = init;
4500 TREE_VEC_ELT (condv, i) = cond;
4501 TREE_VEC_ELT (incrv, i) = incr;
4502 i++;
969c111d 4503 }
a68ab351
JJ
4504
4505 if (IS_EMPTY_STMT (pre_body))
4506 pre_body = NULL;
4507
4508 omp_for = c_finish_omp_for (locus, declv, initv, condv, incrv,
4509 body, pre_body);
4510
4511 if (omp_for == NULL)
4512 return NULL;
4513
4514 for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INCR (omp_for)); i++)
969c111d 4515 {
e4ebaef3
JJ
4516 decl = TREE_OPERAND (TREE_VEC_ELT (OMP_FOR_INIT (omp_for), i), 0);
4517 incr = TREE_VEC_ELT (OMP_FOR_INCR (omp_for), i);
969c111d 4518
a68ab351
JJ
4519 if (TREE_CODE (incr) != MODIFY_EXPR)
4520 continue;
4521
4522 if (TREE_SIDE_EFFECTS (TREE_OPERAND (incr, 1))
e4ebaef3
JJ
4523 && BINARY_CLASS_P (TREE_OPERAND (incr, 1))
4524 && !processing_template_decl)
a68ab351 4525 {
e4ebaef3
JJ
4526 tree t = TREE_OPERAND (TREE_OPERAND (incr, 1), 0);
4527 if (TREE_SIDE_EFFECTS (t)
4528 && t != decl
4529 && (TREE_CODE (t) != NOP_EXPR
4530 || TREE_OPERAND (t, 0) != decl))
4531 TREE_OPERAND (TREE_OPERAND (incr, 1), 0)
4532 = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
a68ab351 4533
e4ebaef3
JJ
4534 t = TREE_OPERAND (TREE_OPERAND (incr, 1), 1);
4535 if (TREE_SIDE_EFFECTS (t)
4536 && t != decl
4537 && (TREE_CODE (t) != NOP_EXPR
4538 || TREE_OPERAND (t, 0) != decl))
4539 TREE_OPERAND (TREE_OPERAND (incr, 1), 1)
4540 = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
a68ab351
JJ
4541 }
4542
4543 if (orig_incr)
4544 TREE_VEC_ELT (OMP_FOR_INCR (omp_for), i) = TREE_VEC_ELT (orig_incr, i);
969c111d 4545 }
a68ab351
JJ
4546 if (omp_for != NULL)
4547 OMP_FOR_CLAUSES (omp_for) = clauses;
969c111d 4548 return omp_for;
1799e5d5
RH
4549}
4550
4551void
4552finish_omp_atomic (enum tree_code code, tree lhs, tree rhs)
4553{
239371f9
JJ
4554 tree orig_lhs;
4555 tree orig_rhs;
4556 bool dependent_p;
e6bd5565
MM
4557 tree stmt;
4558
239371f9
JJ
4559 orig_lhs = lhs;
4560 orig_rhs = rhs;
4561 dependent_p = false;
4562 stmt = NULL_TREE;
4563
4564 /* Even in a template, we can detect invalid uses of the atomic
4565 pragma if neither LHS nor RHS is type-dependent. */
4566 if (processing_template_decl)
e6bd5565 4567 {
239371f9
JJ
4568 dependent_p = (type_dependent_expression_p (lhs)
4569 || type_dependent_expression_p (rhs));
4570 if (!dependent_p)
e6bd5565
MM
4571 {
4572 lhs = build_non_dependent_expr (lhs);
4573 rhs = build_non_dependent_expr (rhs);
4574 }
239371f9
JJ
4575 }
4576 if (!dependent_p)
4577 {
c2255bc4 4578 stmt = c_finish_omp_atomic (input_location, code, lhs, rhs);
239371f9
JJ
4579 if (stmt == error_mark_node)
4580 return;
e6bd5565 4581 }
239371f9
JJ
4582 if (processing_template_decl)
4583 stmt = build2 (OMP_ATOMIC, void_type_node, integer_zero_node,
4584 build2 (code, void_type_node, orig_lhs, orig_rhs));
4585 add_stmt (stmt);
1799e5d5
RH
4586}
4587
4588void
4589finish_omp_barrier (void)
4590{
4591 tree fn = built_in_decls[BUILT_IN_GOMP_BARRIER];
c166b898
ILT
4592 VEC(tree,gc) *vec = make_tree_vector ();
4593 tree stmt = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
4594 release_tree_vector (vec);
1799e5d5
RH
4595 finish_expr_stmt (stmt);
4596}
4597
4598void
4599finish_omp_flush (void)
4600{
4601 tree fn = built_in_decls[BUILT_IN_SYNCHRONIZE];
c166b898
ILT
4602 VEC(tree,gc) *vec = make_tree_vector ();
4603 tree stmt = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
4604 release_tree_vector (vec);
1799e5d5
RH
4605 finish_expr_stmt (stmt);
4606}
4607
a68ab351
JJ
4608void
4609finish_omp_taskwait (void)
1799e5d5 4610{
a68ab351 4611 tree fn = built_in_decls[BUILT_IN_GOMP_TASKWAIT];
c166b898
ILT
4612 VEC(tree,gc) *vec = make_tree_vector ();
4613 tree stmt = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
4614 release_tree_vector (vec);
a68ab351 4615 finish_expr_stmt (stmt);
1799e5d5
RH
4616}
4617\f
54f7877c 4618void
3a978d72 4619init_cp_semantics (void)
54f7877c 4620{
54f7877c 4621}
55a3debe
DG
4622\f
4623/* Build a STATIC_ASSERT for a static assertion with the condition
4624 CONDITION and the message text MESSAGE. LOCATION is the location
4625 of the static assertion in the source code. When MEMBER_P, this
4626 static assertion is a member of a class. */
4627void
4628finish_static_assert (tree condition, tree message, location_t location,
4629 bool member_p)
4630{
7b3e2d46
DG
4631 if (check_for_bare_parameter_packs (condition))
4632 condition = error_mark_node;
4633
55a3debe
DG
4634 if (type_dependent_expression_p (condition)
4635 || value_dependent_expression_p (condition))
4636 {
4637 /* We're in a template; build a STATIC_ASSERT and put it in
4638 the right place. */
4639 tree assertion;
4640
4641 assertion = make_node (STATIC_ASSERT);
4642 STATIC_ASSERT_CONDITION (assertion) = condition;
4643 STATIC_ASSERT_MESSAGE (assertion) = message;
4644 STATIC_ASSERT_SOURCE_LOCATION (assertion) = location;
4645
4646 if (member_p)
4647 maybe_add_class_template_decl_list (current_class_type,
4648 assertion,
4649 /*friend_p=*/0);
4650 else
4651 add_stmt (assertion);
4652
4653 return;
4654 }
4655
4656 /* Fold the expression and convert it to a boolean value. */
4657 condition = fold_non_dependent_expr (condition);
4658 condition = cp_convert (boolean_type_node, condition);
4659
4660 if (TREE_CODE (condition) == INTEGER_CST && !integer_zerop (condition))
4661 /* Do nothing; the condition is satisfied. */
4662 ;
4663 else
4664 {
4665 location_t saved_loc = input_location;
4666
4667 input_location = location;
4668 if (TREE_CODE (condition) == INTEGER_CST
4669 && integer_zerop (condition))
4670 /* Report the error. */
4671 error ("static assertion failed: %E", message);
4672 else if (condition && condition != error_mark_node)
4673 error ("non-constant condition for static assertion");
4674 input_location = saved_loc;
4675 }
4676}
3ad6a8e1 4677\f
4b4a42c4
JM
4678/* Returns the type of EXPR for cases where we can determine it even though
4679 EXPR is a type-dependent expression. */
a77f94e2
JM
4680
4681tree
4682describable_type (tree expr)
4683{
4684 tree type = NULL_TREE;
4685
a77f94e2
JM
4686 if (! type_dependent_expression_p (expr)
4687 && ! type_unknown_p (expr))
4688 {
aef8bce8 4689 type = unlowered_expr_type (expr);
a77f94e2
JM
4690 if (real_lvalue_p (expr))
4691 type = build_reference_type (type);
4692 }
a77f94e2
JM
4693
4694 if (type)
4695 return type;
4696
4697 switch (TREE_CODE (expr))
4698 {
4699 case VAR_DECL:
4700 case PARM_DECL:
4701 case RESULT_DECL:
4702 case FUNCTION_DECL:
4b4a42c4 4703 return TREE_TYPE (expr);
a77f94e2
JM
4704 break;
4705
4706 case NEW_EXPR:
4707 case CONST_DECL:
4708 case TEMPLATE_PARM_INDEX:
4709 case CAST_EXPR:
4710 case STATIC_CAST_EXPR:
4711 case REINTERPRET_CAST_EXPR:
4712 case CONST_CAST_EXPR:
4713 case DYNAMIC_CAST_EXPR:
4714 type = TREE_TYPE (expr);
4715 break;
4716
4717 case INDIRECT_REF:
4718 {
4719 tree ptrtype = describable_type (TREE_OPERAND (expr, 0));
4720 if (ptrtype && POINTER_TYPE_P (ptrtype))
4721 type = build_reference_type (TREE_TYPE (ptrtype));
4722 }
4723 break;
4724
4725 default:
4726 if (TREE_CODE_CLASS (TREE_CODE (expr)) == tcc_constant)
4727 type = TREE_TYPE (expr);
4728 break;
4729 }
4730
4731 if (type && type_uses_auto (type))
4732 return NULL_TREE;
4733 else
4734 return type;
4735}
4736
3ad6a8e1
DG
4737/* Implements the C++0x decltype keyword. Returns the type of EXPR,
4738 suitable for use as a type-specifier.
4739
4740 ID_EXPRESSION_OR_MEMBER_ACCESS_P is true when EXPR was parsed as an
4741 id-expression or a class member access, FALSE when it was parsed as
4742 a full expression. */
a77f94e2 4743
3ad6a8e1
DG
4744tree
4745finish_decltype_type (tree expr, bool id_expression_or_member_access_p)
4746{
4747 tree orig_expr = expr;
056dd1af 4748 tree type = NULL_TREE;
3ad6a8e1 4749
e4fd5b87
DG
4750 if (!expr || error_operand_p (expr))
4751 return error_mark_node;
4752
7a547b93
JJ
4753 if (TYPE_P (expr)
4754 || TREE_CODE (expr) == TYPE_DECL
4755 || (TREE_CODE (expr) == BIT_NOT_EXPR
4756 && TYPE_P (TREE_OPERAND (expr, 0))))
4757 {
4758 error ("argument to decltype must be an expression");
4759 return error_mark_node;
4760 }
4761
21920fd1
JM
4762 if (type_dependent_expression_p (expr)
4763 /* In a template, a COMPONENT_REF has an IDENTIFIER_NODE for op1 even
4764 if it isn't dependent, so that we can check access control at
4765 instantiation time, so defer the decltype as well (PR 42277). */
4766 || (id_expression_or_member_access_p
4767 && processing_template_decl
4768 && TREE_CODE (expr) == COMPONENT_REF))
3ad6a8e1 4769 {
a77f94e2
JM
4770 if (id_expression_or_member_access_p)
4771 {
4772 switch (TREE_CODE (expr))
4773 {
4774 case VAR_DECL:
4775 case PARM_DECL:
4776 case RESULT_DECL:
4777 case FUNCTION_DECL:
4778 case CONST_DECL:
4779 case TEMPLATE_PARM_INDEX:
4780 type = TREE_TYPE (expr);
4781 break;
4782
4783 default:
4784 break;
4785 }
4786 }
a77f94e2
JM
4787
4788 if (type && !type_uses_auto (type))
4789 return type;
4790
d1c05c88 4791 treat_as_dependent:
9e1e64ec 4792 type = cxx_make_type (DECLTYPE_TYPE);
3ad6a8e1
DG
4793 DECLTYPE_TYPE_EXPR (type) = expr;
4794 DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type)
4795 = id_expression_or_member_access_p;
4796 SET_TYPE_STRUCTURAL_EQUALITY (type);
4797
4798 return type;
4799 }
4800
4801 /* The type denoted by decltype(e) is defined as follows: */
4802
ccb05613 4803 expr = resolve_nondeduced_context (expr);
48326487
JM
4804
4805 /* To get the size of a static data member declared as an array of
4806 unknown bound, we need to instantiate it. */
4807 if (TREE_CODE (expr) == VAR_DECL
4808 && VAR_HAD_UNKNOWN_BOUND (expr)
4809 && DECL_TEMPLATE_INSTANTIATION (expr))
4810 instantiate_decl (expr, /*defer_ok*/true, /*expl_inst_mem*/false);
4811
3ad6a8e1
DG
4812 if (id_expression_or_member_access_p)
4813 {
4814 /* If e is an id-expression or a class member access (5.2.5
4815 [expr.ref]), decltype(e) is defined as the type of the entity
4816 named by e. If there is no such entity, or e names a set of
4817 overloaded functions, the program is ill-formed. */
4818 if (TREE_CODE (expr) == IDENTIFIER_NODE)
4819 expr = lookup_name (expr);
4820
4821 if (TREE_CODE (expr) == INDIRECT_REF)
4822 /* This can happen when the expression is, e.g., "a.b". Just
4823 look at the underlying operand. */
4824 expr = TREE_OPERAND (expr, 0);
4825
4826 if (TREE_CODE (expr) == OFFSET_REF
4827 || TREE_CODE (expr) == MEMBER_REF)
4828 /* We're only interested in the field itself. If it is a
4829 BASELINK, we will need to see through it in the next
4830 step. */
4831 expr = TREE_OPERAND (expr, 1);
4832
4833 if (TREE_CODE (expr) == BASELINK)
4834 /* See through BASELINK nodes to the underlying functions. */
4835 expr = BASELINK_FUNCTIONS (expr);
4836
ccb05613
JM
4837 if (TREE_CODE (expr) == TEMPLATE_ID_EXPR)
4838 expr = TREE_OPERAND (expr, 0);
4839
3ad6a8e1
DG
4840 if (TREE_CODE (expr) == OVERLOAD)
4841 {
ccb05613
JM
4842 if (OVL_CHAIN (expr)
4843 || TREE_CODE (OVL_FUNCTION (expr)) == TEMPLATE_DECL)
3ad6a8e1
DG
4844 {
4845 error ("%qE refers to a set of overloaded functions", orig_expr);
4846 return error_mark_node;
4847 }
4848 else
4849 /* An overload set containing only one function: just look
4850 at that function. */
4851 expr = OVL_FUNCTION (expr);
4852 }
4853
4854 switch (TREE_CODE (expr))
4855 {
4856 case FIELD_DECL:
e76d7cc7 4857 if (DECL_BIT_FIELD_TYPE (expr))
3ad6a8e1
DG
4858 {
4859 type = DECL_BIT_FIELD_TYPE (expr);
4860 break;
4861 }
4862 /* Fall through for fields that aren't bitfields. */
4863
4864 case FUNCTION_DECL:
4865 case VAR_DECL:
4866 case CONST_DECL:
4867 case PARM_DECL:
4868 case RESULT_DECL:
088d4f95 4869 case TEMPLATE_PARM_INDEX:
03a904b5 4870 expr = mark_type_use (expr);
3ad6a8e1
DG
4871 type = TREE_TYPE (expr);
4872 break;
4873
4874 case ERROR_MARK:
4875 type = error_mark_node;
4876 break;
4877
4878 case COMPONENT_REF:
03a904b5 4879 mark_type_use (expr);
3ad6a8e1
DG
4880 type = is_bitfield_expr_with_lowered_type (expr);
4881 if (!type)
4882 type = TREE_TYPE (TREE_OPERAND (expr, 1));
4883 break;
4884
4885 case BIT_FIELD_REF:
4886 gcc_unreachable ();
4887
4888 case INTEGER_CST:
4889 /* We can get here when the id-expression refers to an
4890 enumerator. */
4891 type = TREE_TYPE (expr);
4892 break;
4893
4894 default:
91929b4d
JJ
4895 gcc_assert (TYPE_P (expr) || DECL_P (expr)
4896 || TREE_CODE (expr) == SCOPE_REF);
3ad6a8e1
DG
4897 error ("argument to decltype must be an expression");
4898 return error_mark_node;
4899 }
4900 }
4901 else
4902 {
e4fd5b87
DG
4903 /* Expressions of reference type are sometimes wrapped in
4904 INDIRECT_REFs. INDIRECT_REFs are just internal compiler
4905 representation, not part of the language, so we have to look
4906 through them. */
4907 if (TREE_CODE (expr) == INDIRECT_REF
4908 && TREE_CODE (TREE_TYPE (TREE_OPERAND (expr, 0)))
4909 == REFERENCE_TYPE)
4910 expr = TREE_OPERAND (expr, 0);
4911
ed85a1f6
DG
4912 if (TREE_CODE (expr) == CALL_EXPR)
4913 {
4914 /* If e is a function call (5.2.2 [expr.call]) or an
3ad6a8e1
DG
4915 invocation of an overloaded operator (parentheses around e
4916 are ignored), decltype(e) is defined as the return type of
4917 that function. */
ed85a1f6
DG
4918 tree fndecl = get_callee_fndecl (expr);
4919 if (fndecl && fndecl != error_mark_node)
4920 type = TREE_TYPE (TREE_TYPE (fndecl));
4921 else
4922 {
4923 tree target_type = TREE_TYPE (CALL_EXPR_FN (expr));
4924 if ((TREE_CODE (target_type) == REFERENCE_TYPE
4925 || TREE_CODE (target_type) == POINTER_TYPE)
4926 && (TREE_CODE (TREE_TYPE (target_type)) == FUNCTION_TYPE
4927 || TREE_CODE (TREE_TYPE (target_type)) == METHOD_TYPE))
4928 type = TREE_TYPE (TREE_TYPE (target_type));
d1c05c88
JM
4929 else if (processing_template_decl)
4930 /* Within a template finish_call_expr doesn't resolve
4931 CALL_EXPR_FN, so even though this decltype isn't really
4932 dependent let's defer resolving it. */
4933 goto treat_as_dependent;
ed85a1f6
DG
4934 else
4935 sorry ("unable to determine the declared type of expression %<%E%>",
4936 expr);
4937 }
4938 }
3ad6a8e1
DG
4939 else
4940 {
4941 type = is_bitfield_expr_with_lowered_type (expr);
4942 if (type)
4943 {
4944 /* Bitfields are special, because their type encodes the
4945 number of bits they store. If the expression referenced a
4946 bitfield, TYPE now has the declared type of that
4947 bitfield. */
4948 type = cp_build_qualified_type (type,
4949 cp_type_quals (TREE_TYPE (expr)));
4950
4951 if (real_lvalue_p (expr))
4952 type = build_reference_type (type);
4953 }
d5f4eddd
JM
4954 /* Within a lambda-expression:
4955
4956 Every occurrence of decltype((x)) where x is a possibly
4957 parenthesized id-expression that names an entity of
4958 automatic storage duration is treated as if x were
4959 transformed into an access to a corresponding data member
4960 of the closure type that would have been declared if x
4961 were a use of the denoted entity. */
4962 else if (outer_automatic_var_p (expr)
4963 && current_function_decl
4964 && LAMBDA_FUNCTION_P (current_function_decl))
4965 type = capture_decltype (expr);
3ad6a8e1
DG
4966 else
4967 {
4968 /* Otherwise, where T is the type of e, if e is an lvalue,
4969 decltype(e) is defined as T&, otherwise decltype(e) is
4970 defined as T. */
4971 type = TREE_TYPE (expr);
e4fd5b87
DG
4972 if (type == error_mark_node)
4973 return error_mark_node;
4974 else if (expr == current_class_ptr)
3ad6a8e1
DG
4975 /* If the expression is just "this", we want the
4976 cv-unqualified pointer for the "this" type. */
4977 type = TYPE_MAIN_VARIANT (type);
4978 else if (real_lvalue_p (expr))
4979 {
4980 if (TREE_CODE (type) != REFERENCE_TYPE)
4981 type = build_reference_type (type);
4982 }
4983 else
4984 type = non_reference (type);
4985 }
4986 }
4987 }
4988
4989 if (!type || type == unknown_type_node)
4990 {
4991 error ("type of %qE is unknown", expr);
4992 return error_mark_node;
4993 }
4994
4995 return type;
4996}
cf22909c 4997
b29441ec
PC
4998/* Called from trait_expr_value to evaluate either __has_nothrow_assign or
4999 __has_nothrow_copy, depending on assign_p. */
cb68ec50
PC
5000
5001static bool
b29441ec 5002classtype_has_nothrow_assign_or_copy_p (tree type, bool assign_p)
cb68ec50 5003{
b29441ec 5004 tree fns;
cb68ec50 5005
b29441ec
PC
5006 if (assign_p)
5007 {
5008 int ix;
5009 ix = lookup_fnfields_1 (type, ansi_assopname (NOP_EXPR));
5010 if (ix < 0)
cb68ec50 5011 return false;
b29441ec
PC
5012 fns = VEC_index (tree, CLASSTYPE_METHOD_VEC (type), ix);
5013 }
066ec0a4 5014 else if (TYPE_HAS_COPY_CTOR (type))
b29441ec
PC
5015 {
5016 /* If construction of the copy constructor was postponed, create
5017 it now. */
5018 if (CLASSTYPE_LAZY_COPY_CTOR (type))
5019 lazily_declare_fn (sfk_copy_constructor, type);
d5f4eddd
JM
5020 if (CLASSTYPE_LAZY_MOVE_CTOR (type))
5021 lazily_declare_fn (sfk_move_constructor, type);
b29441ec 5022 fns = CLASSTYPE_CONSTRUCTORS (type);
cb68ec50
PC
5023 }
5024 else
5025 return false;
5026
b29441ec 5027 for (; fns; fns = OVL_NEXT (fns))
279086c3
PC
5028 {
5029 tree fn = OVL_CURRENT (fns);
5030
5031 if (assign_p)
5032 {
5033 if (copy_fn_p (fn) == 0)
5034 continue;
5035 }
5036 else if (copy_fn_p (fn) <= 0)
5037 continue;
5038
5039 if (!TYPE_NOTHROW_P (TREE_TYPE (fn)))
5040 return false;
5041 }
b29441ec 5042
cb68ec50
PC
5043 return true;
5044}
5045
5046/* Actually evaluates the trait. */
5047
5048static bool
5049trait_expr_value (cp_trait_kind kind, tree type1, tree type2)
5050{
5051 enum tree_code type_code1;
5052 tree t;
5053
5054 type_code1 = TREE_CODE (type1);
5055
5056 switch (kind)
5057 {
5058 case CPTK_HAS_NOTHROW_ASSIGN:
c32097d8 5059 type1 = strip_array_types (type1);
b29441ec
PC
5060 return (!CP_TYPE_CONST_P (type1) && type_code1 != REFERENCE_TYPE
5061 && (trait_expr_value (CPTK_HAS_TRIVIAL_ASSIGN, type1, type2)
5062 || (CLASS_TYPE_P (type1)
5063 && classtype_has_nothrow_assign_or_copy_p (type1,
5064 true))));
cb68ec50
PC
5065
5066 case CPTK_HAS_TRIVIAL_ASSIGN:
c32097d8
JM
5067 /* ??? The standard seems to be missing the "or array of such a class
5068 type" wording for this trait. */
5069 type1 = strip_array_types (type1);
cb68ec50 5070 return (!CP_TYPE_CONST_P (type1) && type_code1 != REFERENCE_TYPE
c32097d8 5071 && (trivial_type_p (type1)
cb68ec50 5072 || (CLASS_TYPE_P (type1)
066ec0a4 5073 && TYPE_HAS_TRIVIAL_COPY_ASSIGN (type1))));
cb68ec50
PC
5074
5075 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
5076 type1 = strip_array_types (type1);
5077 return (trait_expr_value (CPTK_HAS_TRIVIAL_CONSTRUCTOR, type1, type2)
5078 || (CLASS_TYPE_P (type1)
e24313f3
PC
5079 && (t = locate_ctor (type1, NULL))
5080 && TYPE_NOTHROW_P (TREE_TYPE (t))));
cb68ec50
PC
5081
5082 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
5083 type1 = strip_array_types (type1);
c32097d8 5084 return (trivial_type_p (type1)
cb68ec50
PC
5085 || (CLASS_TYPE_P (type1) && TYPE_HAS_TRIVIAL_DFLT (type1)));
5086
5087 case CPTK_HAS_NOTHROW_COPY:
c32097d8 5088 type1 = strip_array_types (type1);
cb68ec50
PC
5089 return (trait_expr_value (CPTK_HAS_TRIVIAL_COPY, type1, type2)
5090 || (CLASS_TYPE_P (type1)
b29441ec 5091 && classtype_has_nothrow_assign_or_copy_p (type1, false)));
cb68ec50
PC
5092
5093 case CPTK_HAS_TRIVIAL_COPY:
c32097d8
JM
5094 /* ??? The standard seems to be missing the "or array of such a class
5095 type" wording for this trait. */
5096 type1 = strip_array_types (type1);
5097 return (trivial_type_p (type1) || type_code1 == REFERENCE_TYPE
066ec0a4 5098 || (CLASS_TYPE_P (type1) && TYPE_HAS_TRIVIAL_COPY_CTOR (type1)));
cb68ec50
PC
5099
5100 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
5101 type1 = strip_array_types (type1);
c32097d8 5102 return (trivial_type_p (type1) || type_code1 == REFERENCE_TYPE
cb68ec50
PC
5103 || (CLASS_TYPE_P (type1)
5104 && TYPE_HAS_TRIVIAL_DESTRUCTOR (type1)));
5105
5106 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
5107 return (CLASS_TYPE_P (type1)
5108 && (t = locate_dtor (type1, NULL)) && DECL_VIRTUAL_P (t));
5109
5110 case CPTK_IS_ABSTRACT:
5111 return (CLASS_TYPE_P (type1) && CLASSTYPE_PURE_VIRTUALS (type1));
5112
5113 case CPTK_IS_BASE_OF:
5114 return (NON_UNION_CLASS_TYPE_P (type1) && NON_UNION_CLASS_TYPE_P (type2)
5115 && DERIVED_FROM_P (type1, type2));
5116
5117 case CPTK_IS_CLASS:
5118 return (NON_UNION_CLASS_TYPE_P (type1));
5119
5120 case CPTK_IS_CONVERTIBLE_TO:
5121 /* TODO */
5122 return false;
5123
5124 case CPTK_IS_EMPTY:
5125 return (NON_UNION_CLASS_TYPE_P (type1) && CLASSTYPE_EMPTY_P (type1));
5126
5127 case CPTK_IS_ENUM:
5128 return (type_code1 == ENUMERAL_TYPE);
5129
5130 case CPTK_IS_POD:
5131 return (pod_type_p (type1));
5132
5133 case CPTK_IS_POLYMORPHIC:
5134 return (CLASS_TYPE_P (type1) && TYPE_POLYMORPHIC_P (type1));
5135
c32097d8
JM
5136 case CPTK_IS_STD_LAYOUT:
5137 return (std_layout_type_p (type1));
5138
5139 case CPTK_IS_TRIVIAL:
5140 return (trivial_type_p (type1));
5141
cb68ec50
PC
5142 case CPTK_IS_UNION:
5143 return (type_code1 == UNION_TYPE);
5144
5145 default:
5146 gcc_unreachable ();
5147 return false;
5148 }
5149}
5150
ff284b4b
PC
5151/* Returns true if TYPE is a complete type, an array of unknown bound,
5152 or (possibly cv-qualified) void, returns false otherwise. */
5153
5154static bool
5155check_trait_type (tree type)
5156{
5157 if (COMPLETE_TYPE_P (type))
5158 return true;
5159
f94ae987
JM
5160 if (TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type)
5161 && COMPLETE_TYPE_P (TREE_TYPE (type)))
ff284b4b
PC
5162 return true;
5163
5164 if (VOID_TYPE_P (type))
5165 return true;
5166
5167 return false;
5168}
5169
cb68ec50
PC
5170/* Process a trait expression. */
5171
5172tree
5173finish_trait_expr (cp_trait_kind kind, tree type1, tree type2)
5174{
5175 gcc_assert (kind == CPTK_HAS_NOTHROW_ASSIGN
5176 || kind == CPTK_HAS_NOTHROW_CONSTRUCTOR
5177 || kind == CPTK_HAS_NOTHROW_COPY
5178 || kind == CPTK_HAS_TRIVIAL_ASSIGN
5179 || kind == CPTK_HAS_TRIVIAL_CONSTRUCTOR
5180 || kind == CPTK_HAS_TRIVIAL_COPY
5181 || kind == CPTK_HAS_TRIVIAL_DESTRUCTOR
5182 || kind == CPTK_HAS_VIRTUAL_DESTRUCTOR
5183 || kind == CPTK_IS_ABSTRACT
5184 || kind == CPTK_IS_BASE_OF
5185 || kind == CPTK_IS_CLASS
5186 || kind == CPTK_IS_CONVERTIBLE_TO
5187 || kind == CPTK_IS_EMPTY
5188 || kind == CPTK_IS_ENUM
5189 || kind == CPTK_IS_POD
5190 || kind == CPTK_IS_POLYMORPHIC
c32097d8
JM
5191 || kind == CPTK_IS_STD_LAYOUT
5192 || kind == CPTK_IS_TRIVIAL
cb68ec50
PC
5193 || kind == CPTK_IS_UNION);
5194
5195 if (kind == CPTK_IS_CONVERTIBLE_TO)
5196 {
5197 sorry ("__is_convertible_to");
5198 return error_mark_node;
5199 }
5200
5201 if (type1 == error_mark_node
5202 || ((kind == CPTK_IS_BASE_OF || kind == CPTK_IS_CONVERTIBLE_TO)
5203 && type2 == error_mark_node))
5204 return error_mark_node;
5205
5206 if (processing_template_decl)
5207 {
5208 tree trait_expr = make_node (TRAIT_EXPR);
5209 TREE_TYPE (trait_expr) = boolean_type_node;
5210 TRAIT_EXPR_TYPE1 (trait_expr) = type1;
5211 TRAIT_EXPR_TYPE2 (trait_expr) = type2;
5212 TRAIT_EXPR_KIND (trait_expr) = kind;
5213 return trait_expr;
5214 }
5215
10c1d4af
PC
5216 complete_type (type1);
5217 if (type2)
5218 complete_type (type2);
5219
ff284b4b 5220 switch (kind)
cb68ec50 5221 {
ff284b4b
PC
5222 case CPTK_HAS_NOTHROW_ASSIGN:
5223 case CPTK_HAS_TRIVIAL_ASSIGN:
5224 case CPTK_HAS_NOTHROW_CONSTRUCTOR:
5225 case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
5226 case CPTK_HAS_NOTHROW_COPY:
5227 case CPTK_HAS_TRIVIAL_COPY:
5228 case CPTK_HAS_TRIVIAL_DESTRUCTOR:
5229 case CPTK_HAS_VIRTUAL_DESTRUCTOR:
5230 case CPTK_IS_ABSTRACT:
5231 case CPTK_IS_EMPTY:
5232 case CPTK_IS_POD:
5233 case CPTK_IS_POLYMORPHIC:
c32097d8
JM
5234 case CPTK_IS_STD_LAYOUT:
5235 case CPTK_IS_TRIVIAL:
ff284b4b
PC
5236 if (!check_trait_type (type1))
5237 {
5238 error ("incomplete type %qT not allowed", type1);
5239 return error_mark_node;
5240 }
5241 break;
5242
5243 case CPTK_IS_BASE_OF:
5244 if (NON_UNION_CLASS_TYPE_P (type1) && NON_UNION_CLASS_TYPE_P (type2)
5245 && !same_type_ignoring_top_level_qualifiers_p (type1, type2)
5246 && !COMPLETE_TYPE_P (type2))
5247 {
5248 error ("incomplete type %qT not allowed", type2);
5249 return error_mark_node;
5250 }
5251 break;
5252
5253 case CPTK_IS_CLASS:
5254 case CPTK_IS_ENUM:
5255 case CPTK_IS_UNION:
5256 break;
5257
5258 case CPTK_IS_CONVERTIBLE_TO:
5259 default:
5260 gcc_unreachable ();
cb68ec50
PC
5261 }
5262
5263 return (trait_expr_value (kind, type1, type2)
5264 ? boolean_true_node : boolean_false_node);
5265}
5266
6ec637a4
JJ
5267/* Do-nothing variants of functions to handle pragma FLOAT_CONST_DECIMAL64,
5268 which is ignored for C++. */
5269
5270void
5271set_float_const_decimal64 (void)
5272{
5273}
5274
5275void
5276clear_float_const_decimal64 (void)
5277{
5278}
5279
5280bool
5281float_const_decimal64_p (void)
5282{
5283 return 0;
5284}
5285
7ecbca9d
GDR
5286/* Return true if T is a literal type. */
5287
5288bool
5289literal_type_p (tree t)
5290{
5291 if (SCALAR_TYPE_P (t))
5292 return true;
5293 if (CLASS_TYPE_P (t))
5294 return CLASSTYPE_LITERAL_P (t);
5295 if (TREE_CODE (t) == ARRAY_TYPE)
5296 return literal_type_p (strip_array_types (t));
5297 return false;
5298}
5299
5300
5301/* If DECL is a variable declared `constexpr', require its type
5302 be literal. Return the DECL if OK, otherwise NULL. */
5303
5304tree
5305ensure_literal_type_for_constexpr_object (tree decl)
5306{
5307 tree type = TREE_TYPE (decl);
5308 if (TREE_CODE (decl) == VAR_DECL && DECL_DECLARED_CONSTEXPR_P (decl)
5309 && !processing_template_decl && !literal_type_p (type))
5310 {
5311 error ("the type %qT of constexpr variable %qD is not literal",
5312 type, decl);
5313 return NULL;
5314 }
5315 return decl;
5316}
5317
5318/* Return non-null if FUN certainly designates a valid constexpr function
5319 declaration. Otherwise return NULL. Issue appropriate diagnostics
5320 if necessary. Note that we only check the declaration, not the body
5321 of the function. */
5322
5323tree
5324validate_constexpr_fundecl (tree fun)
5325{
5326 tree rettype = NULL;
5327 tree parm = NULL;
5328
5329 /* Don't bother if FUN is not marked constexpr. */
5330 if (!DECL_DECLARED_CONSTEXPR_P (fun))
5331 return NULL;
5332
5333 /* For a function template, we have absolutely no guarantee that all
5334 instantiations will be constexpr. */
5335 if (TREE_CODE (fun) == TEMPLATE_DECL)
5336 return NULL;
5337
5338 parm = FUNCTION_FIRST_USER_PARM (fun);
5339 for (; parm != NULL; parm = TREE_CHAIN (parm))
5340 {
5341 tree type = TREE_TYPE (parm);
5342 if (dependent_type_p (type))
5343 return NULL;
5344 if (!literal_type_p (type))
5345 {
5346 error ("parameter %q#D is not of literal type", parm);
5347 return NULL;
5348 }
5349 }
5350
5351 if (DECL_CONSTRUCTOR_P (fun))
5352 return fun;
5353
5354 rettype = TREE_TYPE (TREE_TYPE (fun));
5355 if (dependent_type_p (rettype))
5356 return NULL;
5357 if (!literal_type_p (rettype))
5358 {
5359 error ("return type %qT of function %qD is not a literal type",
5360 TREE_TYPE (TREE_TYPE (fun)), fun);
5361 return NULL;
5362 }
5363 return fun;
5364}
5365
5366
d5f4eddd
JM
5367/* Constructor for a lambda expression. */
5368
5369tree
5370build_lambda_expr (void)
5371{
5372 tree lambda = make_node (LAMBDA_EXPR);
5373 LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda) = CPLD_NONE;
5374 LAMBDA_EXPR_CAPTURE_LIST (lambda) = NULL_TREE;
5375 LAMBDA_EXPR_THIS_CAPTURE (lambda) = NULL_TREE;
5376 LAMBDA_EXPR_RETURN_TYPE (lambda) = NULL_TREE;
5377 LAMBDA_EXPR_MUTABLE_P (lambda) = false;
5378 return lambda;
5379}
5380
5381/* Create the closure object for a LAMBDA_EXPR. */
5382
5383tree
5384build_lambda_object (tree lambda_expr)
5385{
5386 /* Build aggregate constructor call.
5387 - cp_parser_braced_list
5388 - cp_parser_functional_cast */
5389 VEC(constructor_elt,gc) *elts = NULL;
5390 tree node, expr, type;
5391 location_t saved_loc;
5392
5393 if (processing_template_decl)
5394 return lambda_expr;
5395
5396 /* Make sure any error messages refer to the lambda-introducer. */
5397 saved_loc = input_location;
5398 input_location = LAMBDA_EXPR_LOCATION (lambda_expr);
5399
5400 for (node = LAMBDA_EXPR_CAPTURE_LIST (lambda_expr);
5401 node;
5402 node = TREE_CHAIN (node))
5403 {
5404 tree field = TREE_PURPOSE (node);
5405 tree val = TREE_VALUE (node);
5406
1f4a7a48
JM
5407 if (DECL_P (val))
5408 mark_used (val);
5409
d5f4eddd
JM
5410 /* Mere mortals can't copy arrays with aggregate initialization, so
5411 do some magic to make it work here. */
5412 if (TREE_CODE (TREE_TYPE (field)) == ARRAY_TYPE)
5413 val = build_array_copy (val);
37a7519a
JM
5414 else if (DECL_NORMAL_CAPTURE_P (field)
5415 && TREE_CODE (TREE_TYPE (field)) != REFERENCE_TYPE)
5416 {
5417 /* "the entities that are captured by copy are used to
5418 direct-initialize each corresponding non-static data
5419 member of the resulting closure object."
5420
5421 There's normally no way to express direct-initialization
5422 from an element of a CONSTRUCTOR, so we build up a special
5423 TARGET_EXPR to bypass the usual copy-initialization. */
5424 val = force_rvalue (val);
5425 if (TREE_CODE (val) == TARGET_EXPR)
5426 TARGET_EXPR_DIRECT_INIT_P (val) = true;
5427 }
d5f4eddd
JM
5428
5429 CONSTRUCTOR_APPEND_ELT (elts, DECL_NAME (field), val);
5430 }
5431
5432 expr = build_constructor (init_list_type_node, elts);
5433 CONSTRUCTOR_IS_DIRECT_INIT (expr) = 1;
5434
5435 /* N2927: "[The closure] class type is not an aggregate."
5436 But we briefly treat it as an aggregate to make this simpler. */
5437 type = TREE_TYPE (lambda_expr);
5438 CLASSTYPE_NON_AGGREGATE (type) = 0;
5439 expr = finish_compound_literal (type, expr);
5440 CLASSTYPE_NON_AGGREGATE (type) = 1;
5441
5442 input_location = saved_loc;
5443 return expr;
5444}
5445
5446/* Return an initialized RECORD_TYPE for LAMBDA.
5447 LAMBDA must have its explicit captures already. */
5448
5449tree
5450begin_lambda_type (tree lambda)
5451{
5452 tree type;
5453
5454 {
5455 /* Unique name. This is just like an unnamed class, but we cannot use
5456 make_anon_name because of certain checks against TYPE_ANONYMOUS_P. */
5457 tree name;
5458 name = make_lambda_name ();
5459
5460 /* Create the new RECORD_TYPE for this lambda. */
5461 type = xref_tag (/*tag_code=*/record_type,
5462 name,
5463 /*scope=*/ts_within_enclosing_non_class,
5464 /*template_header_p=*/false);
5465 }
5466
5467 /* Designate it as a struct so that we can use aggregate initialization. */
5468 CLASSTYPE_DECLARED_CLASS (type) = false;
5469
5470 /* Clear base types. */
5471 xref_basetypes (type, /*bases=*/NULL_TREE);
5472
5473 /* Start the class. */
5474 type = begin_class_definition (type, /*attributes=*/NULL_TREE);
5475
5476 /* Cross-reference the expression and the type. */
5477 TREE_TYPE (lambda) = type;
5478 CLASSTYPE_LAMBDA_EXPR (type) = lambda;
5479
5480 return type;
5481}
5482
5483/* Returns the type to use for the return type of the operator() of a
5484 closure class. */
5485
5486tree
5487lambda_return_type (tree expr)
5488{
5489 tree type;
95b24c84
JM
5490 if (BRACE_ENCLOSED_INITIALIZER_P (expr))
5491 {
5492 warning (0, "cannot deduce lambda return type from a braced-init-list");
5493 return void_type_node;
5494 }
d5f4eddd
JM
5495 if (type_dependent_expression_p (expr))
5496 {
5497 type = cxx_make_type (DECLTYPE_TYPE);
5498 DECLTYPE_TYPE_EXPR (type) = expr;
5499 DECLTYPE_FOR_LAMBDA_RETURN (type) = true;
5500 SET_TYPE_STRUCTURAL_EQUALITY (type);
5501 }
5502 else
5503 type = type_decays_to (unlowered_expr_type (expr));
5504 return type;
5505}
5506
5507/* Given a LAMBDA_EXPR or closure type LAMBDA, return the op() of the
5508 closure type. */
5509
5510tree
5511lambda_function (tree lambda)
5512{
5513 tree type;
5514 if (TREE_CODE (lambda) == LAMBDA_EXPR)
5515 type = TREE_TYPE (lambda);
5516 else
5517 type = lambda;
5518 gcc_assert (LAMBDA_TYPE_P (type));
5519 /* Don't let debug_tree cause instantiation. */
5520 if (CLASSTYPE_TEMPLATE_INSTANTIATION (type) && !COMPLETE_TYPE_P (type))
5521 return NULL_TREE;
5522 lambda = lookup_member (type, ansi_opname (CALL_EXPR),
5523 /*protect=*/0, /*want_type=*/false);
5524 if (lambda)
5525 lambda = BASELINK_FUNCTIONS (lambda);
5526 return lambda;
5527}
5528
5529/* Returns the type to use for the FIELD_DECL corresponding to the
5530 capture of EXPR.
5531 The caller should add REFERENCE_TYPE for capture by reference. */
5532
5533tree
5534lambda_capture_field_type (tree expr)
5535{
5536 tree type;
5537 if (type_dependent_expression_p (expr))
5538 {
5539 type = cxx_make_type (DECLTYPE_TYPE);
5540 DECLTYPE_TYPE_EXPR (type) = expr;
5541 DECLTYPE_FOR_LAMBDA_CAPTURE (type) = true;
5542 SET_TYPE_STRUCTURAL_EQUALITY (type);
5543 }
5544 else
5545 type = non_reference (unlowered_expr_type (expr));
5546 return type;
5547}
5548
5549/* Recompute the return type for LAMBDA with body of the form:
5550 { return EXPR ; } */
5551
5552void
5553apply_lambda_return_type (tree lambda, tree return_type)
5554{
5555 tree fco = lambda_function (lambda);
5556 tree result;
5557
5558 LAMBDA_EXPR_RETURN_TYPE (lambda) = return_type;
5559
5560 /* If we got a DECLTYPE_TYPE, don't stick it in the function yet,
5561 it would interfere with instantiating the closure type. */
5562 if (dependent_type_p (return_type))
5563 return;
5564 if (return_type == error_mark_node)
5565 return;
5566
5567 /* TREE_TYPE (FUNCTION_DECL) == METHOD_TYPE
5568 TREE_TYPE (METHOD_TYPE) == return-type */
643d4cd6 5569 TREE_TYPE (fco) = change_return_type (return_type, TREE_TYPE (fco));
d5f4eddd
JM
5570
5571 result = DECL_RESULT (fco);
5572 if (result == NULL_TREE)
5573 return;
5574
5575 /* We already have a DECL_RESULT from start_preparsed_function.
5576 Now we need to redo the work it and allocate_struct_function
5577 did to reflect the new type. */
5578 result = build_decl (input_location, RESULT_DECL, NULL_TREE,
5579 TYPE_MAIN_VARIANT (return_type));
5580 DECL_ARTIFICIAL (result) = 1;
5581 DECL_IGNORED_P (result) = 1;
5582 cp_apply_type_quals_to_decl (cp_type_quals (return_type),
5583 result);
5584
5585 DECL_RESULT (fco) = result;
5586
5587 if (!processing_template_decl && aggregate_value_p (result, fco))
5588 {
5589#ifdef PCC_STATIC_STRUCT_RETURN
5590 cfun->returns_pcc_struct = 1;
5591#endif
5592 cfun->returns_struct = 1;
5593 }
5594
5595}
5596
5597/* DECL is a local variable or parameter from the surrounding scope of a
5598 lambda-expression. Returns the decltype for a use of the capture field
5599 for DECL even if it hasn't been captured yet. */
5600
5601static tree
5602capture_decltype (tree decl)
5603{
5604 tree lam = CLASSTYPE_LAMBDA_EXPR (DECL_CONTEXT (current_function_decl));
5605 /* FIXME do lookup instead of list walk? */
5606 tree cap = value_member (decl, LAMBDA_EXPR_CAPTURE_LIST (lam));
5607 tree type;
5608
5609 if (cap)
5610 type = TREE_TYPE (TREE_PURPOSE (cap));
5611 else
5612 switch (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lam))
5613 {
5614 case CPLD_NONE:
5615 error ("%qD is not captured", decl);
5616 return error_mark_node;
5617
5618 case CPLD_COPY:
5619 type = TREE_TYPE (decl);
5620 if (TREE_CODE (type) == REFERENCE_TYPE
5621 && TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE)
5622 type = TREE_TYPE (type);
5623 break;
5624
5625 case CPLD_REFERENCE:
5626 type = TREE_TYPE (decl);
5627 if (TREE_CODE (type) != REFERENCE_TYPE)
5628 type = build_reference_type (TREE_TYPE (decl));
5629 break;
5630
5631 default:
5632 gcc_unreachable ();
5633 }
5634
5635 if (TREE_CODE (type) != REFERENCE_TYPE)
5636 {
5637 if (!LAMBDA_EXPR_MUTABLE_P (lam))
a3360e77 5638 type = cp_build_qualified_type (type, (cp_type_quals (type)
d5f4eddd
JM
5639 |TYPE_QUAL_CONST));
5640 type = build_reference_type (type);
5641 }
5642 return type;
5643}
5644
5645/* From an ID and INITIALIZER, create a capture (by reference if
5646 BY_REFERENCE_P is true), add it to the capture-list for LAMBDA,
5647 and return it. */
5648
5649tree
37a7519a
JM
5650add_capture (tree lambda, tree id, tree initializer, bool by_reference_p,
5651 bool explicit_init_p)
d5f4eddd
JM
5652{
5653 tree type;
5654 tree member;
5655
5656 type = lambda_capture_field_type (initializer);
5657 if (by_reference_p)
5658 {
5659 type = build_reference_type (type);
5660 if (!real_lvalue_p (initializer))
5661 error ("cannot capture %qE by reference", initializer);
5662 }
5663
5664 /* Make member variable. */
5665 member = build_lang_decl (FIELD_DECL, id, type);
37a7519a
JM
5666 if (!explicit_init_p)
5667 /* Normal captures are invisible to name lookup but uses are replaced
5668 with references to the capture field; we implement this by only
5669 really making them invisible in unevaluated context; see
5670 qualify_lookup. For now, let's make explicitly initialized captures
5671 always visible. */
5672 DECL_NORMAL_CAPTURE_P (member) = true;
d5f4eddd 5673
19030d77
JM
5674 /* Add it to the appropriate closure class if we've started it. */
5675 if (current_class_type && current_class_type == TREE_TYPE (lambda))
5676 finish_member_declaration (member);
d5f4eddd
JM
5677
5678 LAMBDA_EXPR_CAPTURE_LIST (lambda)
5679 = tree_cons (member, initializer, LAMBDA_EXPR_CAPTURE_LIST (lambda));
5680
5681 if (id == get_identifier ("__this"))
5682 {
5683 if (LAMBDA_EXPR_CAPTURES_THIS_P (lambda))
5684 error ("already captured %<this%> in lambda expression");
5685 LAMBDA_EXPR_THIS_CAPTURE (lambda) = member;
5686 }
5687
5688 return member;
5689}
5690
19030d77
JM
5691/* Register all the capture members on the list CAPTURES, which is the
5692 LAMBDA_EXPR_CAPTURE_LIST for the lambda after the introducer. */
5693
5694void register_capture_members (tree captures)
5695{
5696 if (captures)
5697 {
5698 register_capture_members (TREE_CHAIN (captures));
5699 finish_member_declaration (TREE_PURPOSE (captures));
5700 }
5701}
5702
9660afe0
JM
5703/* Given a FIELD_DECL decl belonging to a closure type, return a
5704 COMPONENT_REF of it relative to the 'this' parameter of the op() for
5705 that type. */
5706
5707static tree
5708thisify_lambda_field (tree decl)
5709{
5710 tree context = lambda_function (DECL_CONTEXT (decl));
5711 tree object = cp_build_indirect_ref (DECL_ARGUMENTS (context),
dd865ef6 5712 RO_NULL,
9660afe0
JM
5713 tf_warning_or_error);
5714 return finish_non_static_data_member (decl, object,
5715 /*qualifying_scope*/NULL_TREE);
5716}
5717
d5f4eddd
JM
5718/* Similar to add_capture, except this works on a stack of nested lambdas.
5719 BY_REFERENCE_P in this case is derived from the default capture mode.
5720 Returns the capture for the lambda at the bottom of the stack. */
5721
5722tree
5723add_default_capture (tree lambda_stack, tree id, tree initializer)
5724{
5725 bool this_capture_p = (id == get_identifier ("__this"));
5726
5727 tree member = NULL_TREE;
5728
5729 tree saved_class_type = current_class_type;
5730
5731 tree node;
5732
5733 for (node = lambda_stack;
5734 node;
5735 node = TREE_CHAIN (node))
5736 {
5737 tree lambda = TREE_VALUE (node);
5738
5739 current_class_type = TREE_TYPE (lambda);
5740 member = add_capture (lambda,
5741 id,
5742 initializer,
5743 /*by_reference_p=*/
5744 (!this_capture_p
5745 && (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda)
37a7519a
JM
5746 == CPLD_REFERENCE)),
5747 /*explicit_init_p=*/false);
9660afe0 5748 initializer = thisify_lambda_field (member);
d5f4eddd
JM
5749 }
5750
5751 current_class_type = saved_class_type;
5752
5753 return member;
d5f4eddd
JM
5754}
5755
5756/* Return the capture pertaining to a use of 'this' in LAMBDA, in the form of an
5757 INDIRECT_REF, possibly adding it through default capturing. */
5758
5759tree
5760lambda_expr_this_capture (tree lambda)
5761{
5762 tree result;
5763
5764 tree this_capture = LAMBDA_EXPR_THIS_CAPTURE (lambda);
5765
5766 /* Try to default capture 'this' if we can. */
5767 if (!this_capture
5768 && LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda) != CPLD_NONE)
5769 {
5770 tree containing_function = TYPE_CONTEXT (TREE_TYPE (lambda));
5771 tree lambda_stack = tree_cons (NULL_TREE, lambda, NULL_TREE);
71d16049 5772 tree init = NULL_TREE;
d5f4eddd
JM
5773
5774 /* If we are in a lambda function, we can move out until we hit:
5775 1. a non-lambda function,
5776 2. a lambda function capturing 'this', or
5777 3. a non-default capturing lambda function. */
5778 while (LAMBDA_FUNCTION_P (containing_function))
5779 {
5780 tree lambda
5781 = CLASSTYPE_LAMBDA_EXPR (DECL_CONTEXT (containing_function));
5782
71d16049
JM
5783 if (LAMBDA_EXPR_THIS_CAPTURE (lambda))
5784 {
5785 /* An outer lambda has already captured 'this'. */
5786 tree cap = LAMBDA_EXPR_THIS_CAPTURE (lambda);
92de1b37 5787 init = thisify_lambda_field (cap);
71d16049
JM
5788 break;
5789 }
5790
5791 if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda) == CPLD_NONE)
5792 /* An outer lambda won't let us capture 'this'. */
5793 break;
d5f4eddd
JM
5794
5795 lambda_stack = tree_cons (NULL_TREE,
5796 lambda,
5797 lambda_stack);
5798
5799 containing_function = decl_function_context (containing_function);
5800 }
5801
71d16049
JM
5802 if (!init && DECL_NONSTATIC_MEMBER_FUNCTION_P (containing_function)
5803 && !LAMBDA_FUNCTION_P (containing_function))
5804 /* First parameter is 'this'. */
5805 init = DECL_ARGUMENTS (containing_function);
d5f4eddd 5806
71d16049
JM
5807 if (init)
5808 this_capture = add_default_capture (lambda_stack,
5809 /*id=*/get_identifier ("__this"),
5810 init);
d5f4eddd
JM
5811 }
5812
5813 if (!this_capture)
5814 {
5815 error ("%<this%> was not captured for this lambda function");
5816 result = error_mark_node;
5817 }
5818 else
5819 {
5820 /* To make sure that current_class_ref is for the lambda. */
5821 gcc_assert (TYPE_MAIN_VARIANT (TREE_TYPE (current_class_ref)) == TREE_TYPE (lambda));
5822
5823 result = finish_non_static_data_member (this_capture,
2defb926 5824 NULL_TREE,
d5f4eddd
JM
5825 /*qualifying_scope=*/NULL_TREE);
5826
5827 /* If 'this' is captured, each use of 'this' is transformed into an
5828 access to the corresponding unnamed data member of the closure
5829 type cast (_expr.cast_ 5.4) to the type of 'this'. [ The cast
5830 ensures that the transformed expression is an rvalue. ] */
5831 result = rvalue (result);
5832 }
5833
5834 return result;
5835}
5836
a6846853
JM
5837/* Returns the method basetype of the innermost non-lambda function, or
5838 NULL_TREE if none. */
5839
5840tree
5841nonlambda_method_basetype (void)
5842{
5843 tree fn, type;
5844 if (!current_class_ref)
5845 return NULL_TREE;
5846
5847 type = current_class_type;
5848 if (!LAMBDA_TYPE_P (type))
5849 return type;
5850
5851 /* Find the nearest enclosing non-lambda function. */
5852 fn = TYPE_NAME (type);
5853 do
5854 fn = decl_function_context (fn);
5855 while (fn && LAMBDA_FUNCTION_P (fn));
5856
5857 if (!fn || !DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
5858 return NULL_TREE;
5859
5860 return TYPE_METHOD_BASETYPE (TREE_TYPE (fn));
5861}
5862
b77068f2
JM
5863/* If the closure TYPE has a static op(), also add a conversion to function
5864 pointer. */
5865
5866void
5867maybe_add_lambda_conv_op (tree type)
5868{
5869 bool nested = (current_function_decl != NULL_TREE);
5870 tree callop = lambda_function (type);
5871 tree rettype, name, fntype, fn, body, compound_stmt;
c6be04ad
JM
5872 tree thistype, stattype, statfn, convfn, call, arg;
5873 VEC (tree, gc) *argvec;
b77068f2 5874
c6be04ad 5875 if (LAMBDA_EXPR_CAPTURE_LIST (CLASSTYPE_LAMBDA_EXPR (type)) != NULL_TREE)
b77068f2
JM
5876 return;
5877
c6be04ad
JM
5878 stattype = build_function_type (TREE_TYPE (TREE_TYPE (callop)),
5879 FUNCTION_ARG_CHAIN (callop));
5880
5881 /* First build up the conversion op. */
5882
5883 rettype = build_pointer_type (stattype);
b77068f2 5884 name = mangle_conv_op_name_for_type (rettype);
c6be04ad
JM
5885 thistype = cp_build_qualified_type (type, TYPE_QUAL_CONST);
5886 fntype = build_method_type_directly (thistype, rettype, void_list_node);
5887 fn = convfn = build_lang_decl (FUNCTION_DECL, name, fntype);
b77068f2
JM
5888 DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop);
5889
5890 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
5891 && DECL_ALIGN (fn) < 2 * BITS_PER_UNIT)
5892 DECL_ALIGN (fn) = 2 * BITS_PER_UNIT;
5893
5894 SET_OVERLOADED_OPERATOR_CODE (fn, TYPE_EXPR);
5895 grokclassfn (type, fn, NO_SPECIAL);
5896 set_linkage_according_to_type (type, fn);
5897 rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof);
5898 DECL_IN_AGGR_P (fn) = 1;
5899 DECL_ARTIFICIAL (fn) = 1;
5900 DECL_NOT_REALLY_EXTERN (fn) = 1;
5901 DECL_DECLARED_INLINE_P (fn) = 1;
c6be04ad
JM
5902 DECL_ARGUMENTS (fn) = build_this_parm (fntype, TYPE_QUAL_CONST);
5903 if (nested)
5904 DECL_INTERFACE_KNOWN (fn) = 1;
5905
5906 add_method (type, fn, NULL_TREE);
5907
5908 /* Generic thunk code fails for varargs; we'll complain in mark_used if
5909 the conversion op is used. */
5910 if (varargs_function_p (callop))
5911 {
5912 DECL_DELETED_FN (fn) = 1;
5913 return;
5914 }
5915
5916 /* Now build up the thunk to be returned. */
5917
5918 name = get_identifier ("_FUN");
5919 fn = statfn = build_lang_decl (FUNCTION_DECL, name, stattype);
5920 DECL_SOURCE_LOCATION (fn) = DECL_SOURCE_LOCATION (callop);
5921 if (TARGET_PTRMEMFUNC_VBIT_LOCATION == ptrmemfunc_vbit_in_pfn
5922 && DECL_ALIGN (fn) < 2 * BITS_PER_UNIT)
5923 DECL_ALIGN (fn) = 2 * BITS_PER_UNIT;
5924 grokclassfn (type, fn, NO_SPECIAL);
5925 set_linkage_according_to_type (type, fn);
5926 rest_of_decl_compilation (fn, toplevel_bindings_p (), at_eof);
5927 DECL_IN_AGGR_P (fn) = 1;
5928 DECL_ARTIFICIAL (fn) = 1;
5929 DECL_NOT_REALLY_EXTERN (fn) = 1;
5930 DECL_DECLARED_INLINE_P (fn) = 1;
b77068f2 5931 DECL_STATIC_FUNCTION_P (fn) = 1;
c6be04ad
JM
5932 DECL_ARGUMENTS (fn) = copy_list (TREE_CHAIN (DECL_ARGUMENTS (callop)));
5933 for (arg = DECL_ARGUMENTS (fn); arg; arg = TREE_CHAIN (arg))
5934 DECL_CONTEXT (arg) = fn;
7a79ff3b
JM
5935 if (nested)
5936 DECL_INTERFACE_KNOWN (fn) = 1;
b77068f2
JM
5937
5938 add_method (type, fn, NULL_TREE);
5939
5940 if (nested)
5941 push_function_context ();
c6be04ad
JM
5942
5943 /* Generate the body of the thunk. */
5944
5945 start_preparsed_function (statfn, NULL_TREE,
5946 SF_PRE_PARSED | SF_INCLASS_INLINE);
5947 if (DECL_ONE_ONLY (statfn))
5948 {
5949 /* Put the thunk in the same comdat group as the call op. */
5950 struct cgraph_node *callop_node, *thunk_node;
5951 DECL_COMDAT_GROUP (statfn) = DECL_COMDAT_GROUP (callop);
5952 callop_node = cgraph_node (callop);
5953 thunk_node = cgraph_node (statfn);
5954 gcc_assert (callop_node->same_comdat_group == NULL);
5955 gcc_assert (thunk_node->same_comdat_group == NULL);
5956 callop_node->same_comdat_group = thunk_node;
5957 thunk_node->same_comdat_group = callop_node;
5958 }
5959 body = begin_function_body ();
5960 compound_stmt = begin_compound_stmt (0);
5961
9542943d
JM
5962 arg = build1 (NOP_EXPR, TREE_TYPE (DECL_ARGUMENTS (callop)),
5963 null_pointer_node);
c6be04ad
JM
5964 argvec = make_tree_vector ();
5965 VEC_quick_push (tree, argvec, arg);
5966 for (arg = DECL_ARGUMENTS (statfn); arg; arg = TREE_CHAIN (arg))
5967 VEC_safe_push (tree, gc, argvec, arg);
e62e4922
JM
5968 call = build_call_a (callop, VEC_length (tree, argvec),
5969 VEC_address (tree, argvec));
c6be04ad 5970 CALL_FROM_THUNK_P (call) = 1;
e62e4922
JM
5971 if (MAYBE_CLASS_TYPE_P (TREE_TYPE (call)))
5972 call = build_cplus_new (TREE_TYPE (call), call);
5973 call = convert_from_reference (call);
c6be04ad
JM
5974 finish_return_stmt (call);
5975
5976 finish_compound_stmt (compound_stmt);
5977 finish_function_body (body);
5978
5979 expand_or_defer_fn (finish_function (2));
5980
5981 /* Generate the body of the conversion op. */
5982
5983 start_preparsed_function (convfn, NULL_TREE,
b77068f2
JM
5984 SF_PRE_PARSED | SF_INCLASS_INLINE);
5985 body = begin_function_body ();
5986 compound_stmt = begin_compound_stmt (0);
5987
c6be04ad 5988 finish_return_stmt (decay_conversion (statfn));
b77068f2
JM
5989
5990 finish_compound_stmt (compound_stmt);
5991 finish_function_body (body);
5992
5993 expand_or_defer_fn (finish_function (2));
c6be04ad 5994
b77068f2
JM
5995 if (nested)
5996 pop_function_context ();
5997}
cf22909c 5998#include "gt-cp-semantics.h"