PR c++/72766 - ICE with VLA
[platform/upstream/gcc.git] / gcc / cp / cp-gimplify.c
1 /* C++-specific tree lowering bits; see also c-gimplify.c and tree-gimple.c.
2
3    Copyright (C) 2002-2016 Free Software Foundation, Inc.
4    Contributed by Jason Merrill <jason@redhat.com>
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3.  If not see
20 <http://www.gnu.org/licenses/>.  */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "target.h"
26 #include "basic-block.h"
27 #include "cp-tree.h"
28 #include "gimple.h"
29 #include "predict.h"
30 #include "stor-layout.h"
31 #include "tree-iterator.h"
32 #include "gimplify.h"
33 #include "c-family/c-ubsan.h"
34 #include "cilk.h"
35 #include "cp-cilkplus.h"
36
37 /* Forward declarations.  */
38
39 static tree cp_genericize_r (tree *, int *, void *);
40 static tree cp_fold_r (tree *, int *, void *);
41 static void cp_genericize_tree (tree*);
42 static tree cp_fold (tree);
43
44 /* Local declarations.  */
45
46 enum bc_t { bc_break = 0, bc_continue = 1 };
47
48 /* Stack of labels which are targets for "break" or "continue",
49    linked through TREE_CHAIN.  */
50 static tree bc_label[2];
51
52 /* Begin a scope which can be exited by a break or continue statement.  BC
53    indicates which.
54
55    Just creates a label with location LOCATION and pushes it into the current
56    context.  */
57
58 static tree
59 begin_bc_block (enum bc_t bc, location_t location)
60 {
61   tree label = create_artificial_label (location);
62   DECL_CHAIN (label) = bc_label[bc];
63   bc_label[bc] = label;
64   if (bc == bc_break)
65     LABEL_DECL_BREAK (label) = true;
66   else
67     LABEL_DECL_CONTINUE (label) = true;
68   return label;
69 }
70
71 /* Finish a scope which can be exited by a break or continue statement.
72    LABEL was returned from the most recent call to begin_bc_block.  BLOCK is
73    an expression for the contents of the scope.
74
75    If we saw a break (or continue) in the scope, append a LABEL_EXPR to
76    BLOCK.  Otherwise, just forget the label.  */
77
78 static void
79 finish_bc_block (tree *block, enum bc_t bc, tree label)
80 {
81   gcc_assert (label == bc_label[bc]);
82
83   if (TREE_USED (label))
84     append_to_statement_list (build1 (LABEL_EXPR, void_type_node, label),
85                               block);
86
87   bc_label[bc] = DECL_CHAIN (label);
88   DECL_CHAIN (label) = NULL_TREE;
89 }
90
91 /* This function is a wrapper for cilk_gimplify_call_params_in_spawned_fn.
92    *EXPR_P can be a CALL_EXPR, INIT_EXPR, MODIFY_EXPR, AGGR_INIT_EXPR or
93    TARGET_EXPR.  *PRE_P and *POST_P are gimple sequences from the caller
94    of gimplify_cilk_spawn.  */
95
96 static void
97 cilk_cp_gimplify_call_params_in_spawned_fn (tree *expr_p, gimple_seq *pre_p,
98                                             gimple_seq *post_p)
99 {
100   int ii = 0;
101
102   cilk_gimplify_call_params_in_spawned_fn (expr_p, pre_p);
103   if (TREE_CODE (*expr_p) == AGGR_INIT_EXPR)
104     for (ii = 0; ii < aggr_init_expr_nargs (*expr_p); ii++)
105       gimplify_expr (&AGGR_INIT_EXPR_ARG (*expr_p, ii), pre_p, post_p,
106                      is_gimple_reg, fb_rvalue);
107 }
108
109
110 /* Get the LABEL_EXPR to represent a break or continue statement
111    in the current block scope.  BC indicates which.  */
112
113 static tree
114 get_bc_label (enum bc_t bc)
115 {
116   tree label = bc_label[bc];
117
118   /* Mark the label used for finish_bc_block.  */
119   TREE_USED (label) = 1;
120   return label;
121 }
122
123 /* Genericize a TRY_BLOCK.  */
124
125 static void
126 genericize_try_block (tree *stmt_p)
127 {
128   tree body = TRY_STMTS (*stmt_p);
129   tree cleanup = TRY_HANDLERS (*stmt_p);
130
131   *stmt_p = build2 (TRY_CATCH_EXPR, void_type_node, body, cleanup);
132 }
133
134 /* Genericize a HANDLER by converting to a CATCH_EXPR.  */
135
136 static void
137 genericize_catch_block (tree *stmt_p)
138 {
139   tree type = HANDLER_TYPE (*stmt_p);
140   tree body = HANDLER_BODY (*stmt_p);
141
142   /* FIXME should the caught type go in TREE_TYPE?  */
143   *stmt_p = build2 (CATCH_EXPR, void_type_node, type, body);
144 }
145
146 /* A terser interface for building a representation of an exception
147    specification.  */
148
149 static tree
150 build_gimple_eh_filter_tree (tree body, tree allowed, tree failure)
151 {
152   tree t;
153
154   /* FIXME should the allowed types go in TREE_TYPE?  */
155   t = build2 (EH_FILTER_EXPR, void_type_node, allowed, NULL_TREE);
156   append_to_statement_list (failure, &EH_FILTER_FAILURE (t));
157
158   t = build2 (TRY_CATCH_EXPR, void_type_node, NULL_TREE, t);
159   append_to_statement_list (body, &TREE_OPERAND (t, 0));
160
161   return t;
162 }
163
164 /* Genericize an EH_SPEC_BLOCK by converting it to a
165    TRY_CATCH_EXPR/EH_FILTER_EXPR pair.  */
166
167 static void
168 genericize_eh_spec_block (tree *stmt_p)
169 {
170   tree body = EH_SPEC_STMTS (*stmt_p);
171   tree allowed = EH_SPEC_RAISES (*stmt_p);
172   tree failure = build_call_n (call_unexpected_node, 1, build_exc_ptr ());
173
174   *stmt_p = build_gimple_eh_filter_tree (body, allowed, failure);
175   TREE_NO_WARNING (*stmt_p) = true;
176   TREE_NO_WARNING (TREE_OPERAND (*stmt_p, 1)) = true;
177 }
178
179 /* Genericize an IF_STMT by turning it into a COND_EXPR.  */
180
181 static void
182 genericize_if_stmt (tree *stmt_p)
183 {
184   tree stmt, cond, then_, else_;
185   location_t locus = EXPR_LOCATION (*stmt_p);
186
187   stmt = *stmt_p;
188   cond = IF_COND (stmt);
189   then_ = THEN_CLAUSE (stmt);
190   else_ = ELSE_CLAUSE (stmt);
191
192   if (!then_)
193     then_ = build_empty_stmt (locus);
194   if (!else_)
195     else_ = build_empty_stmt (locus);
196
197   if (integer_nonzerop (cond) && !TREE_SIDE_EFFECTS (else_))
198     stmt = then_;
199   else if (integer_zerop (cond) && !TREE_SIDE_EFFECTS (then_))
200     stmt = else_;
201   else
202     stmt = build3 (COND_EXPR, void_type_node, cond, then_, else_);
203   if (!EXPR_HAS_LOCATION (stmt))
204     protected_set_expr_location (stmt, locus);
205   *stmt_p = stmt;
206 }
207
208 /* Build a generic representation of one of the C loop forms.  COND is the
209    loop condition or NULL_TREE.  BODY is the (possibly compound) statement
210    controlled by the loop.  INCR is the increment expression of a for-loop,
211    or NULL_TREE.  COND_IS_FIRST indicates whether the condition is
212    evaluated before the loop body as in while and for loops, or after the
213    loop body as in do-while loops.  */
214
215 static void
216 genericize_cp_loop (tree *stmt_p, location_t start_locus, tree cond, tree body,
217                     tree incr, bool cond_is_first, int *walk_subtrees,
218                     void *data)
219 {
220   tree blab, clab;
221   tree exit = NULL;
222   tree stmt_list = NULL;
223
224   blab = begin_bc_block (bc_break, start_locus);
225   clab = begin_bc_block (bc_continue, start_locus);
226
227   protected_set_expr_location (incr, start_locus);
228
229   cp_walk_tree (&cond, cp_genericize_r, data, NULL);
230   cp_walk_tree (&body, cp_genericize_r, data, NULL);
231   cp_walk_tree (&incr, cp_genericize_r, data, NULL);
232   *walk_subtrees = 0;
233
234   if (cond && TREE_CODE (cond) != INTEGER_CST)
235     {
236       /* If COND is constant, don't bother building an exit.  If it's false,
237          we won't build a loop.  If it's true, any exits are in the body.  */
238       location_t cloc = EXPR_LOC_OR_LOC (cond, start_locus);
239       exit = build1_loc (cloc, GOTO_EXPR, void_type_node,
240                          get_bc_label (bc_break));
241       exit = fold_build3_loc (cloc, COND_EXPR, void_type_node, cond,
242                               build_empty_stmt (cloc), exit);
243     }
244
245   if (exit && cond_is_first)
246     append_to_statement_list (exit, &stmt_list);
247   append_to_statement_list (body, &stmt_list);
248   finish_bc_block (&stmt_list, bc_continue, clab);
249   append_to_statement_list (incr, &stmt_list);
250   if (exit && !cond_is_first)
251     append_to_statement_list (exit, &stmt_list);
252
253   if (!stmt_list)
254     stmt_list = build_empty_stmt (start_locus);
255
256   tree loop;
257   if (cond && integer_zerop (cond))
258     {
259       if (cond_is_first)
260         loop = fold_build3_loc (start_locus, COND_EXPR,
261                                 void_type_node, cond, stmt_list,
262                                 build_empty_stmt (start_locus));
263       else
264         loop = stmt_list;
265     }
266   else
267     {
268       location_t loc = start_locus;
269       if (!cond || integer_nonzerop (cond))
270         loc = EXPR_LOCATION (expr_first (body));
271       if (loc == UNKNOWN_LOCATION)
272         loc = start_locus;
273       loop = build1_loc (loc, LOOP_EXPR, void_type_node, stmt_list);
274     }
275
276   stmt_list = NULL;
277   append_to_statement_list (loop, &stmt_list);
278   finish_bc_block (&stmt_list, bc_break, blab);
279   if (!stmt_list)
280     stmt_list = build_empty_stmt (start_locus);
281
282   *stmt_p = stmt_list;
283 }
284
285 /* Genericize a FOR_STMT node *STMT_P.  */
286
287 static void
288 genericize_for_stmt (tree *stmt_p, int *walk_subtrees, void *data)
289 {
290   tree stmt = *stmt_p;
291   tree expr = NULL;
292   tree loop;
293   tree init = FOR_INIT_STMT (stmt);
294
295   if (init)
296     {
297       cp_walk_tree (&init, cp_genericize_r, data, NULL);
298       append_to_statement_list (init, &expr);
299     }
300
301   genericize_cp_loop (&loop, EXPR_LOCATION (stmt), FOR_COND (stmt),
302                       FOR_BODY (stmt), FOR_EXPR (stmt), 1, walk_subtrees, data);
303   append_to_statement_list (loop, &expr);
304   if (expr == NULL_TREE)
305     expr = loop;
306   *stmt_p = expr;
307 }
308
309 /* Genericize a WHILE_STMT node *STMT_P.  */
310
311 static void
312 genericize_while_stmt (tree *stmt_p, int *walk_subtrees, void *data)
313 {
314   tree stmt = *stmt_p;
315   genericize_cp_loop (stmt_p, EXPR_LOCATION (stmt), WHILE_COND (stmt),
316                       WHILE_BODY (stmt), NULL_TREE, 1, walk_subtrees, data);
317 }
318
319 /* Genericize a DO_STMT node *STMT_P.  */
320
321 static void
322 genericize_do_stmt (tree *stmt_p, int *walk_subtrees, void *data)
323 {
324   tree stmt = *stmt_p;
325   genericize_cp_loop (stmt_p, EXPR_LOCATION (stmt), DO_COND (stmt),
326                       DO_BODY (stmt), NULL_TREE, 0, walk_subtrees, data);
327 }
328
329 /* Genericize a SWITCH_STMT node *STMT_P by turning it into a SWITCH_EXPR.  */
330
331 static void
332 genericize_switch_stmt (tree *stmt_p, int *walk_subtrees, void *data)
333 {
334   tree stmt = *stmt_p;
335   tree break_block, body, cond, type;
336   location_t stmt_locus = EXPR_LOCATION (stmt);
337
338   break_block = begin_bc_block (bc_break, stmt_locus);
339
340   body = SWITCH_STMT_BODY (stmt);
341   if (!body)
342     body = build_empty_stmt (stmt_locus);
343   cond = SWITCH_STMT_COND (stmt);
344   type = SWITCH_STMT_TYPE (stmt);
345
346   cp_walk_tree (&body, cp_genericize_r, data, NULL);
347   cp_walk_tree (&cond, cp_genericize_r, data, NULL);
348   cp_walk_tree (&type, cp_genericize_r, data, NULL);
349   *walk_subtrees = 0;
350
351   *stmt_p = build3_loc (stmt_locus, SWITCH_EXPR, type, cond, body, NULL_TREE);
352   finish_bc_block (stmt_p, bc_break, break_block);
353 }
354
355 /* Genericize a CONTINUE_STMT node *STMT_P.  */
356
357 static void
358 genericize_continue_stmt (tree *stmt_p)
359 {
360   tree stmt_list = NULL;
361   tree pred = build_predict_expr (PRED_CONTINUE, NOT_TAKEN);
362   tree label = get_bc_label (bc_continue);
363   location_t location = EXPR_LOCATION (*stmt_p);
364   tree jump = build1_loc (location, GOTO_EXPR, void_type_node, label);
365   append_to_statement_list_force (pred, &stmt_list);
366   append_to_statement_list (jump, &stmt_list);
367   *stmt_p = stmt_list;
368 }
369
370 /* Genericize a BREAK_STMT node *STMT_P.  */
371
372 static void
373 genericize_break_stmt (tree *stmt_p)
374 {
375   tree label = get_bc_label (bc_break);
376   location_t location = EXPR_LOCATION (*stmt_p);
377   *stmt_p = build1_loc (location, GOTO_EXPR, void_type_node, label);
378 }
379
380 /* Genericize a OMP_FOR node *STMT_P.  */
381
382 static void
383 genericize_omp_for_stmt (tree *stmt_p, int *walk_subtrees, void *data)
384 {
385   tree stmt = *stmt_p;
386   location_t locus = EXPR_LOCATION (stmt);
387   tree clab = begin_bc_block (bc_continue, locus);
388
389   cp_walk_tree (&OMP_FOR_BODY (stmt), cp_genericize_r, data, NULL);
390   if (TREE_CODE (stmt) != OMP_TASKLOOP)
391     cp_walk_tree (&OMP_FOR_CLAUSES (stmt), cp_genericize_r, data, NULL);
392   cp_walk_tree (&OMP_FOR_INIT (stmt), cp_genericize_r, data, NULL);
393   cp_walk_tree (&OMP_FOR_COND (stmt), cp_genericize_r, data, NULL);
394   cp_walk_tree (&OMP_FOR_INCR (stmt), cp_genericize_r, data, NULL);
395   cp_walk_tree (&OMP_FOR_PRE_BODY (stmt), cp_genericize_r, data, NULL);
396   *walk_subtrees = 0;
397
398   finish_bc_block (&OMP_FOR_BODY (stmt), bc_continue, clab);
399 }
400
401 /* Hook into the middle of gimplifying an OMP_FOR node.  */
402
403 static enum gimplify_status
404 cp_gimplify_omp_for (tree *expr_p, gimple_seq *pre_p)
405 {
406   tree for_stmt = *expr_p;
407   gimple_seq seq = NULL;
408
409   /* Protect ourselves from recursion.  */
410   if (OMP_FOR_GIMPLIFYING_P (for_stmt))
411     return GS_UNHANDLED;
412   OMP_FOR_GIMPLIFYING_P (for_stmt) = 1;
413
414   gimplify_and_add (for_stmt, &seq);
415   gimple_seq_add_seq (pre_p, seq);
416
417   OMP_FOR_GIMPLIFYING_P (for_stmt) = 0;
418
419   return GS_ALL_DONE;
420 }
421
422 /*  Gimplify an EXPR_STMT node.  */
423
424 static void
425 gimplify_expr_stmt (tree *stmt_p)
426 {
427   tree stmt = EXPR_STMT_EXPR (*stmt_p);
428
429   if (stmt == error_mark_node)
430     stmt = NULL;
431
432   /* Gimplification of a statement expression will nullify the
433      statement if all its side effects are moved to *PRE_P and *POST_P.
434
435      In this case we will not want to emit the gimplified statement.
436      However, we may still want to emit a warning, so we do that before
437      gimplification.  */
438   if (stmt && warn_unused_value)
439     {
440       if (!TREE_SIDE_EFFECTS (stmt))
441         {
442           if (!IS_EMPTY_STMT (stmt)
443               && !VOID_TYPE_P (TREE_TYPE (stmt))
444               && !TREE_NO_WARNING (stmt))
445             warning (OPT_Wunused_value, "statement with no effect");
446         }
447       else
448         warn_if_unused_value (stmt, input_location);
449     }
450
451   if (stmt == NULL_TREE)
452     stmt = alloc_stmt_list ();
453
454   *stmt_p = stmt;
455 }
456
457 /* Gimplify initialization from an AGGR_INIT_EXPR.  */
458
459 static void
460 cp_gimplify_init_expr (tree *expr_p)
461 {
462   tree from = TREE_OPERAND (*expr_p, 1);
463   tree to = TREE_OPERAND (*expr_p, 0);
464   tree t;
465
466   /* What about code that pulls out the temp and uses it elsewhere?  I
467      think that such code never uses the TARGET_EXPR as an initializer.  If
468      I'm wrong, we'll abort because the temp won't have any RTL.  In that
469      case, I guess we'll need to replace references somehow.  */
470   if (TREE_CODE (from) == TARGET_EXPR)
471     from = TARGET_EXPR_INITIAL (from);
472
473   /* Look through any COMPOUND_EXPRs, since build_compound_expr pushes them
474      inside the TARGET_EXPR.  */
475   for (t = from; t; )
476     {
477       tree sub = TREE_CODE (t) == COMPOUND_EXPR ? TREE_OPERAND (t, 0) : t;
478
479       /* If we are initializing from an AGGR_INIT_EXPR, drop the INIT_EXPR and
480          replace the slot operand with our target.
481
482          Should we add a target parm to gimplify_expr instead?  No, as in this
483          case we want to replace the INIT_EXPR.  */
484       if (TREE_CODE (sub) == AGGR_INIT_EXPR
485           || TREE_CODE (sub) == VEC_INIT_EXPR)
486         {
487           if (TREE_CODE (sub) == AGGR_INIT_EXPR)
488             AGGR_INIT_EXPR_SLOT (sub) = to;
489           else
490             VEC_INIT_EXPR_SLOT (sub) = to;
491           *expr_p = from;
492
493           /* The initialization is now a side-effect, so the container can
494              become void.  */
495           if (from != sub)
496             TREE_TYPE (from) = void_type_node;
497         }
498
499       if (cxx_dialect >= cxx14 && TREE_CODE (sub) == CONSTRUCTOR)
500         /* Handle aggregate NSDMI.  */
501         replace_placeholders (sub, to);
502
503       if (t == sub)
504         break;
505       else
506         t = TREE_OPERAND (t, 1);
507     }
508
509 }
510
511 /* Gimplify a MUST_NOT_THROW_EXPR.  */
512
513 static enum gimplify_status
514 gimplify_must_not_throw_expr (tree *expr_p, gimple_seq *pre_p)
515 {
516   tree stmt = *expr_p;
517   tree temp = voidify_wrapper_expr (stmt, NULL);
518   tree body = TREE_OPERAND (stmt, 0);
519   gimple_seq try_ = NULL;
520   gimple_seq catch_ = NULL;
521   gimple *mnt;
522
523   gimplify_and_add (body, &try_);
524   mnt = gimple_build_eh_must_not_throw (terminate_node);
525   gimple_seq_add_stmt_without_update (&catch_, mnt);
526   mnt = gimple_build_try (try_, catch_, GIMPLE_TRY_CATCH);
527
528   gimple_seq_add_stmt_without_update (pre_p, mnt);
529   if (temp)
530     {
531       *expr_p = temp;
532       return GS_OK;
533     }
534
535   *expr_p = NULL;
536   return GS_ALL_DONE;
537 }
538
539 /* Return TRUE if an operand (OP) of a given TYPE being copied is
540    really just an empty class copy.
541
542    Check that the operand has a simple form so that TARGET_EXPRs and
543    non-empty CONSTRUCTORs get reduced properly, and we leave the
544    return slot optimization alone because it isn't a copy.  */
545
546 static bool
547 simple_empty_class_p (tree type, tree op)
548 {
549   return
550     ((TREE_CODE (op) == COMPOUND_EXPR
551       && simple_empty_class_p (type, TREE_OPERAND (op, 1)))
552      || is_gimple_lvalue (op)
553      || INDIRECT_REF_P (op)
554      || (TREE_CODE (op) == CONSTRUCTOR
555          && CONSTRUCTOR_NELTS (op) == 0
556          && !TREE_CLOBBER_P (op))
557      || (TREE_CODE (op) == CALL_EXPR
558          && !CALL_EXPR_RETURN_SLOT_OPT (op)))
559     && is_really_empty_class (type);
560 }
561
562 /* Returns true if evaluating E as an lvalue has side-effects;
563    specifically, a volatile lvalue has TREE_SIDE_EFFECTS, but it doesn't really
564    have side-effects until there is a read or write through it.  */
565
566 static bool
567 lvalue_has_side_effects (tree e)
568 {
569   if (!TREE_SIDE_EFFECTS (e))
570     return false;
571   while (handled_component_p (e))
572     {
573       if (TREE_CODE (e) == ARRAY_REF
574           && TREE_SIDE_EFFECTS (TREE_OPERAND (e, 1)))
575         return true;
576       e = TREE_OPERAND (e, 0);
577     }
578   if (DECL_P (e))
579     /* Just naming a variable has no side-effects.  */
580     return false;
581   else if (INDIRECT_REF_P (e))
582     /* Similarly, indirection has no side-effects.  */
583     return TREE_SIDE_EFFECTS (TREE_OPERAND (e, 0));
584   else
585     /* For anything else, trust TREE_SIDE_EFFECTS.  */
586     return TREE_SIDE_EFFECTS (e);
587 }
588
589 /* Do C++-specific gimplification.  Args are as for gimplify_expr.  */
590
591 int
592 cp_gimplify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p)
593 {
594   int saved_stmts_are_full_exprs_p = 0;
595   location_t loc = EXPR_LOC_OR_LOC (*expr_p, input_location);
596   enum tree_code code = TREE_CODE (*expr_p);
597   enum gimplify_status ret;
598
599   if (STATEMENT_CODE_P (code))
600     {
601       saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();
602       current_stmt_tree ()->stmts_are_full_exprs_p
603         = STMT_IS_FULL_EXPR_P (*expr_p);
604     }
605
606   switch (code)
607     {
608     case AGGR_INIT_EXPR:
609       simplify_aggr_init_expr (expr_p);
610       ret = GS_OK;
611       break;
612
613     case VEC_INIT_EXPR:
614       {
615         location_t loc = input_location;
616         tree init = VEC_INIT_EXPR_INIT (*expr_p);
617         int from_array = (init && TREE_CODE (TREE_TYPE (init)) == ARRAY_TYPE);
618         gcc_assert (EXPR_HAS_LOCATION (*expr_p));
619         input_location = EXPR_LOCATION (*expr_p);
620         *expr_p = build_vec_init (VEC_INIT_EXPR_SLOT (*expr_p), NULL_TREE,
621                                   init, VEC_INIT_EXPR_VALUE_INIT (*expr_p),
622                                   from_array,
623                                   tf_warning_or_error);
624         hash_set<tree> pset;
625         cp_walk_tree (expr_p, cp_fold_r, &pset, NULL);
626         cp_genericize_tree (expr_p);
627         ret = GS_OK;
628         input_location = loc;
629       }
630       break;
631
632     case THROW_EXPR:
633       /* FIXME communicate throw type to back end, probably by moving
634          THROW_EXPR into ../tree.def.  */
635       *expr_p = TREE_OPERAND (*expr_p, 0);
636       ret = GS_OK;
637       break;
638
639     case MUST_NOT_THROW_EXPR:
640       ret = gimplify_must_not_throw_expr (expr_p, pre_p);
641       break;
642
643       /* We used to do this for MODIFY_EXPR as well, but that's unsafe; the
644          LHS of an assignment might also be involved in the RHS, as in bug
645          25979.  */
646     case INIT_EXPR:
647       if (fn_contains_cilk_spawn_p (cfun))
648         {
649           if (cilk_cp_detect_spawn_and_unwrap (expr_p))
650             {
651               cilk_cp_gimplify_call_params_in_spawned_fn (expr_p,
652                                                           pre_p, post_p);
653               return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
654             }
655           if (seen_error () && contains_cilk_spawn_stmt (*expr_p))
656             return GS_ERROR;
657         }
658
659       cp_gimplify_init_expr (expr_p);
660       if (TREE_CODE (*expr_p) != INIT_EXPR)
661         return GS_OK;
662       /* Otherwise fall through.  */
663     case MODIFY_EXPR:
664     modify_expr_case:
665       {
666         if (fn_contains_cilk_spawn_p (cfun)
667             && cilk_cp_detect_spawn_and_unwrap (expr_p)
668             && !seen_error ())
669           {
670             cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
671             return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
672           }
673         /* If the back end isn't clever enough to know that the lhs and rhs
674            types are the same, add an explicit conversion.  */
675         tree op0 = TREE_OPERAND (*expr_p, 0);
676         tree op1 = TREE_OPERAND (*expr_p, 1);
677
678         if (!error_operand_p (op0)
679             && !error_operand_p (op1)
680             && (TYPE_STRUCTURAL_EQUALITY_P (TREE_TYPE (op0))
681                 || TYPE_STRUCTURAL_EQUALITY_P (TREE_TYPE (op1)))
682             && !useless_type_conversion_p (TREE_TYPE (op1), TREE_TYPE (op0)))
683           TREE_OPERAND (*expr_p, 1) = build1 (VIEW_CONVERT_EXPR,
684                                               TREE_TYPE (op0), op1);
685
686         else if (simple_empty_class_p (TREE_TYPE (op0), op1))
687           {
688             /* Remove any copies of empty classes.  Also drop volatile
689                variables on the RHS to avoid infinite recursion from
690                gimplify_expr trying to load the value.  */
691             if (TREE_SIDE_EFFECTS (op1))
692               {
693                 if (TREE_THIS_VOLATILE (op1)
694                     && (REFERENCE_CLASS_P (op1) || DECL_P (op1)))
695                   op1 = build_fold_addr_expr (op1);
696
697                 gimplify_and_add (op1, pre_p);
698               }
699             gimplify_expr (&TREE_OPERAND (*expr_p, 0), pre_p, post_p,
700                            is_gimple_lvalue, fb_lvalue);
701             *expr_p = TREE_OPERAND (*expr_p, 0);
702           }
703         /* P0145 says that the RHS is sequenced before the LHS.
704            gimplify_modify_expr gimplifies the RHS before the LHS, but that
705            isn't quite strong enough in two cases:
706
707            1) gimplify.c wants to leave a CALL_EXPR on the RHS, which would
708            mean it's evaluated after the LHS.
709
710            2) the value calculation of the RHS is also sequenced before the
711            LHS, so for scalar assignment we need to preevaluate if the
712            RHS could be affected by LHS side-effects even if it has no
713            side-effects of its own.  We don't need this for classes because
714            class assignment takes its RHS by reference.  */
715        else if (flag_strong_eval_order > 1
716                 && TREE_CODE (*expr_p) == MODIFY_EXPR
717                 && lvalue_has_side_effects (op0)
718                 && (TREE_CODE (op1) == CALL_EXPR
719                     || (SCALAR_TYPE_P (TREE_TYPE (op1))
720                         && !TREE_CONSTANT (op1))))
721          TREE_OPERAND (*expr_p, 1) = get_formal_tmp_var (op1, pre_p);
722       }
723       ret = GS_OK;
724       break;
725
726     case EMPTY_CLASS_EXPR:
727       /* We create an empty CONSTRUCTOR with RECORD_TYPE.  */
728       *expr_p = build_constructor (TREE_TYPE (*expr_p), NULL);
729       ret = GS_OK;
730       break;
731
732     case BASELINK:
733       *expr_p = BASELINK_FUNCTIONS (*expr_p);
734       ret = GS_OK;
735       break;
736
737     case TRY_BLOCK:
738       genericize_try_block (expr_p);
739       ret = GS_OK;
740       break;
741
742     case HANDLER:
743       genericize_catch_block (expr_p);
744       ret = GS_OK;
745       break;
746
747     case EH_SPEC_BLOCK:
748       genericize_eh_spec_block (expr_p);
749       ret = GS_OK;
750       break;
751
752     case USING_STMT:
753       gcc_unreachable ();
754
755     case FOR_STMT:
756     case WHILE_STMT:
757     case DO_STMT:
758     case SWITCH_STMT:
759     case CONTINUE_STMT:
760     case BREAK_STMT:
761       gcc_unreachable ();
762
763     case OMP_FOR:
764     case OMP_SIMD:
765     case OMP_DISTRIBUTE:
766     case OMP_TASKLOOP:
767       ret = cp_gimplify_omp_for (expr_p, pre_p);
768       break;
769
770     case EXPR_STMT:
771       gimplify_expr_stmt (expr_p);
772       ret = GS_OK;
773       break;
774
775     case UNARY_PLUS_EXPR:
776       {
777         tree arg = TREE_OPERAND (*expr_p, 0);
778         tree type = TREE_TYPE (*expr_p);
779         *expr_p = (TREE_TYPE (arg) != type) ? fold_convert (type, arg)
780                                             : arg;
781         ret = GS_OK;
782       }
783       break;
784
785     case CILK_SPAWN_STMT:
786       gcc_assert(fn_contains_cilk_spawn_p (cfun)
787                  && cilk_cp_detect_spawn_and_unwrap (expr_p));
788
789       if (!seen_error ())
790         {
791           cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
792           return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
793         }
794       return GS_ERROR;
795
796     case CALL_EXPR:
797       if (fn_contains_cilk_spawn_p (cfun)
798           && cilk_cp_detect_spawn_and_unwrap (expr_p)
799           && !seen_error ())
800         {
801           cilk_cp_gimplify_call_params_in_spawned_fn (expr_p, pre_p, post_p);
802           return (enum gimplify_status) gimplify_cilk_spawn (expr_p);
803         }
804       ret = GS_OK;
805       if (!CALL_EXPR_FN (*expr_p))
806         /* Internal function call.  */;
807       else if (CALL_EXPR_REVERSE_ARGS (*expr_p))
808         {
809           /* This is a call to a (compound) assignment operator that used
810              the operator syntax; gimplify the RHS first.  */
811           gcc_assert (call_expr_nargs (*expr_p) == 2);
812           gcc_assert (!CALL_EXPR_ORDERED_ARGS (*expr_p));
813           enum gimplify_status t
814             = gimplify_arg (&CALL_EXPR_ARG (*expr_p, 1), pre_p, loc);
815           if (t == GS_ERROR)
816             ret = GS_ERROR;
817         }
818       else if (CALL_EXPR_ORDERED_ARGS (*expr_p))
819         {
820           /* Leave the last argument for gimplify_call_expr, to avoid problems
821              with __builtin_va_arg_pack().  */
822           int nargs = call_expr_nargs (*expr_p) - 1;
823           for (int i = 0; i < nargs; ++i)
824             {
825               enum gimplify_status t
826                 = gimplify_arg (&CALL_EXPR_ARG (*expr_p, i), pre_p, loc);
827               if (t == GS_ERROR)
828                 ret = GS_ERROR;
829             }
830         }
831       else if (flag_strong_eval_order
832                && !CALL_EXPR_OPERATOR_SYNTAX (*expr_p))
833         {
834           /* If flag_strong_eval_order, evaluate the object argument first.  */
835           tree fntype = TREE_TYPE (CALL_EXPR_FN (*expr_p));
836           if (POINTER_TYPE_P (fntype))
837             fntype = TREE_TYPE (fntype);
838           if (TREE_CODE (fntype) == METHOD_TYPE)
839             {
840               enum gimplify_status t
841                 = gimplify_arg (&CALL_EXPR_ARG (*expr_p, 0), pre_p, loc);
842               if (t == GS_ERROR)
843                 ret = GS_ERROR;
844             }
845         }
846       break;
847
848     case RETURN_EXPR:
849       if (TREE_OPERAND (*expr_p, 0)
850           && (TREE_CODE (TREE_OPERAND (*expr_p, 0)) == INIT_EXPR
851               || TREE_CODE (TREE_OPERAND (*expr_p, 0)) == MODIFY_EXPR))
852         {
853           expr_p = &TREE_OPERAND (*expr_p, 0);
854           code = TREE_CODE (*expr_p);
855           /* Avoid going through the INIT_EXPR case, which can
856              degrade INIT_EXPRs into AGGR_INIT_EXPRs.  */
857           goto modify_expr_case;
858         }
859       /* Fall through.  */
860
861     default:
862       ret = (enum gimplify_status) c_gimplify_expr (expr_p, pre_p, post_p);
863       break;
864     }
865
866   /* Restore saved state.  */
867   if (STATEMENT_CODE_P (code))
868     current_stmt_tree ()->stmts_are_full_exprs_p
869       = saved_stmts_are_full_exprs_p;
870
871   return ret;
872 }
873
874 static inline bool
875 is_invisiref_parm (const_tree t)
876 {
877   return ((TREE_CODE (t) == PARM_DECL || TREE_CODE (t) == RESULT_DECL)
878           && DECL_BY_REFERENCE (t));
879 }
880
881 /* Return true if the uid in both int tree maps are equal.  */
882
883 bool
884 cxx_int_tree_map_hasher::equal (cxx_int_tree_map *a, cxx_int_tree_map *b)
885 {
886   return (a->uid == b->uid);
887 }
888
889 /* Hash a UID in a cxx_int_tree_map.  */
890
891 unsigned int
892 cxx_int_tree_map_hasher::hash (cxx_int_tree_map *item)
893 {
894   return item->uid;
895 }
896
897 /* A stable comparison routine for use with splay trees and DECLs.  */
898
899 static int
900 splay_tree_compare_decl_uid (splay_tree_key xa, splay_tree_key xb)
901 {
902   tree a = (tree) xa;
903   tree b = (tree) xb;
904
905   return DECL_UID (a) - DECL_UID (b);
906 }
907
908 /* OpenMP context during genericization.  */
909
910 struct cp_genericize_omp_taskreg
911 {
912   bool is_parallel;
913   bool default_shared;
914   struct cp_genericize_omp_taskreg *outer;
915   splay_tree variables;
916 };
917
918 /* Return true if genericization should try to determine if
919    DECL is firstprivate or shared within task regions.  */
920
921 static bool
922 omp_var_to_track (tree decl)
923 {
924   tree type = TREE_TYPE (decl);
925   if (is_invisiref_parm (decl))
926     type = TREE_TYPE (type);
927   while (TREE_CODE (type) == ARRAY_TYPE)
928     type = TREE_TYPE (type);
929   if (type == error_mark_node || !CLASS_TYPE_P (type))
930     return false;
931   if (VAR_P (decl) && CP_DECL_THREAD_LOCAL_P (decl))
932     return false;
933   if (cxx_omp_predetermined_sharing (decl) != OMP_CLAUSE_DEFAULT_UNSPECIFIED)
934     return false;
935   return true;
936 }
937
938 /* Note DECL use in OpenMP region OMP_CTX during genericization.  */
939
940 static void
941 omp_cxx_notice_variable (struct cp_genericize_omp_taskreg *omp_ctx, tree decl)
942 {
943   splay_tree_node n = splay_tree_lookup (omp_ctx->variables,
944                                          (splay_tree_key) decl);
945   if (n == NULL)
946     {
947       int flags = OMP_CLAUSE_DEFAULT_SHARED;
948       if (omp_ctx->outer)
949         omp_cxx_notice_variable (omp_ctx->outer, decl);
950       if (!omp_ctx->default_shared)
951         {
952           struct cp_genericize_omp_taskreg *octx;
953
954           for (octx = omp_ctx->outer; octx; octx = octx->outer)
955             {
956               n = splay_tree_lookup (octx->variables, (splay_tree_key) decl);
957               if (n && n->value != OMP_CLAUSE_DEFAULT_SHARED)
958                 {
959                   flags = OMP_CLAUSE_DEFAULT_FIRSTPRIVATE;
960                   break;
961                 }
962               if (octx->is_parallel)
963                 break;
964             }
965           if (octx == NULL
966               && (TREE_CODE (decl) == PARM_DECL
967                   || (!(TREE_STATIC (decl) || DECL_EXTERNAL (decl))
968                       && DECL_CONTEXT (decl) == current_function_decl)))
969             flags = OMP_CLAUSE_DEFAULT_FIRSTPRIVATE;
970           if (flags == OMP_CLAUSE_DEFAULT_FIRSTPRIVATE)
971             {
972               /* DECL is implicitly determined firstprivate in
973                  the current task construct.  Ensure copy ctor and
974                  dtor are instantiated, because during gimplification
975                  it will be already too late.  */
976               tree type = TREE_TYPE (decl);
977               if (is_invisiref_parm (decl))
978                 type = TREE_TYPE (type);
979               while (TREE_CODE (type) == ARRAY_TYPE)
980                 type = TREE_TYPE (type);
981               get_copy_ctor (type, tf_none);
982               get_dtor (type, tf_none);
983             }
984         }
985       splay_tree_insert (omp_ctx->variables, (splay_tree_key) decl, flags);
986     }
987 }
988
989 /* Genericization context.  */
990
991 struct cp_genericize_data
992 {
993   hash_set<tree> *p_set;
994   vec<tree> bind_expr_stack;
995   struct cp_genericize_omp_taskreg *omp_ctx;
996   tree try_block;
997   bool no_sanitize_p;
998 };
999
1000 /* Perform any pre-gimplification folding of C++ front end trees to
1001    GENERIC.
1002    Note:  The folding of none-omp cases is something to move into
1003      the middle-end.  As for now we have most foldings only on GENERIC
1004      in fold-const, we need to perform this before transformation to
1005      GIMPLE-form.  */
1006
1007 static tree
1008 cp_fold_r (tree *stmt_p, int *walk_subtrees, void *data)
1009 {
1010   tree stmt;
1011   enum tree_code code;
1012
1013   *stmt_p = stmt = cp_fold (*stmt_p);
1014
1015   if (((hash_set<tree> *) data)->add (stmt))
1016     {
1017       /* Don't walk subtrees of stmts we've already walked once, otherwise
1018          we can have exponential complexity with e.g. lots of nested
1019          SAVE_EXPRs or TARGET_EXPRs.  cp_fold uses a cache and will return
1020          always the same tree, which the first time cp_fold_r has been
1021          called on it had the subtrees walked.  */
1022       *walk_subtrees = 0;
1023       return NULL;
1024     }
1025
1026   code = TREE_CODE (stmt);
1027   if (code == OMP_FOR || code == OMP_SIMD || code == OMP_DISTRIBUTE
1028       || code == OMP_TASKLOOP || code == CILK_FOR || code == CILK_SIMD
1029       || code == OACC_LOOP)
1030     {
1031       tree x;
1032       int i, n;
1033
1034       cp_walk_tree (&OMP_FOR_BODY (stmt), cp_fold_r, data, NULL);
1035       cp_walk_tree (&OMP_FOR_CLAUSES (stmt), cp_fold_r, data, NULL);
1036       cp_walk_tree (&OMP_FOR_INIT (stmt), cp_fold_r, data, NULL);
1037       x = OMP_FOR_COND (stmt);
1038       if (x && TREE_CODE_CLASS (TREE_CODE (x)) == tcc_comparison)
1039         {
1040           cp_walk_tree (&TREE_OPERAND (x, 0), cp_fold_r, data, NULL);
1041           cp_walk_tree (&TREE_OPERAND (x, 1), cp_fold_r, data, NULL);
1042         }
1043       else if (x && TREE_CODE (x) == TREE_VEC)
1044         {
1045           n = TREE_VEC_LENGTH (x);
1046           for (i = 0; i < n; i++)
1047             {
1048               tree o = TREE_VEC_ELT (x, i);
1049               if (o && TREE_CODE_CLASS (TREE_CODE (o)) == tcc_comparison)
1050                 cp_walk_tree (&TREE_OPERAND (o, 1), cp_fold_r, data, NULL);
1051             }
1052         }
1053       x = OMP_FOR_INCR (stmt);
1054       if (x && TREE_CODE (x) == TREE_VEC)
1055         {
1056           n = TREE_VEC_LENGTH (x);
1057           for (i = 0; i < n; i++)
1058             {
1059               tree o = TREE_VEC_ELT (x, i);
1060               if (o && TREE_CODE (o) == MODIFY_EXPR)
1061                 o = TREE_OPERAND (o, 1);
1062               if (o && (TREE_CODE (o) == PLUS_EXPR || TREE_CODE (o) == MINUS_EXPR
1063                         || TREE_CODE (o) == POINTER_PLUS_EXPR))
1064                 {
1065                   cp_walk_tree (&TREE_OPERAND (o, 0), cp_fold_r, data, NULL);
1066                   cp_walk_tree (&TREE_OPERAND (o, 1), cp_fold_r, data, NULL);
1067                 }
1068             }
1069         }
1070       cp_walk_tree (&OMP_FOR_PRE_BODY (stmt), cp_fold_r, data, NULL);
1071       *walk_subtrees = 0;
1072     }
1073
1074   return NULL;
1075 }
1076
1077 /* Fold ALL the trees!  FIXME we should be able to remove this, but
1078    apparently that still causes optimization regressions.  */
1079
1080 void
1081 cp_fold_function (tree fndecl)
1082 {
1083   hash_set<tree> pset;
1084   cp_walk_tree (&DECL_SAVED_TREE (fndecl), cp_fold_r, &pset, NULL);
1085 }
1086
1087 /* Perform any pre-gimplification lowering of C++ front end trees to
1088    GENERIC.  */
1089
1090 static tree
1091 cp_genericize_r (tree *stmt_p, int *walk_subtrees, void *data)
1092 {
1093   tree stmt = *stmt_p;
1094   struct cp_genericize_data *wtd = (struct cp_genericize_data *) data;
1095   hash_set<tree> *p_set = wtd->p_set;
1096
1097   /* If in an OpenMP context, note var uses.  */
1098   if (__builtin_expect (wtd->omp_ctx != NULL, 0)
1099       && (VAR_P (stmt)
1100           || TREE_CODE (stmt) == PARM_DECL
1101           || TREE_CODE (stmt) == RESULT_DECL)
1102       && omp_var_to_track (stmt))
1103     omp_cxx_notice_variable (wtd->omp_ctx, stmt);
1104
1105   /* Don't dereference parms in a thunk, pass the references through. */
1106   if ((TREE_CODE (stmt) == CALL_EXPR && CALL_FROM_THUNK_P (stmt))
1107       || (TREE_CODE (stmt) == AGGR_INIT_EXPR && AGGR_INIT_FROM_THUNK_P (stmt)))
1108     {
1109       *walk_subtrees = 0;
1110       return NULL;
1111     }
1112
1113   /* Otherwise, do dereference invisible reference parms.  */
1114   if (is_invisiref_parm (stmt))
1115     {
1116       *stmt_p = convert_from_reference (stmt);
1117       *walk_subtrees = 0;
1118       return NULL;
1119     }
1120
1121   /* Map block scope extern declarations to visible declarations with the
1122      same name and type in outer scopes if any.  */
1123   if (cp_function_chain->extern_decl_map
1124       && VAR_OR_FUNCTION_DECL_P (stmt)
1125       && DECL_EXTERNAL (stmt))
1126     {
1127       struct cxx_int_tree_map *h, in;
1128       in.uid = DECL_UID (stmt);
1129       h = cp_function_chain->extern_decl_map->find_with_hash (&in, in.uid);
1130       if (h)
1131         {
1132           *stmt_p = h->to;
1133           *walk_subtrees = 0;
1134           return NULL;
1135         }
1136     }
1137
1138   /* Other than invisiref parms, don't walk the same tree twice.  */
1139   if (p_set->contains (stmt))
1140     {
1141       *walk_subtrees = 0;
1142       return NULL_TREE;
1143     }
1144
1145   if (TREE_CODE (stmt) == ADDR_EXPR
1146       && is_invisiref_parm (TREE_OPERAND (stmt, 0)))
1147     {
1148       /* If in an OpenMP context, note var uses.  */
1149       if (__builtin_expect (wtd->omp_ctx != NULL, 0)
1150           && omp_var_to_track (TREE_OPERAND (stmt, 0)))
1151         omp_cxx_notice_variable (wtd->omp_ctx, TREE_OPERAND (stmt, 0));
1152       *stmt_p = fold_convert (TREE_TYPE (stmt), TREE_OPERAND (stmt, 0));
1153       *walk_subtrees = 0;
1154     }
1155   else if (TREE_CODE (stmt) == RETURN_EXPR
1156            && TREE_OPERAND (stmt, 0)
1157            && is_invisiref_parm (TREE_OPERAND (stmt, 0)))
1158     /* Don't dereference an invisiref RESULT_DECL inside a RETURN_EXPR.  */
1159     *walk_subtrees = 0;
1160   else if (TREE_CODE (stmt) == OMP_CLAUSE)
1161     switch (OMP_CLAUSE_CODE (stmt))
1162       {
1163       case OMP_CLAUSE_LASTPRIVATE:
1164         /* Don't dereference an invisiref in OpenMP clauses.  */
1165         if (is_invisiref_parm (OMP_CLAUSE_DECL (stmt)))
1166           {
1167             *walk_subtrees = 0;
1168             if (OMP_CLAUSE_LASTPRIVATE_STMT (stmt))
1169               cp_walk_tree (&OMP_CLAUSE_LASTPRIVATE_STMT (stmt),
1170                             cp_genericize_r, data, NULL);
1171           }
1172         break;
1173       case OMP_CLAUSE_PRIVATE:
1174         /* Don't dereference an invisiref in OpenMP clauses.  */
1175         if (is_invisiref_parm (OMP_CLAUSE_DECL (stmt)))
1176           *walk_subtrees = 0;
1177         else if (wtd->omp_ctx != NULL)
1178           {
1179             /* Private clause doesn't cause any references to the
1180                var in outer contexts, avoid calling
1181                omp_cxx_notice_variable for it.  */
1182             struct cp_genericize_omp_taskreg *old = wtd->omp_ctx;
1183             wtd->omp_ctx = NULL;
1184             cp_walk_tree (&OMP_CLAUSE_DECL (stmt), cp_genericize_r,
1185                           data, NULL);
1186             wtd->omp_ctx = old;
1187             *walk_subtrees = 0;
1188           }
1189         break;
1190       case OMP_CLAUSE_SHARED:
1191       case OMP_CLAUSE_FIRSTPRIVATE:
1192       case OMP_CLAUSE_COPYIN:
1193       case OMP_CLAUSE_COPYPRIVATE:
1194         /* Don't dereference an invisiref in OpenMP clauses.  */
1195         if (is_invisiref_parm (OMP_CLAUSE_DECL (stmt)))
1196           *walk_subtrees = 0;
1197         break;
1198       case OMP_CLAUSE_REDUCTION:
1199         /* Don't dereference an invisiref in reduction clause's
1200            OMP_CLAUSE_DECL either.  OMP_CLAUSE_REDUCTION_{INIT,MERGE}
1201            still needs to be genericized.  */
1202         if (is_invisiref_parm (OMP_CLAUSE_DECL (stmt)))
1203           {
1204             *walk_subtrees = 0;
1205             if (OMP_CLAUSE_REDUCTION_INIT (stmt))
1206               cp_walk_tree (&OMP_CLAUSE_REDUCTION_INIT (stmt),
1207                             cp_genericize_r, data, NULL);
1208             if (OMP_CLAUSE_REDUCTION_MERGE (stmt))
1209               cp_walk_tree (&OMP_CLAUSE_REDUCTION_MERGE (stmt),
1210                             cp_genericize_r, data, NULL);
1211           }
1212         break;
1213       default:
1214         break;
1215       }
1216   else if (IS_TYPE_OR_DECL_P (stmt))
1217     *walk_subtrees = 0;
1218
1219   /* Due to the way voidify_wrapper_expr is written, we don't get a chance
1220      to lower this construct before scanning it, so we need to lower these
1221      before doing anything else.  */
1222   else if (TREE_CODE (stmt) == CLEANUP_STMT)
1223     *stmt_p = build2_loc (EXPR_LOCATION (stmt),
1224                           CLEANUP_EH_ONLY (stmt) ? TRY_CATCH_EXPR
1225                                                  : TRY_FINALLY_EXPR,
1226                           void_type_node,
1227                           CLEANUP_BODY (stmt),
1228                           CLEANUP_EXPR (stmt));
1229
1230   else if (TREE_CODE (stmt) == IF_STMT)
1231     {
1232       genericize_if_stmt (stmt_p);
1233       /* *stmt_p has changed, tail recurse to handle it again.  */
1234       return cp_genericize_r (stmt_p, walk_subtrees, data);
1235     }
1236
1237   /* COND_EXPR might have incompatible types in branches if one or both
1238      arms are bitfields.  Fix it up now.  */
1239   else if (TREE_CODE (stmt) == COND_EXPR)
1240     {
1241       tree type_left
1242         = (TREE_OPERAND (stmt, 1)
1243            ? is_bitfield_expr_with_lowered_type (TREE_OPERAND (stmt, 1))
1244            : NULL_TREE);
1245       tree type_right
1246         = (TREE_OPERAND (stmt, 2)
1247            ? is_bitfield_expr_with_lowered_type (TREE_OPERAND (stmt, 2))
1248            : NULL_TREE);
1249       if (type_left
1250           && !useless_type_conversion_p (TREE_TYPE (stmt),
1251                                          TREE_TYPE (TREE_OPERAND (stmt, 1))))
1252         {
1253           TREE_OPERAND (stmt, 1)
1254             = fold_convert (type_left, TREE_OPERAND (stmt, 1));
1255           gcc_assert (useless_type_conversion_p (TREE_TYPE (stmt),
1256                                                  type_left));
1257         }
1258       if (type_right
1259           && !useless_type_conversion_p (TREE_TYPE (stmt),
1260                                          TREE_TYPE (TREE_OPERAND (stmt, 2))))
1261         {
1262           TREE_OPERAND (stmt, 2)
1263             = fold_convert (type_right, TREE_OPERAND (stmt, 2));
1264           gcc_assert (useless_type_conversion_p (TREE_TYPE (stmt),
1265                                                  type_right));
1266         }
1267     }
1268
1269   else if (TREE_CODE (stmt) == BIND_EXPR)
1270     {
1271       if (__builtin_expect (wtd->omp_ctx != NULL, 0))
1272         {
1273           tree decl;
1274           for (decl = BIND_EXPR_VARS (stmt); decl; decl = DECL_CHAIN (decl))
1275             if (VAR_P (decl)
1276                 && !DECL_EXTERNAL (decl)
1277                 && omp_var_to_track (decl))
1278               {
1279                 splay_tree_node n
1280                   = splay_tree_lookup (wtd->omp_ctx->variables,
1281                                        (splay_tree_key) decl);
1282                 if (n == NULL)
1283                   splay_tree_insert (wtd->omp_ctx->variables,
1284                                      (splay_tree_key) decl,
1285                                      TREE_STATIC (decl)
1286                                      ? OMP_CLAUSE_DEFAULT_SHARED
1287                                      : OMP_CLAUSE_DEFAULT_PRIVATE);
1288               }
1289         }
1290       if (flag_sanitize
1291           & (SANITIZE_NULL | SANITIZE_ALIGNMENT | SANITIZE_VPTR))
1292         {
1293           /* The point here is to not sanitize static initializers.  */
1294           bool no_sanitize_p = wtd->no_sanitize_p;
1295           wtd->no_sanitize_p = true;
1296           for (tree decl = BIND_EXPR_VARS (stmt);
1297                decl;
1298                decl = DECL_CHAIN (decl))
1299             if (VAR_P (decl)
1300                 && TREE_STATIC (decl)
1301                 && DECL_INITIAL (decl))
1302               cp_walk_tree (&DECL_INITIAL (decl), cp_genericize_r, data, NULL);
1303           wtd->no_sanitize_p = no_sanitize_p;
1304         }
1305       wtd->bind_expr_stack.safe_push (stmt);
1306       cp_walk_tree (&BIND_EXPR_BODY (stmt),
1307                     cp_genericize_r, data, NULL);
1308       wtd->bind_expr_stack.pop ();
1309     }
1310
1311   else if (TREE_CODE (stmt) == USING_STMT)
1312     {
1313       tree block = NULL_TREE;
1314
1315       /* Get the innermost inclosing GIMPLE_BIND that has a non NULL
1316          BLOCK, and append an IMPORTED_DECL to its
1317          BLOCK_VARS chained list.  */
1318       if (wtd->bind_expr_stack.exists ())
1319         {
1320           int i;
1321           for (i = wtd->bind_expr_stack.length () - 1; i >= 0; i--)
1322             if ((block = BIND_EXPR_BLOCK (wtd->bind_expr_stack[i])))
1323               break;
1324         }
1325       if (block)
1326         {
1327           tree using_directive;
1328           gcc_assert (TREE_OPERAND (stmt, 0));
1329
1330           using_directive = make_node (IMPORTED_DECL);
1331           TREE_TYPE (using_directive) = void_type_node;
1332
1333           IMPORTED_DECL_ASSOCIATED_DECL (using_directive)
1334             = TREE_OPERAND (stmt, 0);
1335           DECL_CHAIN (using_directive) = BLOCK_VARS (block);
1336           BLOCK_VARS (block) = using_directive;
1337         }
1338       /* The USING_STMT won't appear in GENERIC.  */
1339       *stmt_p = build1 (NOP_EXPR, void_type_node, integer_zero_node);
1340       *walk_subtrees = 0;
1341     }
1342
1343   else if (TREE_CODE (stmt) == DECL_EXPR
1344            && TREE_CODE (DECL_EXPR_DECL (stmt)) == USING_DECL)
1345     {
1346       /* Using decls inside DECL_EXPRs are just dropped on the floor.  */
1347       *stmt_p = build1 (NOP_EXPR, void_type_node, integer_zero_node);
1348       *walk_subtrees = 0;
1349     }
1350   else if (TREE_CODE (stmt) == DECL_EXPR)
1351     {
1352       tree d = DECL_EXPR_DECL (stmt);
1353       if (TREE_CODE (d) == VAR_DECL)
1354         gcc_assert (CP_DECL_THREAD_LOCAL_P (d) == DECL_THREAD_LOCAL_P (d));
1355     }
1356   else if (TREE_CODE (stmt) == OMP_PARALLEL
1357            || TREE_CODE (stmt) == OMP_TASK
1358            || TREE_CODE (stmt) == OMP_TASKLOOP)
1359     {
1360       struct cp_genericize_omp_taskreg omp_ctx;
1361       tree c, decl;
1362       splay_tree_node n;
1363
1364       *walk_subtrees = 0;
1365       cp_walk_tree (&OMP_CLAUSES (stmt), cp_genericize_r, data, NULL);
1366       omp_ctx.is_parallel = TREE_CODE (stmt) == OMP_PARALLEL;
1367       omp_ctx.default_shared = omp_ctx.is_parallel;
1368       omp_ctx.outer = wtd->omp_ctx;
1369       omp_ctx.variables = splay_tree_new (splay_tree_compare_decl_uid, 0, 0);
1370       wtd->omp_ctx = &omp_ctx;
1371       for (c = OMP_CLAUSES (stmt); c; c = OMP_CLAUSE_CHAIN (c))
1372         switch (OMP_CLAUSE_CODE (c))
1373           {
1374           case OMP_CLAUSE_SHARED:
1375           case OMP_CLAUSE_PRIVATE:
1376           case OMP_CLAUSE_FIRSTPRIVATE:
1377           case OMP_CLAUSE_LASTPRIVATE:
1378             decl = OMP_CLAUSE_DECL (c);
1379             if (decl == error_mark_node || !omp_var_to_track (decl))
1380               break;
1381             n = splay_tree_lookup (omp_ctx.variables, (splay_tree_key) decl);
1382             if (n != NULL)
1383               break;
1384             splay_tree_insert (omp_ctx.variables, (splay_tree_key) decl,
1385                                OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED
1386                                ? OMP_CLAUSE_DEFAULT_SHARED
1387                                : OMP_CLAUSE_DEFAULT_PRIVATE);
1388             if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_PRIVATE
1389                 && omp_ctx.outer)
1390               omp_cxx_notice_variable (omp_ctx.outer, decl);
1391             break;
1392           case OMP_CLAUSE_DEFAULT:
1393             if (OMP_CLAUSE_DEFAULT_KIND (c) == OMP_CLAUSE_DEFAULT_SHARED)
1394               omp_ctx.default_shared = true;
1395           default:
1396             break;
1397           }
1398       if (TREE_CODE (stmt) == OMP_TASKLOOP)
1399         genericize_omp_for_stmt (stmt_p, walk_subtrees, data);
1400       else
1401         cp_walk_tree (&OMP_BODY (stmt), cp_genericize_r, data, NULL);
1402       wtd->omp_ctx = omp_ctx.outer;
1403       splay_tree_delete (omp_ctx.variables);
1404     }
1405   else if (TREE_CODE (stmt) == TRY_BLOCK)
1406     {
1407       *walk_subtrees = 0;
1408       tree try_block = wtd->try_block;
1409       wtd->try_block = stmt;
1410       cp_walk_tree (&TRY_STMTS (stmt), cp_genericize_r, data, NULL);
1411       wtd->try_block = try_block;
1412       cp_walk_tree (&TRY_HANDLERS (stmt), cp_genericize_r, data, NULL);
1413     }
1414   else if (TREE_CODE (stmt) == MUST_NOT_THROW_EXPR)
1415     {
1416       /* MUST_NOT_THROW_COND might be something else with TM.  */
1417       if (MUST_NOT_THROW_COND (stmt) == NULL_TREE)
1418         {
1419           *walk_subtrees = 0;
1420           tree try_block = wtd->try_block;
1421           wtd->try_block = stmt;
1422           cp_walk_tree (&TREE_OPERAND (stmt, 0), cp_genericize_r, data, NULL);
1423           wtd->try_block = try_block;
1424         }
1425     }
1426   else if (TREE_CODE (stmt) == THROW_EXPR)
1427     {
1428       location_t loc = location_of (stmt);
1429       if (TREE_NO_WARNING (stmt))
1430         /* Never mind.  */;
1431       else if (wtd->try_block)
1432         {
1433           if (TREE_CODE (wtd->try_block) == MUST_NOT_THROW_EXPR
1434               && warning_at (loc, OPT_Wterminate,
1435                              "throw will always call terminate()")
1436               && cxx_dialect >= cxx11
1437               && DECL_DESTRUCTOR_P (current_function_decl))
1438             inform (loc, "in C++11 destructors default to noexcept");
1439         }
1440       else
1441         {
1442           if (warn_cxx11_compat && cxx_dialect < cxx11
1443               && DECL_DESTRUCTOR_P (current_function_decl)
1444               && (TYPE_RAISES_EXCEPTIONS (TREE_TYPE (current_function_decl))
1445                   == NULL_TREE)
1446               && (get_defaulted_eh_spec (current_function_decl)
1447                   == empty_except_spec))
1448             warning_at (loc, OPT_Wc__11_compat,
1449                         "in C++11 this throw will terminate because "
1450                         "destructors default to noexcept");
1451         }
1452     }
1453   else if (TREE_CODE (stmt) == CONVERT_EXPR)
1454     gcc_assert (!CONVERT_EXPR_VBASE_PATH (stmt));
1455   else if (TREE_CODE (stmt) == FOR_STMT)
1456     genericize_for_stmt (stmt_p, walk_subtrees, data);
1457   else if (TREE_CODE (stmt) == WHILE_STMT)
1458     genericize_while_stmt (stmt_p, walk_subtrees, data);
1459   else if (TREE_CODE (stmt) == DO_STMT)
1460     genericize_do_stmt (stmt_p, walk_subtrees, data);
1461   else if (TREE_CODE (stmt) == SWITCH_STMT)
1462     genericize_switch_stmt (stmt_p, walk_subtrees, data);
1463   else if (TREE_CODE (stmt) == CONTINUE_STMT)
1464     genericize_continue_stmt (stmt_p);
1465   else if (TREE_CODE (stmt) == BREAK_STMT)
1466     genericize_break_stmt (stmt_p);
1467   else if (TREE_CODE (stmt) == OMP_FOR
1468            || TREE_CODE (stmt) == OMP_SIMD
1469            || TREE_CODE (stmt) == OMP_DISTRIBUTE)
1470     genericize_omp_for_stmt (stmt_p, walk_subtrees, data);
1471   else if (TREE_CODE (stmt) == PTRMEM_CST)
1472     {
1473       /* By the time we get here we're handing off to the back end, so we don't
1474          need or want to preserve PTRMEM_CST anymore.  */
1475       *stmt_p = cplus_expand_constant (stmt);
1476       *walk_subtrees = 0;
1477     }
1478   else if ((flag_sanitize
1479             & (SANITIZE_NULL | SANITIZE_ALIGNMENT | SANITIZE_VPTR))
1480            && !wtd->no_sanitize_p)
1481     {
1482       if ((flag_sanitize & (SANITIZE_NULL | SANITIZE_ALIGNMENT))
1483           && TREE_CODE (stmt) == NOP_EXPR
1484           && TREE_CODE (TREE_TYPE (stmt)) == REFERENCE_TYPE)
1485         ubsan_maybe_instrument_reference (stmt);
1486       else if (TREE_CODE (stmt) == CALL_EXPR)
1487         {
1488           tree fn = CALL_EXPR_FN (stmt);
1489           if (fn != NULL_TREE
1490               && !error_operand_p (fn)
1491               && POINTER_TYPE_P (TREE_TYPE (fn))
1492               && TREE_CODE (TREE_TYPE (TREE_TYPE (fn))) == METHOD_TYPE)
1493             {
1494               bool is_ctor
1495                 = TREE_CODE (fn) == ADDR_EXPR
1496                   && TREE_CODE (TREE_OPERAND (fn, 0)) == FUNCTION_DECL
1497                   && DECL_CONSTRUCTOR_P (TREE_OPERAND (fn, 0));
1498               if (flag_sanitize & (SANITIZE_NULL | SANITIZE_ALIGNMENT))
1499                 ubsan_maybe_instrument_member_call (stmt, is_ctor);
1500               if ((flag_sanitize & SANITIZE_VPTR) && !is_ctor)
1501                 cp_ubsan_maybe_instrument_member_call (stmt);
1502             }
1503         }
1504     }
1505
1506   p_set->add (*stmt_p);
1507
1508   return NULL;
1509 }
1510
1511 /* Lower C++ front end trees to GENERIC in T_P.  */
1512
1513 static void
1514 cp_genericize_tree (tree* t_p)
1515 {
1516   struct cp_genericize_data wtd;
1517
1518   wtd.p_set = new hash_set<tree>;
1519   wtd.bind_expr_stack.create (0);
1520   wtd.omp_ctx = NULL;
1521   wtd.try_block = NULL_TREE;
1522   wtd.no_sanitize_p = false;
1523   cp_walk_tree (t_p, cp_genericize_r, &wtd, NULL);
1524   delete wtd.p_set;
1525   wtd.bind_expr_stack.release ();
1526   if (flag_sanitize & SANITIZE_VPTR)
1527     cp_ubsan_instrument_member_accesses (t_p);
1528 }
1529
1530 /* If a function that should end with a return in non-void
1531    function doesn't obviously end with return, add ubsan
1532    instrumentation code to verify it at runtime.  */
1533
1534 static void
1535 cp_ubsan_maybe_instrument_return (tree fndecl)
1536 {
1537   if (VOID_TYPE_P (TREE_TYPE (TREE_TYPE (fndecl)))
1538       || DECL_CONSTRUCTOR_P (fndecl)
1539       || DECL_DESTRUCTOR_P (fndecl)
1540       || !targetm.warn_func_return (fndecl))
1541     return;
1542
1543   tree t = DECL_SAVED_TREE (fndecl);
1544   while (t)
1545     {
1546       switch (TREE_CODE (t))
1547         {
1548         case BIND_EXPR:
1549           t = BIND_EXPR_BODY (t);
1550           continue;
1551         case TRY_FINALLY_EXPR:
1552           t = TREE_OPERAND (t, 0);
1553           continue;
1554         case STATEMENT_LIST:
1555           {
1556             tree_stmt_iterator i = tsi_last (t);
1557             if (!tsi_end_p (i))
1558               {
1559                 t = tsi_stmt (i);
1560                 continue;
1561               }
1562           }
1563           break;
1564         case RETURN_EXPR:
1565           return;
1566         default:
1567           break;
1568         }
1569       break;
1570     }
1571   if (t == NULL_TREE)
1572     return;
1573   t = DECL_SAVED_TREE (fndecl);
1574   if (TREE_CODE (t) == BIND_EXPR
1575       && TREE_CODE (BIND_EXPR_BODY (t)) == STATEMENT_LIST)
1576     {
1577       tree_stmt_iterator i = tsi_last (BIND_EXPR_BODY (t));
1578       t = ubsan_instrument_return (DECL_SOURCE_LOCATION (fndecl));
1579       tsi_link_after (&i, t, TSI_NEW_STMT);
1580     }
1581 }
1582
1583 void
1584 cp_genericize (tree fndecl)
1585 {
1586   tree t;
1587
1588   /* Fix up the types of parms passed by invisible reference.  */
1589   for (t = DECL_ARGUMENTS (fndecl); t; t = DECL_CHAIN (t))
1590     if (TREE_ADDRESSABLE (TREE_TYPE (t)))
1591       {
1592         /* If a function's arguments are copied to create a thunk,
1593            then DECL_BY_REFERENCE will be set -- but the type of the
1594            argument will be a pointer type, so we will never get
1595            here.  */
1596         gcc_assert (!DECL_BY_REFERENCE (t));
1597         gcc_assert (DECL_ARG_TYPE (t) != TREE_TYPE (t));
1598         TREE_TYPE (t) = DECL_ARG_TYPE (t);
1599         DECL_BY_REFERENCE (t) = 1;
1600         TREE_ADDRESSABLE (t) = 0;
1601         relayout_decl (t);
1602       }
1603
1604   /* Do the same for the return value.  */
1605   if (TREE_ADDRESSABLE (TREE_TYPE (DECL_RESULT (fndecl))))
1606     {
1607       t = DECL_RESULT (fndecl);
1608       TREE_TYPE (t) = build_reference_type (TREE_TYPE (t));
1609       DECL_BY_REFERENCE (t) = 1;
1610       TREE_ADDRESSABLE (t) = 0;
1611       relayout_decl (t);
1612       if (DECL_NAME (t))
1613         {
1614           /* Adjust DECL_VALUE_EXPR of the original var.  */
1615           tree outer = outer_curly_brace_block (current_function_decl);
1616           tree var;
1617
1618           if (outer)
1619             for (var = BLOCK_VARS (outer); var; var = DECL_CHAIN (var))
1620               if (DECL_NAME (t) == DECL_NAME (var)
1621                   && DECL_HAS_VALUE_EXPR_P (var)
1622                   && DECL_VALUE_EXPR (var) == t)
1623                 {
1624                   tree val = convert_from_reference (t);
1625                   SET_DECL_VALUE_EXPR (var, val);
1626                   break;
1627                 }
1628         }
1629     }
1630
1631   /* If we're a clone, the body is already GIMPLE.  */
1632   if (DECL_CLONED_FUNCTION_P (fndecl))
1633     return;
1634
1635   /* Allow cp_genericize calls to be nested.  */
1636   tree save_bc_label[2];
1637   save_bc_label[bc_break] = bc_label[bc_break];
1638   save_bc_label[bc_continue] = bc_label[bc_continue];
1639   bc_label[bc_break] = NULL_TREE;
1640   bc_label[bc_continue] = NULL_TREE;
1641
1642   /* Expand all the array notations here.  */
1643   if (flag_cilkplus 
1644       && contains_array_notation_expr (DECL_SAVED_TREE (fndecl)))
1645     DECL_SAVED_TREE (fndecl) = 
1646       expand_array_notation_exprs (DECL_SAVED_TREE (fndecl));
1647
1648   /* We do want to see every occurrence of the parms, so we can't just use
1649      walk_tree's hash functionality.  */
1650   cp_genericize_tree (&DECL_SAVED_TREE (fndecl));
1651
1652   if (flag_sanitize & SANITIZE_RETURN
1653       && do_ubsan_in_current_function ())
1654     cp_ubsan_maybe_instrument_return (fndecl);
1655
1656   /* Do everything else.  */
1657   c_genericize (fndecl);
1658
1659   gcc_assert (bc_label[bc_break] == NULL);
1660   gcc_assert (bc_label[bc_continue] == NULL);
1661   bc_label[bc_break] = save_bc_label[bc_break];
1662   bc_label[bc_continue] = save_bc_label[bc_continue];
1663 }
1664 \f
1665 /* Build code to apply FN to each member of ARG1 and ARG2.  FN may be
1666    NULL if there is in fact nothing to do.  ARG2 may be null if FN
1667    actually only takes one argument.  */
1668
1669 static tree
1670 cxx_omp_clause_apply_fn (tree fn, tree arg1, tree arg2)
1671 {
1672   tree defparm, parm, t;
1673   int i = 0;
1674   int nargs;
1675   tree *argarray;
1676
1677   if (fn == NULL)
1678     return NULL;
1679
1680   nargs = list_length (DECL_ARGUMENTS (fn));
1681   argarray = XALLOCAVEC (tree, nargs);
1682
1683   defparm = TREE_CHAIN (TYPE_ARG_TYPES (TREE_TYPE (fn)));
1684   if (arg2)
1685     defparm = TREE_CHAIN (defparm);
1686
1687   if (TREE_CODE (TREE_TYPE (arg1)) == ARRAY_TYPE)
1688     {
1689       tree inner_type = TREE_TYPE (arg1);
1690       tree start1, end1, p1;
1691       tree start2 = NULL, p2 = NULL;
1692       tree ret = NULL, lab;
1693
1694       start1 = arg1;
1695       start2 = arg2;
1696       do
1697         {
1698           inner_type = TREE_TYPE (inner_type);
1699           start1 = build4 (ARRAY_REF, inner_type, start1,
1700                            size_zero_node, NULL, NULL);
1701           if (arg2)
1702             start2 = build4 (ARRAY_REF, inner_type, start2,
1703                              size_zero_node, NULL, NULL);
1704         }
1705       while (TREE_CODE (inner_type) == ARRAY_TYPE);
1706       start1 = build_fold_addr_expr_loc (input_location, start1);
1707       if (arg2)
1708         start2 = build_fold_addr_expr_loc (input_location, start2);
1709
1710       end1 = TYPE_SIZE_UNIT (TREE_TYPE (arg1));
1711       end1 = fold_build_pointer_plus (start1, end1);
1712
1713       p1 = create_tmp_var (TREE_TYPE (start1));
1714       t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, start1);
1715       append_to_statement_list (t, &ret);
1716
1717       if (arg2)
1718         {
1719           p2 = create_tmp_var (TREE_TYPE (start2));
1720           t = build2 (MODIFY_EXPR, TREE_TYPE (p2), p2, start2);
1721           append_to_statement_list (t, &ret);
1722         }
1723
1724       lab = create_artificial_label (input_location);
1725       t = build1 (LABEL_EXPR, void_type_node, lab);
1726       append_to_statement_list (t, &ret);
1727
1728       argarray[i++] = p1;
1729       if (arg2)
1730         argarray[i++] = p2;
1731       /* Handle default arguments.  */
1732       for (parm = defparm; parm && parm != void_list_node;
1733            parm = TREE_CHAIN (parm), i++)
1734         argarray[i] = convert_default_arg (TREE_VALUE (parm),
1735                                            TREE_PURPOSE (parm), fn, i,
1736                                            tf_warning_or_error);
1737       t = build_call_a (fn, i, argarray);
1738       t = fold_convert (void_type_node, t);
1739       t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
1740       append_to_statement_list (t, &ret);
1741
1742       t = fold_build_pointer_plus (p1, TYPE_SIZE_UNIT (inner_type));
1743       t = build2 (MODIFY_EXPR, TREE_TYPE (p1), p1, t);
1744       append_to_statement_list (t, &ret);
1745
1746       if (arg2)
1747         {
1748           t = fold_build_pointer_plus (p2, TYPE_SIZE_UNIT (inner_type));
1749           t = build2 (MODIFY_EXPR, TREE_TYPE (p2), p2, t);
1750           append_to_statement_list (t, &ret);
1751         }
1752
1753       t = build2 (NE_EXPR, boolean_type_node, p1, end1);
1754       t = build3 (COND_EXPR, void_type_node, t, build_and_jump (&lab), NULL);
1755       append_to_statement_list (t, &ret);
1756
1757       return ret;
1758     }
1759   else
1760     {
1761       argarray[i++] = build_fold_addr_expr_loc (input_location, arg1);
1762       if (arg2)
1763         argarray[i++] = build_fold_addr_expr_loc (input_location, arg2);
1764       /* Handle default arguments.  */
1765       for (parm = defparm; parm && parm != void_list_node;
1766            parm = TREE_CHAIN (parm), i++)
1767         argarray[i] = convert_default_arg (TREE_VALUE (parm),
1768                                            TREE_PURPOSE (parm),
1769                                            fn, i, tf_warning_or_error);
1770       t = build_call_a (fn, i, argarray);
1771       t = fold_convert (void_type_node, t);
1772       return fold_build_cleanup_point_expr (TREE_TYPE (t), t);
1773     }
1774 }
1775
1776 /* Return code to initialize DECL with its default constructor, or
1777    NULL if there's nothing to do.  */
1778
1779 tree
1780 cxx_omp_clause_default_ctor (tree clause, tree decl, tree /*outer*/)
1781 {
1782   tree info = CP_OMP_CLAUSE_INFO (clause);
1783   tree ret = NULL;
1784
1785   if (info)
1786     ret = cxx_omp_clause_apply_fn (TREE_VEC_ELT (info, 0), decl, NULL);
1787
1788   return ret;
1789 }
1790
1791 /* Return code to initialize DST with a copy constructor from SRC.  */
1792
1793 tree
1794 cxx_omp_clause_copy_ctor (tree clause, tree dst, tree src)
1795 {
1796   tree info = CP_OMP_CLAUSE_INFO (clause);
1797   tree ret = NULL;
1798
1799   if (info)
1800     ret = cxx_omp_clause_apply_fn (TREE_VEC_ELT (info, 0), dst, src);
1801   if (ret == NULL)
1802     ret = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
1803
1804   return ret;
1805 }
1806
1807 /* Similarly, except use an assignment operator instead.  */
1808
1809 tree
1810 cxx_omp_clause_assign_op (tree clause, tree dst, tree src)
1811 {
1812   tree info = CP_OMP_CLAUSE_INFO (clause);
1813   tree ret = NULL;
1814
1815   if (info)
1816     ret = cxx_omp_clause_apply_fn (TREE_VEC_ELT (info, 2), dst, src);
1817   if (ret == NULL)
1818     ret = build2 (MODIFY_EXPR, TREE_TYPE (dst), dst, src);
1819
1820   return ret;
1821 }
1822
1823 /* Return code to destroy DECL.  */
1824
1825 tree
1826 cxx_omp_clause_dtor (tree clause, tree decl)
1827 {
1828   tree info = CP_OMP_CLAUSE_INFO (clause);
1829   tree ret = NULL;
1830
1831   if (info)
1832     ret = cxx_omp_clause_apply_fn (TREE_VEC_ELT (info, 1), decl, NULL);
1833
1834   return ret;
1835 }
1836
1837 /* True if OpenMP should privatize what this DECL points to rather
1838    than the DECL itself.  */
1839
1840 bool
1841 cxx_omp_privatize_by_reference (const_tree decl)
1842 {
1843   return (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE
1844           || is_invisiref_parm (decl));
1845 }
1846
1847 /* Return true if DECL is const qualified var having no mutable member.  */
1848 bool
1849 cxx_omp_const_qual_no_mutable (tree decl)
1850 {
1851   tree type = TREE_TYPE (decl);
1852   if (TREE_CODE (type) == REFERENCE_TYPE)
1853     {
1854       if (!is_invisiref_parm (decl))
1855         return false;
1856       type = TREE_TYPE (type);
1857
1858       if (TREE_CODE (decl) == RESULT_DECL && DECL_NAME (decl))
1859         {
1860           /* NVR doesn't preserve const qualification of the
1861              variable's type.  */
1862           tree outer = outer_curly_brace_block (current_function_decl);
1863           tree var;
1864
1865           if (outer)
1866             for (var = BLOCK_VARS (outer); var; var = DECL_CHAIN (var))
1867               if (DECL_NAME (decl) == DECL_NAME (var)
1868                   && (TYPE_MAIN_VARIANT (type)
1869                       == TYPE_MAIN_VARIANT (TREE_TYPE (var))))
1870                 {
1871                   if (TYPE_READONLY (TREE_TYPE (var)))
1872                     type = TREE_TYPE (var);
1873                   break;
1874                 }
1875         }
1876     }
1877
1878   if (type == error_mark_node)
1879     return false;
1880
1881   /* Variables with const-qualified type having no mutable member
1882      are predetermined shared.  */
1883   if (TYPE_READONLY (type) && !cp_has_mutable_p (type))
1884     return true;
1885
1886   return false;
1887 }
1888
1889 /* True if OpenMP sharing attribute of DECL is predetermined.  */
1890
1891 enum omp_clause_default_kind
1892 cxx_omp_predetermined_sharing (tree decl)
1893 {
1894   /* Static data members are predetermined shared.  */
1895   if (TREE_STATIC (decl))
1896     {
1897       tree ctx = CP_DECL_CONTEXT (decl);
1898       if (TYPE_P (ctx) && MAYBE_CLASS_TYPE_P (ctx))
1899         return OMP_CLAUSE_DEFAULT_SHARED;
1900     }
1901
1902   /* Const qualified vars having no mutable member are predetermined
1903      shared.  */
1904   if (cxx_omp_const_qual_no_mutable (decl))
1905     return OMP_CLAUSE_DEFAULT_SHARED;
1906
1907   return OMP_CLAUSE_DEFAULT_UNSPECIFIED;
1908 }
1909
1910 /* Finalize an implicitly determined clause.  */
1911
1912 void
1913 cxx_omp_finish_clause (tree c, gimple_seq *)
1914 {
1915   tree decl, inner_type;
1916   bool make_shared = false;
1917
1918   if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_FIRSTPRIVATE)
1919     return;
1920
1921   decl = OMP_CLAUSE_DECL (c);
1922   decl = require_complete_type (decl);
1923   inner_type = TREE_TYPE (decl);
1924   if (decl == error_mark_node)
1925     make_shared = true;
1926   else if (TREE_CODE (TREE_TYPE (decl)) == REFERENCE_TYPE)
1927     inner_type = TREE_TYPE (inner_type);
1928
1929   /* We're interested in the base element, not arrays.  */
1930   while (TREE_CODE (inner_type) == ARRAY_TYPE)
1931     inner_type = TREE_TYPE (inner_type);
1932
1933   /* Check for special function availability by building a call to one.
1934      Save the results, because later we won't be in the right context
1935      for making these queries.  */
1936   if (!make_shared
1937       && CLASS_TYPE_P (inner_type)
1938       && cxx_omp_create_clause_info (c, inner_type, false, true, false, true))
1939     make_shared = true;
1940
1941   if (make_shared)
1942     OMP_CLAUSE_CODE (c) = OMP_CLAUSE_SHARED;
1943 }
1944
1945 /* Return true if DECL's DECL_VALUE_EXPR (if any) should be
1946    disregarded in OpenMP construct, because it is going to be
1947    remapped during OpenMP lowering.  SHARED is true if DECL
1948    is going to be shared, false if it is going to be privatized.  */
1949
1950 bool
1951 cxx_omp_disregard_value_expr (tree decl, bool shared)
1952 {
1953   return !shared
1954          && VAR_P (decl)
1955          && DECL_HAS_VALUE_EXPR_P (decl)
1956          && DECL_ARTIFICIAL (decl)
1957          && DECL_LANG_SPECIFIC (decl)
1958          && DECL_OMP_PRIVATIZED_MEMBER (decl);
1959 }
1960
1961 /* Perform folding on expression X.  */
1962
1963 tree
1964 cp_fully_fold (tree x)
1965 {
1966   if (processing_template_decl)
1967     return x;
1968   /* FIXME cp_fold ought to be a superset of maybe_constant_value so we don't
1969      have to call both.  */
1970   if (cxx_dialect >= cxx11)
1971     x = maybe_constant_value (x);
1972   return cp_fold (x);
1973 }
1974
1975 /* Fold expression X which is used as an rvalue if RVAL is true.  */
1976
1977 static tree
1978 cp_fold_maybe_rvalue (tree x, bool rval)
1979 {
1980   while (true)
1981     {
1982       x = cp_fold (x);
1983       if (rval && DECL_P (x))
1984         {
1985           tree v = decl_constant_value (x);
1986           if (v != x && v != error_mark_node)
1987             {
1988               x = v;
1989               continue;
1990             }
1991         }
1992       break;
1993     }
1994   return x;
1995 }
1996
1997 /* Fold expression X which is used as an rvalue.  */
1998
1999 static tree
2000 cp_fold_rvalue (tree x)
2001 {
2002   return cp_fold_maybe_rvalue (x, true);
2003 }
2004
2005 /* c-common interface to cp_fold.  If IN_INIT, this is in a static initializer
2006    and certain changes are made to the folding done.  Or should be (FIXME).  We
2007    never touch maybe_const, as it is only used for the C front-end
2008    C_MAYBE_CONST_EXPR.  */
2009
2010 tree
2011 c_fully_fold (tree x, bool /*in_init*/, bool */*maybe_const*/)
2012 {
2013   /* c_fully_fold is only used on rvalues, and we need to fold CONST_DECL to
2014      INTEGER_CST.  */
2015   return cp_fold_rvalue (x);
2016 }
2017
2018 static GTY((deletable)) hash_map<tree, tree> *fold_cache;
2019
2020 /* Dispose of the whole FOLD_CACHE.  */
2021
2022 void
2023 clear_fold_cache (void)
2024 {
2025   if (fold_cache != NULL)
2026     fold_cache->empty ();
2027 }
2028
2029 /*  This function tries to fold an expression X.
2030     To avoid combinatorial explosion, folding results are kept in fold_cache.
2031     If we are processing a template or X is invalid, we don't fold at all.
2032     For performance reasons we don't cache expressions representing a
2033     declaration or constant.
2034     Function returns X or its folded variant.  */
2035
2036 static tree
2037 cp_fold (tree x)
2038 {
2039   tree op0, op1, op2, op3;
2040   tree org_x = x, r = NULL_TREE;
2041   enum tree_code code;
2042   location_t loc;
2043   bool rval_ops = true;
2044
2045   if (!x || x == error_mark_node)
2046     return x;
2047
2048   if (processing_template_decl
2049       || (EXPR_P (x) && (!TREE_TYPE (x) || TREE_TYPE (x) == error_mark_node)))
2050     return x;
2051
2052   /* Don't bother to cache DECLs or constants.  */
2053   if (DECL_P (x) || CONSTANT_CLASS_P (x))
2054     return x;
2055
2056   if (fold_cache == NULL)
2057     fold_cache = hash_map<tree, tree>::create_ggc (101);
2058
2059   if (tree *cached = fold_cache->get (x))
2060     return *cached;
2061
2062   code = TREE_CODE (x);
2063   switch (code)
2064     {
2065     case SIZEOF_EXPR:
2066       x = fold_sizeof_expr (x);
2067       break;
2068
2069     case VIEW_CONVERT_EXPR:
2070       rval_ops = false;
2071     case CONVERT_EXPR:
2072     case NOP_EXPR:
2073     case NON_LVALUE_EXPR:
2074
2075       if (VOID_TYPE_P (TREE_TYPE (x)))
2076         return x;
2077
2078       loc = EXPR_LOCATION (x);
2079       op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops);
2080
2081       if (code == CONVERT_EXPR
2082           && SCALAR_TYPE_P (TREE_TYPE (x))
2083           && op0 != void_node)
2084         /* During parsing we used convert_to_*_nofold; re-convert now using the
2085            folding variants, since fold() doesn't do those transformations.  */
2086         x = fold (convert (TREE_TYPE (x), op0));
2087       else if (op0 != TREE_OPERAND (x, 0))
2088         {
2089           if (op0 == error_mark_node)
2090             x = error_mark_node;
2091           else
2092             x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
2093         }
2094       else
2095         x = fold (x);
2096
2097       /* Conversion of an out-of-range value has implementation-defined
2098          behavior; the language considers it different from arithmetic
2099          overflow, which is undefined.  */
2100       if (TREE_CODE (op0) == INTEGER_CST
2101           && TREE_OVERFLOW_P (x) && !TREE_OVERFLOW_P (op0))
2102         TREE_OVERFLOW (x) = false;
2103
2104       break;
2105
2106     case INDIRECT_REF:
2107       /* We don't need the decltype(auto) obfuscation anymore.  */
2108       if (REF_PARENTHESIZED_P (x))
2109         {
2110           tree p = maybe_undo_parenthesized_ref (x);
2111           return cp_fold (p);
2112         }
2113       goto unary;
2114
2115     case ADDR_EXPR:
2116     case REALPART_EXPR:
2117     case IMAGPART_EXPR:
2118       rval_ops = false;
2119     case CONJ_EXPR:
2120     case FIX_TRUNC_EXPR:
2121     case FLOAT_EXPR:
2122     case NEGATE_EXPR:
2123     case ABS_EXPR:
2124     case BIT_NOT_EXPR:
2125     case TRUTH_NOT_EXPR:
2126     case FIXED_CONVERT_EXPR:
2127     unary:
2128
2129       loc = EXPR_LOCATION (x);
2130       op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops);
2131
2132       if (op0 != TREE_OPERAND (x, 0))
2133         {
2134           if (op0 == error_mark_node)
2135             x = error_mark_node;
2136           else
2137             {
2138               x = fold_build1_loc (loc, code, TREE_TYPE (x), op0);
2139               if (code == INDIRECT_REF
2140                   && (INDIRECT_REF_P (x) || TREE_CODE (x) == MEM_REF))
2141                 {
2142                   TREE_READONLY (x) = TREE_READONLY (org_x);
2143                   TREE_SIDE_EFFECTS (x) = TREE_SIDE_EFFECTS (org_x);
2144                   TREE_THIS_VOLATILE (x) = TREE_THIS_VOLATILE (org_x);
2145                 }
2146             }
2147         }
2148       else
2149         x = fold (x);
2150
2151       gcc_assert (TREE_CODE (x) != COND_EXPR
2152                   || !VOID_TYPE_P (TREE_TYPE (TREE_OPERAND (x, 0))));
2153       break;
2154
2155     case UNARY_PLUS_EXPR:
2156       op0 = cp_fold_rvalue (TREE_OPERAND (x, 0));
2157       if (op0 == error_mark_node)
2158         x = error_mark_node;
2159       else
2160         x = fold_convert (TREE_TYPE (x), op0);
2161       break;
2162
2163     case POSTDECREMENT_EXPR:
2164     case POSTINCREMENT_EXPR:
2165     case INIT_EXPR:
2166     case PREDECREMENT_EXPR:
2167     case PREINCREMENT_EXPR:
2168     case COMPOUND_EXPR:
2169     case MODIFY_EXPR:
2170       rval_ops = false;
2171     case POINTER_PLUS_EXPR:
2172     case PLUS_EXPR:
2173     case MINUS_EXPR:
2174     case MULT_EXPR:
2175     case TRUNC_DIV_EXPR:
2176     case CEIL_DIV_EXPR:
2177     case FLOOR_DIV_EXPR:
2178     case ROUND_DIV_EXPR:
2179     case TRUNC_MOD_EXPR:
2180     case CEIL_MOD_EXPR:
2181     case ROUND_MOD_EXPR:
2182     case RDIV_EXPR:
2183     case EXACT_DIV_EXPR:
2184     case MIN_EXPR:
2185     case MAX_EXPR:
2186     case LSHIFT_EXPR:
2187     case RSHIFT_EXPR:
2188     case LROTATE_EXPR:
2189     case RROTATE_EXPR:
2190     case BIT_AND_EXPR:
2191     case BIT_IOR_EXPR:
2192     case BIT_XOR_EXPR:
2193     case TRUTH_AND_EXPR:
2194     case TRUTH_ANDIF_EXPR:
2195     case TRUTH_OR_EXPR:
2196     case TRUTH_ORIF_EXPR:
2197     case TRUTH_XOR_EXPR:
2198     case LT_EXPR: case LE_EXPR:
2199     case GT_EXPR: case GE_EXPR:
2200     case EQ_EXPR: case NE_EXPR:
2201     case UNORDERED_EXPR: case ORDERED_EXPR:
2202     case UNLT_EXPR: case UNLE_EXPR:
2203     case UNGT_EXPR: case UNGE_EXPR:
2204     case UNEQ_EXPR: case LTGT_EXPR:
2205     case RANGE_EXPR: case COMPLEX_EXPR:
2206
2207       loc = EXPR_LOCATION (x);
2208       op0 = cp_fold_maybe_rvalue (TREE_OPERAND (x, 0), rval_ops);
2209       op1 = cp_fold_rvalue (TREE_OPERAND (x, 1));
2210
2211       if (op0 != TREE_OPERAND (x, 0) || op1 != TREE_OPERAND (x, 1))
2212         {
2213           if (op0 == error_mark_node || op1 == error_mark_node)
2214             x = error_mark_node;
2215           else
2216             x = fold_build2_loc (loc, code, TREE_TYPE (x), op0, op1);
2217         }
2218       else
2219         x = fold (x);
2220
2221       if (TREE_NO_WARNING (org_x)
2222           && warn_nonnull_compare
2223           && COMPARISON_CLASS_P (org_x))
2224         {
2225           if (x == error_mark_node || TREE_CODE (x) == INTEGER_CST)
2226             ;
2227           else if (COMPARISON_CLASS_P (x))
2228             TREE_NO_WARNING (x) = 1;
2229           /* Otherwise give up on optimizing these, let GIMPLE folders
2230              optimize those later on.  */
2231           else if (op0 != TREE_OPERAND (org_x, 0)
2232                    || op1 != TREE_OPERAND (org_x, 1))
2233             {
2234               x = build2_loc (loc, code, TREE_TYPE (org_x), op0, op1);
2235               TREE_NO_WARNING (x) = 1;
2236             }
2237           else
2238             x = org_x;
2239         }
2240       break;
2241
2242     case VEC_COND_EXPR:
2243     case COND_EXPR:
2244
2245       /* Don't bother folding a void condition, since it can't produce a
2246          constant value.  Also, some statement-level uses of COND_EXPR leave
2247          one of the branches NULL, so folding would crash.  */
2248       if (VOID_TYPE_P (TREE_TYPE (x)))
2249         return x;
2250
2251       loc = EXPR_LOCATION (x);
2252       op0 = cp_fold_rvalue (TREE_OPERAND (x, 0));
2253       op1 = cp_fold (TREE_OPERAND (x, 1));
2254       op2 = cp_fold (TREE_OPERAND (x, 2));
2255
2256       if (op0 != TREE_OPERAND (x, 0)
2257           || op1 != TREE_OPERAND (x, 1)
2258           || op2 != TREE_OPERAND (x, 2))
2259         {
2260           if (op0 == error_mark_node
2261               || op1 == error_mark_node
2262               || op2 == error_mark_node)
2263             x = error_mark_node;
2264           else
2265             x = fold_build3_loc (loc, code, TREE_TYPE (x), op0, op1, op2);
2266         }
2267       else
2268         x = fold (x);
2269
2270       /* A COND_EXPR might have incompatible types in branches if one or both
2271          arms are bitfields.  If folding exposed such a branch, fix it up.  */
2272       if (TREE_CODE (x) != code)
2273         if (tree type = is_bitfield_expr_with_lowered_type (x))
2274           x = fold_convert (type, x);
2275
2276       break;
2277
2278     case CALL_EXPR:
2279       {
2280         int i, m, sv = optimize, nw = sv, changed = 0;
2281         tree callee = get_callee_fndecl (x);
2282
2283         /* Some built-in function calls will be evaluated at compile-time in
2284            fold ().  Set optimize to 1 when folding __builtin_constant_p inside
2285            a constexpr function so that fold_builtin_1 doesn't fold it to 0.  */
2286         if (callee && DECL_BUILT_IN (callee) && !optimize
2287             && DECL_IS_BUILTIN_CONSTANT_P (callee)
2288             && current_function_decl
2289             && DECL_DECLARED_CONSTEXPR_P (current_function_decl))
2290           nw = 1;
2291
2292         x = copy_node (x);
2293
2294         m = call_expr_nargs (x);
2295         for (i = 0; i < m; i++)
2296           {
2297             r = cp_fold (CALL_EXPR_ARG (x, i));
2298             if (r != CALL_EXPR_ARG (x, i))
2299               {
2300                 if (r == error_mark_node)
2301                   {
2302                     x = error_mark_node;
2303                     break;
2304                   }
2305                 changed = 1;
2306               }
2307             CALL_EXPR_ARG (x, i) = r;
2308           }
2309         if (x == error_mark_node)
2310           break;
2311
2312         optimize = nw;
2313         r = fold (x);
2314         optimize = sv;
2315
2316         if (TREE_CODE (r) != CALL_EXPR)
2317           {
2318             x = cp_fold (r);
2319             break;
2320           }
2321
2322         optimize = nw;
2323
2324         /* Invoke maybe_constant_value for functions declared
2325            constexpr and not called with AGGR_INIT_EXPRs.
2326            TODO:
2327            Do constexpr expansion of expressions where the call itself is not
2328            constant, but the call followed by an INDIRECT_REF is.  */
2329         if (callee && DECL_DECLARED_CONSTEXPR_P (callee)
2330             && !flag_no_inline)
2331           r = maybe_constant_value (x);
2332         optimize = sv;
2333
2334         if (TREE_CODE (r) != CALL_EXPR)
2335           {
2336             x = r;
2337             break;
2338           }
2339
2340         if (!changed)
2341           x = org_x;
2342         break;
2343       }
2344
2345     case CONSTRUCTOR:
2346       {
2347         unsigned i;
2348         constructor_elt *p;
2349         bool changed = false;
2350         vec<constructor_elt, va_gc> *elts = CONSTRUCTOR_ELTS (x);
2351         vec<constructor_elt, va_gc> *nelts = NULL;
2352         vec_safe_reserve (nelts, vec_safe_length (elts));
2353         FOR_EACH_VEC_SAFE_ELT (elts, i, p)
2354           {
2355             tree op = cp_fold (p->value);
2356             constructor_elt e = { p->index, op };
2357             nelts->quick_push (e);
2358             if (op != p->value)
2359               {
2360                 if (op == error_mark_node)
2361                   {
2362                     x = error_mark_node;
2363                     changed = false;
2364                     break;
2365                   }
2366                 changed = true;
2367               }
2368           }
2369         if (changed)
2370           x = build_constructor (TREE_TYPE (x), nelts);
2371         else
2372           vec_free (nelts);
2373         break;
2374       }
2375     case TREE_VEC:
2376       {
2377         bool changed = false;
2378         vec<tree, va_gc> *vec = make_tree_vector ();
2379         int i, n = TREE_VEC_LENGTH (x);
2380         vec_safe_reserve (vec, n);
2381
2382         for (i = 0; i < n; i++)
2383           {
2384             tree op = cp_fold (TREE_VEC_ELT (x, i));
2385             vec->quick_push (op);
2386             if (op != TREE_VEC_ELT (x, i))
2387               changed = true;
2388           }
2389
2390         if (changed)
2391           {
2392             r = copy_node (x);
2393             for (i = 0; i < n; i++)
2394               TREE_VEC_ELT (r, i) = (*vec)[i];
2395             x = r;
2396           }
2397
2398         release_tree_vector (vec);
2399       }
2400
2401       break;
2402
2403     case ARRAY_REF:
2404     case ARRAY_RANGE_REF:
2405
2406       loc = EXPR_LOCATION (x);
2407       op0 = cp_fold (TREE_OPERAND (x, 0));
2408       op1 = cp_fold (TREE_OPERAND (x, 1));
2409       op2 = cp_fold (TREE_OPERAND (x, 2));
2410       op3 = cp_fold (TREE_OPERAND (x, 3));
2411
2412       if (op0 != TREE_OPERAND (x, 0)
2413           || op1 != TREE_OPERAND (x, 1)
2414           || op2 != TREE_OPERAND (x, 2)
2415           || op3 != TREE_OPERAND (x, 3))
2416         {
2417           if (op0 == error_mark_node
2418               || op1 == error_mark_node
2419               || op2 == error_mark_node
2420               || op3 == error_mark_node)
2421             x = error_mark_node;
2422           else
2423             {
2424               x = build4_loc (loc, code, TREE_TYPE (x), op0, op1, op2, op3);
2425               TREE_READONLY (x) = TREE_READONLY (org_x);
2426               TREE_SIDE_EFFECTS (x) = TREE_SIDE_EFFECTS (org_x);
2427               TREE_THIS_VOLATILE (x) = TREE_THIS_VOLATILE (org_x);
2428             }
2429         }
2430
2431       x = fold (x);
2432       break;
2433
2434     default:
2435       return org_x;
2436     }
2437
2438   fold_cache->put (org_x, x);
2439   /* Prevent that we try to fold an already folded result again.  */
2440   if (x != org_x)
2441     fold_cache->put (x, x);
2442
2443   return x;
2444 }
2445
2446 #include "gt-cp-cp-gimplify.h"