1 /* Perform the semantic phase of parsing, i.e., the process of
2    building tree structure, checking semantic consistency, and
3    building RTL.  These routines are used both during actual parsing
4    and during the instantiation of template functions.
5 
6    Copyright (C) 1998-2022 Free Software Foundation, Inc.
7    Written by Mark Mitchell (mmitchell@usa.net) based on code found
8    formerly in parse.y and pt.cc.
9 
10    This file is part of GCC.
11 
12    GCC is free software; you can redistribute it and/or modify it
13    under the terms of the GNU General Public License as published by
14    the Free Software Foundation; either version 3, or (at your option)
15    any later version.
16 
17    GCC is distributed in the hope that it will be useful, but
18    WITHOUT ANY WARRANTY; without even the implied warranty of
19    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
20    General Public License for more details.
21 
22 You should have received a copy of the GNU General Public License
23 along with GCC; see the file COPYING3.  If not see
24 <http://www.gnu.org/licenses/>.  */
25 
26 #include "config.h"
27 #include "system.h"
28 #include "coretypes.h"
29 #include "target.h"
30 #include "bitmap.h"
31 #include "cp-tree.h"
32 #include "stringpool.h"
33 #include "cgraph.h"
34 #include "stmt.h"
35 #include "varasm.h"
36 #include "stor-layout.h"
37 #include "c-family/c-objc.h"
38 #include "tree-inline.h"
39 #include "intl.h"
40 #include "tree-iterator.h"
41 #include "omp-general.h"
42 #include "convert.h"
43 #include "stringpool.h"
44 #include "attribs.h"
45 #include "gomp-constants.h"
46 #include "predict.h"
47 #include "memmodel.h"
48 
49 /* There routines provide a modular interface to perform many parsing
50    operations.  They may therefore be used during actual parsing, or
51    during template instantiation, which may be regarded as a
52    degenerate form of parsing.  */
53 
54 static tree maybe_convert_cond (tree);
55 static tree finalize_nrv_r (tree *, int *, void *);
56 static tree capture_decltype (tree);
57 
58 /* Used for OpenMP non-static data member privatization.  */
59 
60 static hash_map<tree, tree> *omp_private_member_map;
61 static vec<tree> omp_private_member_vec;
62 static bool omp_private_member_ignore_next;
63 
64 
65 /* Deferred Access Checking Overview
66    ---------------------------------
67 
68    Most C++ expressions and declarations require access checking
69    to be performed during parsing.  However, in several cases,
70    this has to be treated differently.
71 
72    For member declarations, access checking has to be deferred
73    until more information about the declaration is known.  For
74    example:
75 
76      class A {
77            typedef int X;
78        public:
79            X f();
80      };
81 
82      A::X A::f();
83      A::X g();
84 
85    When we are parsing the function return type `A::X', we don't
86    really know if this is allowed until we parse the function name.
87 
88    Furthermore, some contexts require that access checking is
89    never performed at all.  These include class heads, and template
90    instantiations.
91 
92    Typical use of access checking functions is described here:
93 
94    1. When we enter a context that requires certain access checking
95       mode, the function `push_deferring_access_checks' is called with
96       DEFERRING argument specifying the desired mode.  Access checking
97       may be performed immediately (dk_no_deferred), deferred
98       (dk_deferred), or not performed (dk_no_check).
99 
100    2. When a declaration such as a type, or a variable, is encountered,
101       the function `perform_or_defer_access_check' is called.  It
102       maintains a vector of all deferred checks.
103 
104    3. The global `current_class_type' or `current_function_decl' is then
105       setup by the parser.  `enforce_access' relies on these information
106       to check access.
107 
108    4. Upon exiting the context mentioned in step 1,
109       `perform_deferred_access_checks' is called to check all declaration
110       stored in the vector. `pop_deferring_access_checks' is then
111       called to restore the previous access checking mode.
112 
113       In case of parsing error, we simply call `pop_deferring_access_checks'
114       without `perform_deferred_access_checks'.  */
115 
116 struct GTY(()) deferred_access {
117   /* A vector representing name-lookups for which we have deferred
118      checking access controls.  We cannot check the accessibility of
119      names used in a decl-specifier-seq until we know what is being
120      declared because code like:
121 
122        class A {
123            class B {};
124            B* f();
125        }
126 
127        A::B* A::f() { return 0; }
128 
129      is valid, even though `A::B' is not generally accessible.  */
130   vec<deferred_access_check, va_gc> *deferred_access_checks;
131 
132   /* The current mode of access checks.  */
133   enum deferring_kind deferring_access_checks_kind;
134 };
135 
136 /* Data for deferred access checking.  */
137 static GTY(()) vec<deferred_access, va_gc> *deferred_access_stack;
138 static GTY(()) unsigned deferred_access_no_check;
139 
140 /* Save the current deferred access states and start deferred
141    access checking iff DEFER_P is true.  */
142 
143 void
push_deferring_access_checks(deferring_kind deferring)144 push_deferring_access_checks (deferring_kind deferring)
145 {
146   /* For context like template instantiation, access checking
147      disabling applies to all nested context.  */
148   if (deferred_access_no_check || deferring == dk_no_check)
149     deferred_access_no_check++;
150   else
151     {
152       deferred_access e = {NULL, deferring};
153       vec_safe_push (deferred_access_stack, e);
154     }
155 }
156 
157 /* Save the current deferred access states and start deferred access
158    checking, continuing the set of deferred checks in CHECKS.  */
159 
160 void
reopen_deferring_access_checks(vec<deferred_access_check,va_gc> * checks)161 reopen_deferring_access_checks (vec<deferred_access_check, va_gc> * checks)
162 {
163   push_deferring_access_checks (dk_deferred);
164   if (!deferred_access_no_check)
165     deferred_access_stack->last().deferred_access_checks = checks;
166 }
167 
168 /* Resume deferring access checks again after we stopped doing
169    this previously.  */
170 
171 void
resume_deferring_access_checks(void)172 resume_deferring_access_checks (void)
173 {
174   if (!deferred_access_no_check)
175     deferred_access_stack->last().deferring_access_checks_kind = dk_deferred;
176 }
177 
178 /* Stop deferring access checks.  */
179 
180 void
stop_deferring_access_checks(void)181 stop_deferring_access_checks (void)
182 {
183   if (!deferred_access_no_check)
184     deferred_access_stack->last().deferring_access_checks_kind = dk_no_deferred;
185 }
186 
187 /* Discard the current deferred access checks and restore the
188    previous states.  */
189 
190 void
pop_deferring_access_checks(void)191 pop_deferring_access_checks (void)
192 {
193   if (deferred_access_no_check)
194     deferred_access_no_check--;
195   else
196     deferred_access_stack->pop ();
197 }
198 
199 /* Returns a TREE_LIST representing the deferred checks.
200    The TREE_PURPOSE of each node is the type through which the
201    access occurred; the TREE_VALUE is the declaration named.
202    */
203 
204 vec<deferred_access_check, va_gc> *
get_deferred_access_checks(void)205 get_deferred_access_checks (void)
206 {
207   if (deferred_access_no_check)
208     return NULL;
209   else
210     return (deferred_access_stack->last().deferred_access_checks);
211 }
212 
213 /* Take current deferred checks and combine with the
214    previous states if we also defer checks previously.
215    Otherwise perform checks now.  */
216 
217 void
pop_to_parent_deferring_access_checks(void)218 pop_to_parent_deferring_access_checks (void)
219 {
220   if (deferred_access_no_check)
221     deferred_access_no_check--;
222   else
223     {
224       vec<deferred_access_check, va_gc> *checks;
225       deferred_access *ptr;
226 
227       checks = (deferred_access_stack->last ().deferred_access_checks);
228 
229       deferred_access_stack->pop ();
230       ptr = &deferred_access_stack->last ();
231       if (ptr->deferring_access_checks_kind == dk_no_deferred)
232           {
233             /* Check access.  */
234             perform_access_checks (checks, tf_warning_or_error);
235           }
236       else
237           {
238             /* Merge with parent.  */
239             int i, j;
240             deferred_access_check *chk, *probe;
241 
242             FOR_EACH_VEC_SAFE_ELT (checks, i, chk)
243               {
244                 FOR_EACH_VEC_SAFE_ELT (ptr->deferred_access_checks, j, probe)
245                     {
246                       if (probe->binfo == chk->binfo &&
247                           probe->decl == chk->decl &&
248                           probe->diag_decl == chk->diag_decl)
249                         goto found;
250                     }
251                 /* Insert into parent's checks.  */
252                 vec_safe_push (ptr->deferred_access_checks, *chk);
253               found:;
254               }
255           }
256     }
257 }
258 
259 /* Called from enforce_access.  A class has attempted (but failed) to access
260    DECL.  It is already established that a baseclass of that class,
261    PARENT_BINFO, has private access to DECL.  Examine certain special cases
262    to find a decl that accurately describes the source of the problem.  If
263    none of the special cases apply, simply return DECL as the source of the
264    problem.  */
265 
266 static tree
get_class_access_diagnostic_decl(tree parent_binfo,tree decl)267 get_class_access_diagnostic_decl (tree parent_binfo, tree decl)
268 {
269   /* When a class is denied access to a decl in a baseclass, most of the
270      time it is because the decl itself was declared as private at the point
271      of declaration.
272 
273      However, in C++, there are (at least) two situations in which a decl
274      can be private even though it was not originally defined as such.
275      These two situations only apply if a baseclass had private access to
276      DECL (this function is only called if that is the case).  */
277 
278   /* We should first check whether the reason the parent had private access
279      to DECL was simply because DECL was created and declared as private in
280      the parent.  If it was, then DECL is definitively the source of the
281      problem.  */
282   if (SAME_BINFO_TYPE_P (context_for_name_lookup (decl),
283                                BINFO_TYPE (parent_binfo)))
284     return decl;
285 
286   /* 1.  If the "using" keyword is used to inherit DECL within the parent,
287      this may cause DECL to be private, so we should return the using
288      statement as the source of the problem.
289 
290      Scan the fields of PARENT_BINFO and see if there are any using decls.  If
291      there are, see if they inherit DECL.  If they do, that's where DECL must
292      have been declared private.  */
293 
294   for (tree parent_field = TYPE_FIELDS (BINFO_TYPE (parent_binfo));
295        parent_field;
296        parent_field = DECL_CHAIN (parent_field))
297     /* Not necessary, but also check TREE_PRIVATE for the sake of
298        eliminating obviously non-relevant using decls.  */
299     if (TREE_CODE (parent_field) == USING_DECL
300           && TREE_PRIVATE (parent_field))
301       {
302           tree decl_stripped = strip_using_decl (parent_field);
303 
304           /* The using statement might be overloaded.  If so, we need to
305              check all of the overloads.  */
306           for (ovl_iterator iter (decl_stripped); iter; ++iter)
307             /* If equal, the using statement inherits DECL, and so is the
308                source of the access failure, so return it.  */
309             if (*iter == decl)
310               return parent_field;
311       }
312 
313   /* 2.  If DECL was privately inherited by the parent class, then DECL will
314      be inaccessible, even though it may originally have been accessible to
315      deriving classes.  In that case, the fault lies with the parent, since it
316      used a private inheritance, so we return the parent as the source of the
317      problem.
318 
319      Since this is the last check, we just assume it's true.  At worst, it
320      will simply point to the class that failed to give access, which is
321      technically true.  */
322   return TYPE_NAME (BINFO_TYPE (parent_binfo));
323 }
324 
325 /* If the current scope isn't allowed to access DECL along
326    BASETYPE_PATH, give an error, or if we're parsing a function or class
327    template, defer the access check to be performed at instantiation time.
328    The most derived class in BASETYPE_PATH is the one used to qualify DECL.
329    DIAG_DECL is the declaration to use in the error diagnostic.  */
330 
331 static bool
enforce_access(tree basetype_path,tree decl,tree diag_decl,tsubst_flags_t complain,access_failure_info * afi=NULL)332 enforce_access (tree basetype_path, tree decl, tree diag_decl,
333                     tsubst_flags_t complain, access_failure_info *afi = NULL)
334 {
335   gcc_assert (TREE_CODE (basetype_path) == TREE_BINFO);
336 
337   if (flag_new_inheriting_ctors
338       && DECL_INHERITED_CTOR (decl))
339     {
340       /* 7.3.3/18: The additional constructors are accessible if they would be
341            accessible when used to construct an object of the corresponding base
342            class.  */
343       decl = strip_inheriting_ctors (decl);
344       basetype_path = lookup_base (basetype_path, DECL_CONTEXT (decl),
345                                            ba_any, NULL, complain);
346     }
347 
348   tree cs = current_scope ();
349   if (processing_template_decl
350       && (CLASS_TYPE_P (cs) || TREE_CODE (cs) == FUNCTION_DECL))
351     if (tree template_info = get_template_info (cs))
352       {
353           /* When parsing a function or class template, we in general need to
354              defer access checks until template instantiation time, since a friend
355              declaration may grant access only to a particular specialization of
356              the template.  */
357 
358           if (accessible_p (basetype_path, decl, /*consider_local_p=*/true))
359             /* But if the member is deemed accessible at parse time, then we can
360                assume it'll be accessible at instantiation time.  */
361             return true;
362 
363           /* Access of a dependent decl should be rechecked after tsubst'ing
364              into the user of the decl, rather than explicitly deferring the
365              check here.  */
366           gcc_assert (!uses_template_parms (decl));
367           if (TREE_CODE (decl) == FIELD_DECL)
368             gcc_assert (!uses_template_parms (DECL_CONTEXT (decl)));
369 
370           /* Defer this access check until instantiation time.  */
371           deferred_access_check access_check;
372           access_check.binfo = basetype_path;
373           access_check.decl = decl;
374           access_check.diag_decl = diag_decl;
375           access_check.loc = input_location;
376           vec_safe_push (TI_DEFERRED_ACCESS_CHECKS (template_info), access_check);
377           return true;
378       }
379 
380   if (!accessible_p (basetype_path, decl, /*consider_local_p=*/true))
381     {
382       if (flag_new_inheriting_ctors)
383           diag_decl = strip_inheriting_ctors (diag_decl);
384       if (complain & tf_error)
385           {
386             access_kind access_failure_reason = ak_none;
387 
388             /* By default, using the decl as the source of the problem will
389                usually give correct results.  */
390             tree diag_location = diag_decl;
391 
392             /* However, if a parent of BASETYPE_PATH had private access to decl,
393                then it actually might be the case that the source of the problem
394                is not DECL.  */
395             tree parent_binfo = get_parent_with_private_access (decl,
396                                                                             basetype_path);
397 
398             /* So if a parent did have private access, then we need to do
399                special checks to obtain the best diagnostic location decl.  */
400             if (parent_binfo != NULL_TREE)
401               {
402                 diag_location = get_class_access_diagnostic_decl (parent_binfo,
403                                                                                 diag_decl);
404 
405                 /* We also at this point know that the reason access failed was
406                      because decl was private.  */
407                 access_failure_reason = ak_private;
408               }
409 
410             /* Finally, generate an error message.  */
411             complain_about_access (decl, diag_decl, diag_location, true,
412                                          access_failure_reason);
413           }
414       if (afi)
415           afi->record_access_failure (basetype_path, decl, diag_decl);
416       return false;
417     }
418 
419   return true;
420 }
421 
422 /* Perform the access checks in CHECKS.  The TREE_PURPOSE of each node
423    is the BINFO indicating the qualifying scope used to access the
424    DECL node stored in the TREE_VALUE of the node.  If CHECKS is empty
425    or we aren't in SFINAE context or all the checks succeed return TRUE,
426    otherwise FALSE.  */
427 
428 bool
perform_access_checks(vec<deferred_access_check,va_gc> * checks,tsubst_flags_t complain)429 perform_access_checks (vec<deferred_access_check, va_gc> *checks,
430                            tsubst_flags_t complain)
431 {
432   int i;
433   deferred_access_check *chk;
434   location_t loc = input_location;
435   bool ok = true;
436 
437   if (!checks)
438     return true;
439 
440   FOR_EACH_VEC_SAFE_ELT (checks, i, chk)
441     {
442       input_location = chk->loc;
443       ok &= enforce_access (chk->binfo, chk->decl, chk->diag_decl, complain);
444     }
445 
446   input_location = loc;
447   return (complain & tf_error) ? true : ok;
448 }
449 
450 /* Perform the deferred access checks.
451 
452    After performing the checks, we still have to keep the list
453    `deferred_access_stack->deferred_access_checks' since we may want
454    to check access for them again later in a different context.
455    For example:
456 
457      class A {
458        typedef int X;
459        static X a;
460      };
461      A::X A::a, x;  // No error for `A::a', error for `x'
462 
463    We have to perform deferred access of `A::X', first with `A::a',
464    next with `x'.  Return value like perform_access_checks above.  */
465 
466 bool
perform_deferred_access_checks(tsubst_flags_t complain)467 perform_deferred_access_checks (tsubst_flags_t complain)
468 {
469   return perform_access_checks (get_deferred_access_checks (), complain);
470 }
471 
472 /* Defer checking the accessibility of DECL, when looked up in
473    BINFO. DIAG_DECL is the declaration to use to print diagnostics.
474    Return value like perform_access_checks above.
475    If non-NULL, report failures to AFI.  */
476 
477 bool
perform_or_defer_access_check(tree binfo,tree decl,tree diag_decl,tsubst_flags_t complain,access_failure_info * afi)478 perform_or_defer_access_check (tree binfo, tree decl, tree diag_decl,
479                                      tsubst_flags_t complain,
480                                      access_failure_info *afi)
481 {
482   int i;
483   deferred_access *ptr;
484   deferred_access_check *chk;
485 
486   /* Exit if we are in a context that no access checking is performed.  */
487   if (deferred_access_no_check)
488     return true;
489 
490   gcc_assert (TREE_CODE (binfo) == TREE_BINFO);
491 
492   ptr = &deferred_access_stack->last ();
493 
494   /* If we are not supposed to defer access checks, just check now.  */
495   if (ptr->deferring_access_checks_kind == dk_no_deferred)
496     {
497       bool ok = enforce_access (binfo, decl, diag_decl, complain, afi);
498       return (complain & tf_error) ? true : ok;
499     }
500 
501   /* See if we are already going to perform this check.  */
502   FOR_EACH_VEC_SAFE_ELT (ptr->deferred_access_checks, i, chk)
503     {
504       if (chk->decl == decl && chk->binfo == binfo &&
505             chk->diag_decl == diag_decl)
506           {
507             return true;
508           }
509     }
510   /* If not, record the check.  */
511   deferred_access_check new_access = {binfo, decl, diag_decl, input_location};
512   vec_safe_push (ptr->deferred_access_checks, new_access);
513 
514   return true;
515 }
516 
517 /* Returns nonzero if the current statement is a full expression,
518    i.e. temporaries created during that statement should be destroyed
519    at the end of the statement.  */
520 
521 int
stmts_are_full_exprs_p(void)522 stmts_are_full_exprs_p (void)
523 {
524   return current_stmt_tree ()->stmts_are_full_exprs_p;
525 }
526 
527 /* T is a statement.  Add it to the statement-tree.  This is the C++
528    version.  The C/ObjC frontends have a slightly different version of
529    this function.  */
530 
531 tree
add_stmt(tree t)532 add_stmt (tree t)
533 {
534   enum tree_code code = TREE_CODE (t);
535 
536   if (EXPR_P (t) && code != LABEL_EXPR)
537     {
538       if (!EXPR_HAS_LOCATION (t))
539           SET_EXPR_LOCATION (t, input_location);
540 
541       /* When we expand a statement-tree, we must know whether or not the
542            statements are full-expressions.  We record that fact here.  */
543       if (STATEMENT_CODE_P (TREE_CODE (t)))
544           STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();
545     }
546 
547   if (code == LABEL_EXPR || code == CASE_LABEL_EXPR)
548     STATEMENT_LIST_HAS_LABEL (cur_stmt_list) = 1;
549 
550   /* Add T to the statement-tree.  Non-side-effect statements need to be
551      recorded during statement expressions.  */
552   gcc_checking_assert (!stmt_list_stack->is_empty ());
553   append_to_statement_list_force (t, &cur_stmt_list);
554 
555   return t;
556 }
557 
558 /* Returns the stmt_tree to which statements are currently being added.  */
559 
560 stmt_tree
current_stmt_tree(void)561 current_stmt_tree (void)
562 {
563   return (cfun
564             ? &cfun->language->base.x_stmt_tree
565             : &scope_chain->x_stmt_tree);
566 }
567 
568 /* If statements are full expressions, wrap STMT in a CLEANUP_POINT_EXPR.  */
569 
570 static tree
maybe_cleanup_point_expr(tree expr)571 maybe_cleanup_point_expr (tree expr)
572 {
573   if (!processing_template_decl && stmts_are_full_exprs_p ())
574     expr = fold_build_cleanup_point_expr (TREE_TYPE (expr), expr);
575   return expr;
576 }
577 
578 /* Like maybe_cleanup_point_expr except have the type of the new expression be
579    void so we don't need to create a temporary variable to hold the inner
580    expression.  The reason why we do this is because the original type might be
581    an aggregate and we cannot create a temporary variable for that type.  */
582 
583 tree
maybe_cleanup_point_expr_void(tree expr)584 maybe_cleanup_point_expr_void (tree expr)
585 {
586   if (!processing_template_decl && stmts_are_full_exprs_p ())
587     expr = fold_build_cleanup_point_expr (void_type_node, expr);
588   return expr;
589 }
590 
591 
592 
593 /* Create a declaration statement for the declaration given by the DECL.  */
594 
595 void
add_decl_expr(tree decl)596 add_decl_expr (tree decl)
597 {
598   tree r = build_stmt (DECL_SOURCE_LOCATION (decl), DECL_EXPR, decl);
599   if (DECL_INITIAL (decl)
600       || (DECL_SIZE (decl) && TREE_SIDE_EFFECTS (DECL_SIZE (decl))))
601     r = maybe_cleanup_point_expr_void (r);
602   add_stmt (r);
603 }
604 
605 /* Set EXPR_LOCATION of the cleanups of any CLEANUP_STMT in STMTS to LOC.  */
606 
607 static void
set_cleanup_locs(tree stmts,location_t loc)608 set_cleanup_locs (tree stmts, location_t loc)
609 {
610   if (TREE_CODE (stmts) == CLEANUP_STMT)
611     {
612       tree t = CLEANUP_EXPR (stmts);
613       protected_set_expr_location (t, loc);
614       /* Avoid locus differences for C++ cdtor calls depending on whether
615            cdtor_returns_this: a conversion to void is added to discard the return
616            value, and this conversion ends up carrying the location, and when it
617            gets discarded, the location is lost.  So hold it in the call as
618            well.  */
619       if (TREE_CODE (t) == NOP_EXPR
620             && TREE_TYPE (t) == void_type_node
621             && TREE_CODE (TREE_OPERAND (t, 0)) == CALL_EXPR)
622           protected_set_expr_location (TREE_OPERAND (t, 0), loc);
623       set_cleanup_locs (CLEANUP_BODY (stmts), loc);
624     }
625   else if (TREE_CODE (stmts) == STATEMENT_LIST)
626     for (tree stmt : tsi_range (stmts))
627       set_cleanup_locs (stmt, loc);
628 }
629 
630 /* True iff the innermost block scope is a try block.  */
631 
632 static bool
at_try_scope()633 at_try_scope ()
634 {
635   cp_binding_level *b = current_binding_level;
636   while (b && b->kind == sk_cleanup)
637     b = b->level_chain;
638   return b && b->kind == sk_try;
639 }
640 
641 /* Finish a scope.  */
642 
643 tree
do_poplevel(tree stmt_list)644 do_poplevel (tree stmt_list)
645 {
646   tree block = NULL;
647 
648   bool was_try = at_try_scope ();
649 
650   if (stmts_are_full_exprs_p ())
651     block = poplevel (kept_level_p (), 1, 0);
652 
653   /* This needs to come after poplevel merges sk_cleanup statement_lists.  */
654   maybe_splice_retval_cleanup (stmt_list, was_try);
655 
656   stmt_list = pop_stmt_list (stmt_list);
657 
658   /* input_location is the last token of the scope, usually a }.  */
659   set_cleanup_locs (stmt_list, input_location);
660 
661   if (!processing_template_decl)
662     {
663       stmt_list = c_build_bind_expr (input_location, block, stmt_list);
664       /* ??? See c_end_compound_stmt re statement expressions.  */
665     }
666 
667   return stmt_list;
668 }
669 
670 /* Begin a new scope.  */
671 
672 static tree
do_pushlevel(scope_kind sk)673 do_pushlevel (scope_kind sk)
674 {
675   tree ret = push_stmt_list ();
676   if (stmts_are_full_exprs_p ())
677     begin_scope (sk, NULL);
678   return ret;
679 }
680 
681 /* Queue a cleanup.  CLEANUP is an expression/statement to be executed
682    when the current scope is exited.  EH_ONLY is true when this is not
683    meant to apply to normal control flow transfer.  DECL is the VAR_DECL
684    being cleaned up, if any, or null for temporaries or subobjects.  */
685 
686 void
push_cleanup(tree decl,tree cleanup,bool eh_only)687 push_cleanup (tree decl, tree cleanup, bool eh_only)
688 {
689   tree stmt = build_stmt (input_location, CLEANUP_STMT, NULL, cleanup, decl);
690   CLEANUP_EH_ONLY (stmt) = eh_only;
691   add_stmt (stmt);
692   CLEANUP_BODY (stmt) = push_stmt_list ();
693 }
694 
695 /* Simple infinite loop tracking for -Wreturn-type.  We keep a stack of all
696    the current loops, represented by 'NULL_TREE' if we've seen a possible
697    exit, and 'error_mark_node' if not.  This is currently used only to
698    suppress the warning about a function with no return statements, and
699    therefore we don't bother noting returns as possible exits.  We also
700    don't bother with gotos.  */
701 
702 static void
begin_maybe_infinite_loop(tree cond)703 begin_maybe_infinite_loop (tree cond)
704 {
705   /* Only track this while parsing a function, not during instantiation.  */
706   if (!cfun || (DECL_TEMPLATE_INSTANTIATION (current_function_decl)
707                     && !processing_template_decl))
708     return;
709   bool maybe_infinite = true;
710   if (cond)
711     {
712       cond = fold_non_dependent_expr (cond);
713       maybe_infinite = integer_nonzerop (cond);
714     }
715   vec_safe_push (cp_function_chain->infinite_loops,
716                      maybe_infinite ? error_mark_node : NULL_TREE);
717 
718 }
719 
720 /* A break is a possible exit for the current loop.  */
721 
722 void
break_maybe_infinite_loop(void)723 break_maybe_infinite_loop (void)
724 {
725   if (!cfun)
726     return;
727   cp_function_chain->infinite_loops->last() = NULL_TREE;
728 }
729 
730 /* If we reach the end of the loop without seeing a possible exit, we have
731    an infinite loop.  */
732 
733 static void
end_maybe_infinite_loop(tree cond)734 end_maybe_infinite_loop (tree cond)
735 {
736   if (!cfun || (DECL_TEMPLATE_INSTANTIATION (current_function_decl)
737                     && !processing_template_decl))
738     return;
739   tree current = cp_function_chain->infinite_loops->pop();
740   if (current != NULL_TREE)
741     {
742       cond = fold_non_dependent_expr (cond);
743       if (integer_nonzerop (cond))
744           current_function_infinite_loop = 1;
745     }
746 }
747 
748 
749 /* Begin a conditional that might contain a declaration.  When generating
750    normal code, we want the declaration to appear before the statement
751    containing the conditional.  When generating template code, we want the
752    conditional to be rendered as the raw DECL_EXPR.  */
753 
754 static void
begin_cond(tree * cond_p)755 begin_cond (tree *cond_p)
756 {
757   if (processing_template_decl)
758     *cond_p = push_stmt_list ();
759 }
760 
761 /* Finish such a conditional.  */
762 
763 static void
finish_cond(tree * cond_p,tree expr)764 finish_cond (tree *cond_p, tree expr)
765 {
766   if (processing_template_decl)
767     {
768       tree cond = pop_stmt_list (*cond_p);
769 
770       if (expr == NULL_TREE)
771           /* Empty condition in 'for'.  */
772           gcc_assert (empty_expr_stmt_p (cond));
773       else if (check_for_bare_parameter_packs (expr))
774         expr = error_mark_node;
775       else if (!empty_expr_stmt_p (cond))
776           expr = build2 (COMPOUND_EXPR, TREE_TYPE (expr), cond, expr);
777     }
778   *cond_p = expr;
779 }
780 
781 /* If *COND_P specifies a conditional with a declaration, transform the
782    loop such that
783               while (A x = 42) { }
784               for (; A x = 42;) { }
785    becomes
786               while (true) { A x = 42; if (!x) break; }
787               for (;;) { A x = 42; if (!x) break; }
788    The statement list for BODY will be empty if the conditional did
789    not declare anything.  */
790 
791 static void
simplify_loop_decl_cond(tree * cond_p,tree body)792 simplify_loop_decl_cond (tree *cond_p, tree body)
793 {
794   tree cond, if_stmt;
795 
796   if (!TREE_SIDE_EFFECTS (body))
797     return;
798 
799   cond = *cond_p;
800   *cond_p = boolean_true_node;
801 
802   if_stmt = begin_if_stmt ();
803   cond_p = &cond;
804   while (TREE_CODE (*cond_p) == ANNOTATE_EXPR)
805     cond_p = &TREE_OPERAND (*cond_p, 0);
806   *cond_p = cp_build_unary_op (TRUTH_NOT_EXPR, *cond_p, false,
807                                      tf_warning_or_error);
808   finish_if_stmt_cond (cond, if_stmt);
809   finish_break_stmt ();
810   finish_then_clause (if_stmt);
811   finish_if_stmt (if_stmt);
812 }
813 
814 /* Finish a goto-statement.  */
815 
816 tree
finish_goto_stmt(tree destination)817 finish_goto_stmt (tree destination)
818 {
819   if (identifier_p (destination))
820     destination = lookup_label (destination);
821 
822   /* We warn about unused labels with -Wunused.  That means we have to
823      mark the used labels as used.  */
824   if (TREE_CODE (destination) == LABEL_DECL)
825     TREE_USED (destination) = 1;
826   else
827     {
828       destination = mark_rvalue_use (destination);
829       if (!processing_template_decl)
830           {
831             destination = cp_convert (ptr_type_node, destination,
832                                             tf_warning_or_error);
833             if (error_operand_p (destination))
834               return NULL_TREE;
835             destination
836               = fold_build_cleanup_point_expr (TREE_TYPE (destination),
837                                                        destination);
838           }
839     }
840 
841   check_goto (destination);
842 
843   add_stmt (build_predict_expr (PRED_GOTO, NOT_TAKEN));
844   return add_stmt (build_stmt (input_location, GOTO_EXPR, destination));
845 }
846 
847 /* COND is the condition-expression for an if, while, etc.,
848    statement.  Convert it to a boolean value, if appropriate.
849    In addition, verify sequence points if -Wsequence-point is enabled.  */
850 
851 static tree
maybe_convert_cond(tree cond)852 maybe_convert_cond (tree cond)
853 {
854   /* Empty conditions remain empty.  */
855   if (!cond)
856     return NULL_TREE;
857 
858   /* Wait until we instantiate templates before doing conversion.  */
859   if (type_dependent_expression_p (cond))
860     return cond;
861 
862   if (warn_sequence_point && !processing_template_decl)
863     verify_sequence_points (cond);
864 
865   /* Do the conversion.  */
866   cond = convert_from_reference (cond);
867 
868   if (TREE_CODE (cond) == MODIFY_EXPR
869       && warn_parentheses
870       && !warning_suppressed_p (cond, OPT_Wparentheses)
871       && warning_at (cp_expr_loc_or_input_loc (cond),
872                          OPT_Wparentheses, "suggest parentheses around "
873                                                "assignment used as truth value"))
874     suppress_warning (cond, OPT_Wparentheses);
875 
876   return condition_conversion (cond);
877 }
878 
879 /* Finish an expression-statement, whose EXPRESSION is as indicated.  */
880 
881 tree
finish_expr_stmt(tree expr)882 finish_expr_stmt (tree expr)
883 {
884   tree r = NULL_TREE;
885   location_t loc = EXPR_LOCATION (expr);
886 
887   if (expr != NULL_TREE)
888     {
889       /* If we ran into a problem, make sure we complained.  */
890       gcc_assert (expr != error_mark_node || seen_error ());
891 
892       if (!processing_template_decl)
893           {
894             if (warn_sequence_point)
895               verify_sequence_points (expr);
896             expr = convert_to_void (expr, ICV_STATEMENT, tf_warning_or_error);
897           }
898       else if (!type_dependent_expression_p (expr))
899           convert_to_void (build_non_dependent_expr (expr), ICV_STATEMENT,
900                          tf_warning_or_error);
901 
902       if (check_for_bare_parameter_packs (expr))
903         expr = error_mark_node;
904 
905       /* Simplification of inner statement expressions, compound exprs,
906            etc can result in us already having an EXPR_STMT.  */
907       if (TREE_CODE (expr) != CLEANUP_POINT_EXPR)
908           {
909             if (TREE_CODE (expr) != EXPR_STMT)
910               expr = build_stmt (loc, EXPR_STMT, expr);
911             expr = maybe_cleanup_point_expr_void (expr);
912           }
913 
914       r = add_stmt (expr);
915     }
916 
917   return r;
918 }
919 
920 
921 /* Begin an if-statement.  Returns a newly created IF_STMT if
922    appropriate.  */
923 
924 tree
begin_if_stmt(void)925 begin_if_stmt (void)
926 {
927   tree r, scope;
928   scope = do_pushlevel (sk_cond);
929   r = build_stmt (input_location, IF_STMT, NULL_TREE,
930                       NULL_TREE, NULL_TREE, scope);
931   current_binding_level->this_entity = r;
932   begin_cond (&IF_COND (r));
933   return r;
934 }
935 
936 /* Returns true if FN, a CALL_EXPR, is a call to
937    std::is_constant_evaluated or __builtin_is_constant_evaluated.  */
938 
939 static bool
is_std_constant_evaluated_p(tree fn)940 is_std_constant_evaluated_p (tree fn)
941 {
942   /* std::is_constant_evaluated takes no arguments.  */
943   if (call_expr_nargs (fn) != 0)
944     return false;
945 
946   tree fndecl = cp_get_callee_fndecl_nofold (fn);
947   if (fndecl == NULL_TREE)
948     return false;
949 
950   if (fndecl_built_in_p (fndecl, CP_BUILT_IN_IS_CONSTANT_EVALUATED,
951                                BUILT_IN_FRONTEND))
952     return true;
953 
954   if (!decl_in_std_namespace_p (fndecl))
955     return false;
956 
957   tree name = DECL_NAME (fndecl);
958   return name && id_equal (name, "is_constant_evaluated");
959 }
960 
961 /* Callback function for maybe_warn_for_constant_evaluated that looks
962    for calls to std::is_constant_evaluated in TP.  */
963 
964 static tree
find_std_constant_evaluated_r(tree * tp,int * walk_subtrees,void *)965 find_std_constant_evaluated_r (tree *tp, int *walk_subtrees, void *)
966 {
967   tree t = *tp;
968 
969   if (TYPE_P (t) || TREE_CONSTANT (t))
970     {
971       *walk_subtrees = false;
972       return NULL_TREE;
973     }
974 
975   switch (TREE_CODE (t))
976     {
977     case CALL_EXPR:
978       if (is_std_constant_evaluated_p (t))
979           return t;
980       break;
981     case EXPR_STMT:
982       /* Don't warn in statement expressions.  */
983       *walk_subtrees = false;
984       return NULL_TREE;
985     default:
986       break;
987     }
988 
989   return NULL_TREE;
990 }
991 
992 /* In certain contexts, std::is_constant_evaluated() is always true (for
993    instance, in a consteval function or in a constexpr if), or always false
994    (e.g., in a non-constexpr non-consteval function) so give the user a clue.  */
995 
996 static void
maybe_warn_for_constant_evaluated(tree cond,bool constexpr_if)997 maybe_warn_for_constant_evaluated (tree cond, bool constexpr_if)
998 {
999   if (!warn_tautological_compare)
1000     return;
1001 
1002   /* Suppress warning for std::is_constant_evaluated if the conditional
1003      comes from a macro.  */
1004   if (from_macro_expansion_at (EXPR_LOCATION (cond)))
1005     return;
1006 
1007   cond = cp_walk_tree_without_duplicates (&cond, find_std_constant_evaluated_r,
1008                                                     NULL);
1009   if (cond)
1010     {
1011       if (constexpr_if)
1012           warning_at (EXPR_LOCATION (cond), OPT_Wtautological_compare,
1013                         "%<std::is_constant_evaluated%> always evaluates to "
1014                         "true in %<if constexpr%>");
1015       else if (!maybe_constexpr_fn (current_function_decl))
1016           warning_at (EXPR_LOCATION (cond), OPT_Wtautological_compare,
1017                         "%<std::is_constant_evaluated%> always evaluates to "
1018                         "false in a non-%<constexpr%> function");
1019       else if (DECL_IMMEDIATE_FUNCTION_P (current_function_decl))
1020           warning_at (EXPR_LOCATION (cond), OPT_Wtautological_compare,
1021                         "%<std::is_constant_evaluated%> always evaluates to "
1022                         "true in a %<consteval%> function");
1023     }
1024 }
1025 
1026 /* Process the COND of an if-statement, which may be given by
1027    IF_STMT.  */
1028 
1029 tree
finish_if_stmt_cond(tree cond,tree if_stmt)1030 finish_if_stmt_cond (tree cond, tree if_stmt)
1031 {
1032   cond = maybe_convert_cond (cond);
1033   maybe_warn_for_constant_evaluated (cond, IF_STMT_CONSTEXPR_P (if_stmt));
1034   if (IF_STMT_CONSTEXPR_P (if_stmt)
1035       && !type_dependent_expression_p (cond)
1036       && require_constant_expression (cond)
1037       && !instantiation_dependent_expression_p (cond)
1038       /* Wait until instantiation time, since only then COND has been
1039            converted to bool.  */
1040       && TYPE_MAIN_VARIANT (TREE_TYPE (cond)) == boolean_type_node)
1041     {
1042       cond = instantiate_non_dependent_expr (cond);
1043       cond = cxx_constant_value (cond, NULL_TREE);
1044     }
1045   finish_cond (&IF_COND (if_stmt), cond);
1046   add_stmt (if_stmt);
1047   THEN_CLAUSE (if_stmt) = push_stmt_list ();
1048   return cond;
1049 }
1050 
1051 /* Finish the then-clause of an if-statement, which may be given by
1052    IF_STMT.  */
1053 
1054 tree
finish_then_clause(tree if_stmt)1055 finish_then_clause (tree if_stmt)
1056 {
1057   THEN_CLAUSE (if_stmt) = pop_stmt_list (THEN_CLAUSE (if_stmt));
1058   return if_stmt;
1059 }
1060 
1061 /* Begin the else-clause of an if-statement.  */
1062 
1063 void
begin_else_clause(tree if_stmt)1064 begin_else_clause (tree if_stmt)
1065 {
1066   ELSE_CLAUSE (if_stmt) = push_stmt_list ();
1067 }
1068 
1069 /* Finish the else-clause of an if-statement, which may be given by
1070    IF_STMT.  */
1071 
1072 void
finish_else_clause(tree if_stmt)1073 finish_else_clause (tree if_stmt)
1074 {
1075   ELSE_CLAUSE (if_stmt) = pop_stmt_list (ELSE_CLAUSE (if_stmt));
1076 }
1077 
1078 /* Callback for cp_walk_tree to mark all {VAR,PARM}_DECLs in a tree as
1079    read.  */
1080 
1081 static tree
maybe_mark_exp_read_r(tree * tp,int *,void *)1082 maybe_mark_exp_read_r (tree *tp, int *, void *)
1083 {
1084   tree t = *tp;
1085   if (VAR_P (t) || TREE_CODE (t) == PARM_DECL)
1086     mark_exp_read (t);
1087   return NULL_TREE;
1088 }
1089 
1090 /* Finish an if-statement.  */
1091 
1092 void
finish_if_stmt(tree if_stmt)1093 finish_if_stmt (tree if_stmt)
1094 {
1095   tree scope = IF_SCOPE (if_stmt);
1096   IF_SCOPE (if_stmt) = NULL;
1097   if (IF_STMT_CONSTEXPR_P (if_stmt))
1098     {
1099       /* Prevent various -Wunused warnings.  We might not instantiate
1100            either of these branches, so we would not mark the variables
1101            used in that branch as read.  */
1102       cp_walk_tree_without_duplicates (&THEN_CLAUSE (if_stmt),
1103                                                maybe_mark_exp_read_r, NULL);
1104       cp_walk_tree_without_duplicates (&ELSE_CLAUSE (if_stmt),
1105                                                maybe_mark_exp_read_r, NULL);
1106     }
1107   add_stmt (do_poplevel (scope));
1108 }
1109 
1110 /* Begin a while-statement.  Returns a newly created WHILE_STMT if
1111    appropriate.  */
1112 
1113 tree
begin_while_stmt(void)1114 begin_while_stmt (void)
1115 {
1116   tree r;
1117   r = build_stmt (input_location, WHILE_STMT, NULL_TREE, NULL_TREE);
1118   add_stmt (r);
1119   WHILE_BODY (r) = do_pushlevel (sk_block);
1120   begin_cond (&WHILE_COND (r));
1121   return r;
1122 }
1123 
1124 /* Process the COND of a while-statement, which may be given by
1125    WHILE_STMT.  */
1126 
1127 void
finish_while_stmt_cond(tree cond,tree while_stmt,bool ivdep,unsigned short unroll)1128 finish_while_stmt_cond (tree cond, tree while_stmt, bool ivdep,
1129                               unsigned short unroll)
1130 {
1131   cond = maybe_convert_cond (cond);
1132   finish_cond (&WHILE_COND (while_stmt), cond);
1133   begin_maybe_infinite_loop (cond);
1134   if (ivdep && cond != error_mark_node)
1135     WHILE_COND (while_stmt) = build3 (ANNOTATE_EXPR,
1136                                               TREE_TYPE (WHILE_COND (while_stmt)),
1137                                               WHILE_COND (while_stmt),
1138                                               build_int_cst (integer_type_node,
1139                                                                  annot_expr_ivdep_kind),
1140                                               integer_zero_node);
1141   if (unroll && cond != error_mark_node)
1142     WHILE_COND (while_stmt) = build3 (ANNOTATE_EXPR,
1143                                               TREE_TYPE (WHILE_COND (while_stmt)),
1144                                               WHILE_COND (while_stmt),
1145                                               build_int_cst (integer_type_node,
1146                                                                  annot_expr_unroll_kind),
1147                                               build_int_cst (integer_type_node,
1148                                                                  unroll));
1149   simplify_loop_decl_cond (&WHILE_COND (while_stmt), WHILE_BODY (while_stmt));
1150 }
1151 
1152 /* Finish a while-statement, which may be given by WHILE_STMT.  */
1153 
1154 void
finish_while_stmt(tree while_stmt)1155 finish_while_stmt (tree while_stmt)
1156 {
1157   end_maybe_infinite_loop (boolean_true_node);
1158   WHILE_BODY (while_stmt) = do_poplevel (WHILE_BODY (while_stmt));
1159 }
1160 
1161 /* Begin a do-statement.  Returns a newly created DO_STMT if
1162    appropriate.  */
1163 
1164 tree
begin_do_stmt(void)1165 begin_do_stmt (void)
1166 {
1167   tree r = build_stmt (input_location, DO_STMT, NULL_TREE, NULL_TREE);
1168   begin_maybe_infinite_loop (boolean_true_node);
1169   add_stmt (r);
1170   DO_BODY (r) = push_stmt_list ();
1171   return r;
1172 }
1173 
1174 /* Finish the body of a do-statement, which may be given by DO_STMT.  */
1175 
1176 void
finish_do_body(tree do_stmt)1177 finish_do_body (tree do_stmt)
1178 {
1179   tree body = DO_BODY (do_stmt) = pop_stmt_list (DO_BODY (do_stmt));
1180 
1181   if (TREE_CODE (body) == STATEMENT_LIST && STATEMENT_LIST_TAIL (body))
1182     body = STATEMENT_LIST_TAIL (body)->stmt;
1183 
1184   if (IS_EMPTY_STMT (body))
1185     warning (OPT_Wempty_body,
1186             "suggest explicit braces around empty body in %<do%> statement");
1187 }
1188 
1189 /* Finish a do-statement, which may be given by DO_STMT, and whose
1190    COND is as indicated.  */
1191 
1192 void
finish_do_stmt(tree cond,tree do_stmt,bool ivdep,unsigned short unroll)1193 finish_do_stmt (tree cond, tree do_stmt, bool ivdep, unsigned short unroll)
1194 {
1195   cond = maybe_convert_cond (cond);
1196   end_maybe_infinite_loop (cond);
1197   /* Unlike other iteration statements, the condition may not contain
1198      a declaration, so we don't call finish_cond which checks for
1199      unexpanded parameter packs.  */
1200   if (check_for_bare_parameter_packs (cond))
1201     cond = error_mark_node;
1202   if (ivdep && cond != error_mark_node)
1203     cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond,
1204                        build_int_cst (integer_type_node, annot_expr_ivdep_kind),
1205                        integer_zero_node);
1206   if (unroll && cond != error_mark_node)
1207     cond = build3 (ANNOTATE_EXPR, TREE_TYPE (cond), cond,
1208                        build_int_cst (integer_type_node, annot_expr_unroll_kind),
1209                        build_int_cst (integer_type_node, unroll));
1210   DO_COND (do_stmt) = cond;
1211 }
1212 
1213 /* Finish a return-statement.  The EXPRESSION returned, if any, is as
1214    indicated.  */
1215 
1216 tree
finish_return_stmt(tree expr)1217 finish_return_stmt (tree expr)
1218 {
1219   tree r;
1220   bool no_warning;
1221 
1222   expr = check_return_expr (expr, &no_warning);
1223 
1224   if (error_operand_p (expr)
1225       || (flag_openmp && !check_omp_return ()))
1226     {
1227       /* Suppress -Wreturn-type for this function.  */
1228       if (warn_return_type)
1229           suppress_warning (current_function_decl, OPT_Wreturn_type);
1230       return error_mark_node;
1231     }
1232 
1233   if (!processing_template_decl)
1234     {
1235       if (warn_sequence_point)
1236           verify_sequence_points (expr);
1237 
1238       if (DECL_DESTRUCTOR_P (current_function_decl)
1239             || (DECL_CONSTRUCTOR_P (current_function_decl)
1240                 && targetm.cxx.cdtor_returns_this ()))
1241           {
1242             /* Similarly, all destructors must run destructors for
1243                base-classes before returning.  So, all returns in a
1244                destructor get sent to the DTOR_LABEL; finish_function emits
1245                code to return a value there.  */
1246             return finish_goto_stmt (cdtor_label);
1247           }
1248     }
1249 
1250   r = build_stmt (input_location, RETURN_EXPR, expr);
1251   if (no_warning)
1252     suppress_warning (r, OPT_Wreturn_type);
1253   r = maybe_cleanup_point_expr_void (r);
1254   r = add_stmt (r);
1255 
1256   return r;
1257 }
1258 
1259 /* Begin the scope of a for-statement or a range-for-statement.
1260    Both the returned trees are to be used in a call to
1261    begin_for_stmt or begin_range_for_stmt.  */
1262 
1263 tree
begin_for_scope(tree * init)1264 begin_for_scope (tree *init)
1265 {
1266   tree scope = do_pushlevel (sk_for);
1267 
1268   if (processing_template_decl)
1269     *init = push_stmt_list ();
1270   else
1271     *init = NULL_TREE;
1272 
1273   return scope;
1274 }
1275 
1276 /* Begin a for-statement.  Returns a new FOR_STMT.
1277    SCOPE and INIT should be the return of begin_for_scope,
1278    or both NULL_TREE  */
1279 
1280 tree
begin_for_stmt(tree scope,tree init)1281 begin_for_stmt (tree scope, tree init)
1282 {
1283   tree r;
1284 
1285   r = build_stmt (input_location, FOR_STMT, NULL_TREE, NULL_TREE,
1286                       NULL_TREE, NULL_TREE, NULL_TREE);
1287 
1288   if (scope == NULL_TREE)
1289     {
1290       gcc_assert (!init);
1291       scope = begin_for_scope (&init);
1292     }
1293 
1294   FOR_INIT_STMT (r) = init;
1295   FOR_SCOPE (r) = scope;
1296 
1297   return r;
1298 }
1299 
1300 /* Finish the init-statement of a for-statement, which may be
1301    given by FOR_STMT.  */
1302 
1303 void
finish_init_stmt(tree for_stmt)1304 finish_init_stmt (tree for_stmt)
1305 {
1306   if (processing_template_decl)
1307     FOR_INIT_STMT (for_stmt) = pop_stmt_list (FOR_INIT_STMT (for_stmt));
1308   add_stmt (for_stmt);
1309   FOR_BODY (for_stmt) = do_pushlevel (sk_block);
1310   begin_cond (&FOR_COND (for_stmt));
1311 }
1312 
1313 /* Finish the COND of a for-statement, which may be given by
1314    FOR_STMT.  */
1315 
1316 void
finish_for_cond(tree cond,tree for_stmt,bool ivdep,unsigned short unroll)1317 finish_for_cond (tree cond, tree for_stmt, bool ivdep, unsigned short unroll)
1318 {
1319   cond = maybe_convert_cond (cond);
1320   finish_cond (&FOR_COND (for_stmt), cond);
1321   begin_maybe_infinite_loop (cond);
1322   if (ivdep && cond != error_mark_node)
1323     FOR_COND (for_stmt) = build3 (ANNOTATE_EXPR,
1324                                           TREE_TYPE (FOR_COND (for_stmt)),
1325                                           FOR_COND (for_stmt),
1326                                           build_int_cst (integer_type_node,
1327                                                              annot_expr_ivdep_kind),
1328                                           integer_zero_node);
1329   if (unroll && cond != error_mark_node)
1330     FOR_COND (for_stmt) = build3 (ANNOTATE_EXPR,
1331                                           TREE_TYPE (FOR_COND (for_stmt)),
1332                                           FOR_COND (for_stmt),
1333                                           build_int_cst (integer_type_node,
1334                                                              annot_expr_unroll_kind),
1335                                           build_int_cst (integer_type_node,
1336                                                              unroll));
1337   simplify_loop_decl_cond (&FOR_COND (for_stmt), FOR_BODY (for_stmt));
1338 }
1339 
1340 /* Finish the increment-EXPRESSION in a for-statement, which may be
1341    given by FOR_STMT.  */
1342 
1343 void
finish_for_expr(tree expr,tree for_stmt)1344 finish_for_expr (tree expr, tree for_stmt)
1345 {
1346   if (!expr)
1347     return;
1348   /* If EXPR is an overloaded function, issue an error; there is no
1349      context available to use to perform overload resolution.  */
1350   if (type_unknown_p (expr))
1351     {
1352       cxx_incomplete_type_error (expr, TREE_TYPE (expr));
1353       expr = error_mark_node;
1354     }
1355   if (!processing_template_decl)
1356     {
1357       if (warn_sequence_point)
1358           verify_sequence_points (expr);
1359       expr = convert_to_void (expr, ICV_THIRD_IN_FOR,
1360                               tf_warning_or_error);
1361     }
1362   else if (!type_dependent_expression_p (expr))
1363     convert_to_void (build_non_dependent_expr (expr), ICV_THIRD_IN_FOR,
1364                      tf_warning_or_error);
1365   expr = maybe_cleanup_point_expr_void (expr);
1366   if (check_for_bare_parameter_packs (expr))
1367     expr = error_mark_node;
1368   FOR_EXPR (for_stmt) = expr;
1369 }
1370 
1371 /* Finish the body of a for-statement, which may be given by
1372    FOR_STMT.  The increment-EXPR for the loop must be
1373    provided.
1374    It can also finish RANGE_FOR_STMT. */
1375 
1376 void
finish_for_stmt(tree for_stmt)1377 finish_for_stmt (tree for_stmt)
1378 {
1379   end_maybe_infinite_loop (boolean_true_node);
1380 
1381   if (TREE_CODE (for_stmt) == RANGE_FOR_STMT)
1382     RANGE_FOR_BODY (for_stmt) = do_poplevel (RANGE_FOR_BODY (for_stmt));
1383   else
1384     FOR_BODY (for_stmt) = do_poplevel (FOR_BODY (for_stmt));
1385 
1386   /* Pop the scope for the body of the loop.  */
1387   tree *scope_ptr = (TREE_CODE (for_stmt) == RANGE_FOR_STMT
1388                          ? &RANGE_FOR_SCOPE (for_stmt)
1389                          : &FOR_SCOPE (for_stmt));
1390   tree scope = *scope_ptr;
1391   *scope_ptr = NULL;
1392 
1393   /* During parsing of the body, range for uses "__for_{range,begin,end} "
1394      decl names to make those unaccessible by code in the body.
1395      Change it to ones with underscore instead of space, so that it can
1396      be inspected in the debugger.  */
1397   tree range_for_decl[3] = { NULL_TREE, NULL_TREE, NULL_TREE };
1398   gcc_assert (CPTI_FOR_BEGIN__IDENTIFIER == CPTI_FOR_RANGE__IDENTIFIER + 1
1399                 && CPTI_FOR_END__IDENTIFIER == CPTI_FOR_RANGE__IDENTIFIER + 2
1400                 && CPTI_FOR_RANGE_IDENTIFIER == CPTI_FOR_RANGE__IDENTIFIER + 3
1401                 && CPTI_FOR_BEGIN_IDENTIFIER == CPTI_FOR_BEGIN__IDENTIFIER + 3
1402                 && CPTI_FOR_END_IDENTIFIER == CPTI_FOR_END__IDENTIFIER + 3);
1403   for (int i = 0; i < 3; i++)
1404     {
1405       tree id = cp_global_trees[CPTI_FOR_RANGE__IDENTIFIER + i];
1406       if (IDENTIFIER_BINDING (id)
1407             && IDENTIFIER_BINDING (id)->scope == current_binding_level)
1408           {
1409             range_for_decl[i] = IDENTIFIER_BINDING (id)->value;
1410             gcc_assert (VAR_P (range_for_decl[i])
1411                           && DECL_ARTIFICIAL (range_for_decl[i]));
1412           }
1413     }
1414 
1415   add_stmt (do_poplevel (scope));
1416 
1417   /* If we're being called from build_vec_init, don't mess with the names of
1418      the variables for an enclosing range-for.  */
1419   if (!stmts_are_full_exprs_p ())
1420     return;
1421 
1422   for (int i = 0; i < 3; i++)
1423     if (range_for_decl[i])
1424       DECL_NAME (range_for_decl[i])
1425           = cp_global_trees[CPTI_FOR_RANGE_IDENTIFIER + i];
1426 }
1427 
1428 /* Begin a range-for-statement.  Returns a new RANGE_FOR_STMT.
1429    SCOPE and INIT should be the return of begin_for_scope,
1430    or both NULL_TREE  .
1431    To finish it call finish_for_stmt(). */
1432 
1433 tree
begin_range_for_stmt(tree scope,tree init)1434 begin_range_for_stmt (tree scope, tree init)
1435 {
1436   begin_maybe_infinite_loop (boolean_false_node);
1437 
1438   tree r = build_stmt (input_location, RANGE_FOR_STMT, NULL_TREE, NULL_TREE,
1439                            NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE);
1440 
1441   if (scope == NULL_TREE)
1442     {
1443       gcc_assert (!init);
1444       scope = begin_for_scope (&init);
1445     }
1446 
1447   /* Since C++20, RANGE_FOR_STMTs can use the init tree, so save it.  */
1448   RANGE_FOR_INIT_STMT (r) = init;
1449   RANGE_FOR_SCOPE (r) = scope;
1450 
1451   return r;
1452 }
1453 
1454 /* Finish the head of a range-based for statement, which may
1455    be given by RANGE_FOR_STMT.  DECL must be the declaration
1456    and EXPR must be the loop expression. */
1457 
1458 void
finish_range_for_decl(tree range_for_stmt,tree decl,tree expr)1459 finish_range_for_decl (tree range_for_stmt, tree decl, tree expr)
1460 {
1461   if (processing_template_decl)
1462     RANGE_FOR_INIT_STMT (range_for_stmt)
1463       = pop_stmt_list (RANGE_FOR_INIT_STMT (range_for_stmt));
1464   RANGE_FOR_DECL (range_for_stmt) = decl;
1465   RANGE_FOR_EXPR (range_for_stmt) = expr;
1466   add_stmt (range_for_stmt);
1467   RANGE_FOR_BODY (range_for_stmt) = do_pushlevel (sk_block);
1468 }
1469 
1470 /* Finish a break-statement.  */
1471 
1472 tree
finish_break_stmt(void)1473 finish_break_stmt (void)
1474 {
1475   /* In switch statements break is sometimes stylistically used after
1476      a return statement.  This can lead to spurious warnings about
1477      control reaching the end of a non-void function when it is
1478      inlined.  Note that we are calling block_may_fallthru with
1479      language specific tree nodes; this works because
1480      block_may_fallthru returns true when given something it does not
1481      understand.  */
1482   if (!block_may_fallthru (cur_stmt_list))
1483     return void_node;
1484   note_break_stmt ();
1485   return add_stmt (build_stmt (input_location, BREAK_STMT));
1486 }
1487 
1488 /* Finish a continue-statement.  */
1489 
1490 tree
finish_continue_stmt(void)1491 finish_continue_stmt (void)
1492 {
1493   return add_stmt (build_stmt (input_location, CONTINUE_STMT));
1494 }
1495 
1496 /* Begin a switch-statement.  Returns a new SWITCH_STMT if
1497    appropriate.  */
1498 
1499 tree
begin_switch_stmt(void)1500 begin_switch_stmt (void)
1501 {
1502   tree r, scope;
1503 
1504   scope = do_pushlevel (sk_cond);
1505   r = build_stmt (input_location, SWITCH_STMT, NULL_TREE, NULL_TREE, NULL_TREE, scope);
1506 
1507   begin_cond (&SWITCH_STMT_COND (r));
1508 
1509   return r;
1510 }
1511 
1512 /* Finish the cond of a switch-statement.  */
1513 
1514 void
finish_switch_cond(tree cond,tree switch_stmt)1515 finish_switch_cond (tree cond, tree switch_stmt)
1516 {
1517   tree orig_type = NULL;
1518 
1519   if (!processing_template_decl)
1520     {
1521       /* Convert the condition to an integer or enumeration type.  */
1522       tree orig_cond = cond;
1523       cond = build_expr_type_conversion (WANT_INT | WANT_ENUM, cond, true);
1524       if (cond == NULL_TREE)
1525           {
1526             error_at (cp_expr_loc_or_input_loc (orig_cond),
1527                         "switch quantity not an integer");
1528             cond = error_mark_node;
1529           }
1530       /* We want unlowered type here to handle enum bit-fields.  */
1531       orig_type = unlowered_expr_type (cond);
1532       if (TREE_CODE (orig_type) != ENUMERAL_TYPE)
1533           orig_type = TREE_TYPE (cond);
1534       if (cond != error_mark_node)
1535           {
1536             /* [stmt.switch]
1537 
1538                Integral promotions are performed.  */
1539             cond = perform_integral_promotions (cond);
1540             cond = maybe_cleanup_point_expr (cond);
1541           }
1542     }
1543   if (check_for_bare_parameter_packs (cond))
1544     cond = error_mark_node;
1545   else if (!processing_template_decl && warn_sequence_point)
1546     verify_sequence_points (cond);
1547 
1548   finish_cond (&SWITCH_STMT_COND (switch_stmt), cond);
1549   SWITCH_STMT_TYPE (switch_stmt) = orig_type;
1550   add_stmt (switch_stmt);
1551   push_switch (switch_stmt);
1552   SWITCH_STMT_BODY (switch_stmt) = push_stmt_list ();
1553 }
1554 
1555 /* Finish the body of a switch-statement, which may be given by
1556    SWITCH_STMT.  The COND to switch on is indicated.  */
1557 
1558 void
finish_switch_stmt(tree switch_stmt)1559 finish_switch_stmt (tree switch_stmt)
1560 {
1561   tree scope;
1562 
1563   SWITCH_STMT_BODY (switch_stmt) =
1564     pop_stmt_list (SWITCH_STMT_BODY (switch_stmt));
1565   pop_switch ();
1566 
1567   scope = SWITCH_STMT_SCOPE (switch_stmt);
1568   SWITCH_STMT_SCOPE (switch_stmt) = NULL;
1569   add_stmt (do_poplevel (scope));
1570 }
1571 
1572 /* Begin a try-block.  Returns a newly-created TRY_BLOCK if
1573    appropriate.  */
1574 
1575 tree
begin_try_block(void)1576 begin_try_block (void)
1577 {
1578   tree r = build_stmt (input_location, TRY_BLOCK, NULL_TREE, NULL_TREE);
1579   add_stmt (r);
1580   TRY_STMTS (r) = push_stmt_list ();
1581   return r;
1582 }
1583 
1584 /* Likewise, for a function-try-block.  The block returned in
1585    *COMPOUND_STMT is an artificial outer scope, containing the
1586    function-try-block.  */
1587 
1588 tree
begin_function_try_block(tree * compound_stmt)1589 begin_function_try_block (tree *compound_stmt)
1590 {
1591   tree r;
1592   /* This outer scope does not exist in the C++ standard, but we need
1593      a place to put __FUNCTION__ and similar variables.  */
1594   *compound_stmt = begin_compound_stmt (0);
1595   r = begin_try_block ();
1596   FN_TRY_BLOCK_P (r) = 1;
1597   return r;
1598 }
1599 
1600 /* Finish a try-block, which may be given by TRY_BLOCK.  */
1601 
1602 void
finish_try_block(tree try_block)1603 finish_try_block (tree try_block)
1604 {
1605   TRY_STMTS (try_block) = pop_stmt_list (TRY_STMTS (try_block));
1606   TRY_HANDLERS (try_block) = push_stmt_list ();
1607 }
1608 
1609 /* Finish the body of a cleanup try-block, which may be given by
1610    TRY_BLOCK.  */
1611 
1612 void
finish_cleanup_try_block(tree try_block)1613 finish_cleanup_try_block (tree try_block)
1614 {
1615   TRY_STMTS (try_block) = pop_stmt_list (TRY_STMTS (try_block));
1616 }
1617 
1618 /* Finish an implicitly generated try-block, with a cleanup is given
1619    by CLEANUP.  */
1620 
1621 void
finish_cleanup(tree cleanup,tree try_block)1622 finish_cleanup (tree cleanup, tree try_block)
1623 {
1624   TRY_HANDLERS (try_block) = cleanup;
1625   CLEANUP_P (try_block) = 1;
1626 }
1627 
1628 /* Likewise, for a function-try-block.  */
1629 
1630 void
finish_function_try_block(tree try_block)1631 finish_function_try_block (tree try_block)
1632 {
1633   finish_try_block (try_block);
1634   /* FIXME : something queer about CTOR_INITIALIZER somehow following
1635      the try block, but moving it inside.  */
1636   in_function_try_handler = 1;
1637 }
1638 
1639 /* Finish a handler-sequence for a try-block, which may be given by
1640    TRY_BLOCK.  */
1641 
1642 void
finish_handler_sequence(tree try_block)1643 finish_handler_sequence (tree try_block)
1644 {
1645   TRY_HANDLERS (try_block) = pop_stmt_list (TRY_HANDLERS (try_block));
1646   check_handlers (TRY_HANDLERS (try_block));
1647 }
1648 
1649 /* Finish the handler-seq for a function-try-block, given by
1650    TRY_BLOCK.  COMPOUND_STMT is the outer block created by
1651    begin_function_try_block.  */
1652 
1653 void
finish_function_handler_sequence(tree try_block,tree compound_stmt)1654 finish_function_handler_sequence (tree try_block, tree compound_stmt)
1655 {
1656   in_function_try_handler = 0;
1657   finish_handler_sequence (try_block);
1658   finish_compound_stmt (compound_stmt);
1659 }
1660 
1661 /* Begin a handler.  Returns a HANDLER if appropriate.  */
1662 
1663 tree
begin_handler(void)1664 begin_handler (void)
1665 {
1666   tree r;
1667 
1668   r = build_stmt (input_location, HANDLER, NULL_TREE, NULL_TREE);
1669   add_stmt (r);
1670 
1671   /* Create a binding level for the eh_info and the exception object
1672      cleanup.  */
1673   HANDLER_BODY (r) = do_pushlevel (sk_catch);
1674 
1675   return r;
1676 }
1677 
1678 /* Finish the handler-parameters for a handler, which may be given by
1679    HANDLER.  DECL is the declaration for the catch parameter, or NULL
1680    if this is a `catch (...)' clause.  */
1681 
1682 void
finish_handler_parms(tree decl,tree handler)1683 finish_handler_parms (tree decl, tree handler)
1684 {
1685   tree type = NULL_TREE;
1686   if (processing_template_decl)
1687     {
1688       if (decl)
1689           {
1690             decl = pushdecl (decl);
1691             decl = push_template_decl (decl);
1692             HANDLER_PARMS (handler) = decl;
1693             type = TREE_TYPE (decl);
1694           }
1695     }
1696   else
1697     {
1698       type = expand_start_catch_block (decl);
1699       if (warn_catch_value
1700             && type != NULL_TREE
1701             && type != error_mark_node
1702             && !TYPE_REF_P (TREE_TYPE (decl)))
1703           {
1704             tree orig_type = TREE_TYPE (decl);
1705             if (CLASS_TYPE_P (orig_type))
1706               {
1707                 if (TYPE_POLYMORPHIC_P (orig_type))
1708                     warning_at (DECL_SOURCE_LOCATION (decl),
1709                                   OPT_Wcatch_value_,
1710                                   "catching polymorphic type %q#T by value",
1711                                   orig_type);
1712                 else if (warn_catch_value > 1)
1713                     warning_at (DECL_SOURCE_LOCATION (decl),
1714                                   OPT_Wcatch_value_,
1715                                   "catching type %q#T by value", orig_type);
1716               }
1717             else if (warn_catch_value > 2)
1718               warning_at (DECL_SOURCE_LOCATION (decl),
1719                               OPT_Wcatch_value_,
1720                               "catching non-reference type %q#T", orig_type);
1721           }
1722     }
1723   HANDLER_TYPE (handler) = type;
1724 }
1725 
1726 /* Finish a handler, which may be given by HANDLER.  The BLOCKs are
1727    the return value from the matching call to finish_handler_parms.  */
1728 
1729 void
finish_handler(tree handler)1730 finish_handler (tree handler)
1731 {
1732   if (!processing_template_decl)
1733     expand_end_catch_block ();
1734   HANDLER_BODY (handler) = do_poplevel (HANDLER_BODY (handler));
1735 }
1736 
1737 /* Begin a compound statement.  FLAGS contains some bits that control the
1738    behavior and context.  If BCS_NO_SCOPE is set, the compound statement
1739    does not define a scope.  If BCS_FN_BODY is set, this is the outermost
1740    block of a function.  If BCS_TRY_BLOCK is set, this is the block
1741    created on behalf of a TRY statement.  Returns a token to be passed to
1742    finish_compound_stmt.  */
1743 
1744 tree
begin_compound_stmt(unsigned int flags)1745 begin_compound_stmt (unsigned int flags)
1746 {
1747   tree r;
1748 
1749   if (flags & BCS_NO_SCOPE)
1750     {
1751       r = push_stmt_list ();
1752       STATEMENT_LIST_NO_SCOPE (r) = 1;
1753 
1754       /* Normally, we try hard to keep the BLOCK for a statement-expression.
1755            But, if it's a statement-expression with a scopeless block, there's
1756            nothing to keep, and we don't want to accidentally keep a block
1757            *inside* the scopeless block.  */
1758       keep_next_level (false);
1759     }
1760   else
1761     {
1762       scope_kind sk = sk_block;
1763       if (flags & BCS_TRY_BLOCK)
1764           sk = sk_try;
1765       else if (flags & BCS_TRANSACTION)
1766           sk = sk_transaction;
1767       r = do_pushlevel (sk);
1768     }
1769 
1770   /* When processing a template, we need to remember where the braces were,
1771      so that we can set up identical scopes when instantiating the template
1772      later.  BIND_EXPR is a handy candidate for this.
1773      Note that do_poplevel won't create a BIND_EXPR itself here (and thus
1774      result in nested BIND_EXPRs), since we don't build BLOCK nodes when
1775      processing templates.  */
1776   if (processing_template_decl)
1777     {
1778       r = build3 (BIND_EXPR, NULL, NULL, r, NULL);
1779       BIND_EXPR_TRY_BLOCK (r) = (flags & BCS_TRY_BLOCK) != 0;
1780       BIND_EXPR_BODY_BLOCK (r) = (flags & BCS_FN_BODY) != 0;
1781       TREE_SIDE_EFFECTS (r) = 1;
1782     }
1783 
1784   return r;
1785 }
1786 
1787 /* Finish a compound-statement, which is given by STMT.  */
1788 
1789 void
finish_compound_stmt(tree stmt)1790 finish_compound_stmt (tree stmt)
1791 {
1792   if (TREE_CODE (stmt) == BIND_EXPR)
1793     {
1794       tree body = do_poplevel (BIND_EXPR_BODY (stmt));
1795       /* If the STATEMENT_LIST is empty and this BIND_EXPR isn't special,
1796            discard the BIND_EXPR so it can be merged with the containing
1797            STATEMENT_LIST.  */
1798       if (TREE_CODE (body) == STATEMENT_LIST
1799             && STATEMENT_LIST_HEAD (body) == NULL
1800             && !BIND_EXPR_BODY_BLOCK (stmt)
1801             && !BIND_EXPR_TRY_BLOCK (stmt))
1802           stmt = body;
1803       else
1804           BIND_EXPR_BODY (stmt) = body;
1805     }
1806   else if (STATEMENT_LIST_NO_SCOPE (stmt))
1807     stmt = pop_stmt_list (stmt);
1808   else
1809     {
1810       /* Destroy any ObjC "super" receivers that may have been
1811            created.  */
1812       objc_clear_super_receiver ();
1813 
1814       stmt = do_poplevel (stmt);
1815     }
1816 
1817   /* ??? See c_end_compound_stmt wrt statement expressions.  */
1818   add_stmt (stmt);
1819 }
1820 
1821 /* Finish an asm-statement, whose components are a STRING, some
1822    OUTPUT_OPERANDS, some INPUT_OPERANDS, some CLOBBERS and some
1823    LABELS.  Also note whether the asm-statement should be
1824    considered volatile, and whether it is asm inline.  */
1825 
1826 tree
finish_asm_stmt(location_t loc,int volatile_p,tree string,tree output_operands,tree input_operands,tree clobbers,tree labels,bool inline_p)1827 finish_asm_stmt (location_t loc, int volatile_p, tree string,
1828                      tree output_operands, tree input_operands, tree clobbers,
1829                      tree labels, bool inline_p)
1830 {
1831   tree r;
1832   tree t;
1833   int ninputs = list_length (input_operands);
1834   int noutputs = list_length (output_operands);
1835 
1836   if (!processing_template_decl)
1837     {
1838       const char *constraint;
1839       const char **oconstraints;
1840       bool allows_mem, allows_reg, is_inout;
1841       tree operand;
1842       int i;
1843 
1844       oconstraints = XALLOCAVEC (const char *, noutputs);
1845 
1846       string = resolve_asm_operand_names (string, output_operands,
1847                                                     input_operands, labels);
1848 
1849       for (i = 0, t = output_operands; t; t = TREE_CHAIN (t), ++i)
1850           {
1851             operand = TREE_VALUE (t);
1852 
1853             /* ??? Really, this should not be here.  Users should be using a
1854                proper lvalue, dammit.  But there's a long history of using
1855                casts in the output operands.  In cases like longlong.h, this
1856                becomes a primitive form of typechecking -- if the cast can be
1857                removed, then the output operand had a type of the proper width;
1858                otherwise we'll get an error.  Gross, but ...  */
1859             STRIP_NOPS (operand);
1860 
1861             operand = mark_lvalue_use (operand);
1862 
1863             if (!lvalue_or_else (operand, lv_asm, tf_warning_or_error))
1864               operand = error_mark_node;
1865 
1866             if (operand != error_mark_node
1867                 && (TREE_READONLY (operand)
1868                       || CP_TYPE_CONST_P (TREE_TYPE (operand))
1869                       /* Functions are not modifiable, even though they are
1870                          lvalues.  */
1871                       || FUNC_OR_METHOD_TYPE_P (TREE_TYPE (operand))
1872                       /* If it's an aggregate and any field is const, then it is
1873                          effectively const.  */
1874                       || (CLASS_TYPE_P (TREE_TYPE (operand))
1875                           && C_TYPE_FIELDS_READONLY (TREE_TYPE (operand)))))
1876               cxx_readonly_error (loc, operand, lv_asm);
1877 
1878             tree *op = &operand;
1879             while (TREE_CODE (*op) == COMPOUND_EXPR)
1880               op = &TREE_OPERAND (*op, 1);
1881             switch (TREE_CODE (*op))
1882               {
1883               case PREINCREMENT_EXPR:
1884               case PREDECREMENT_EXPR:
1885               case MODIFY_EXPR:
1886                 *op = genericize_compound_lvalue (*op);
1887                 op = &TREE_OPERAND (*op, 1);
1888                 break;
1889               default:
1890                 break;
1891               }
1892 
1893             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
1894             oconstraints[i] = constraint;
1895 
1896             if (parse_output_constraint (&constraint, i, ninputs, noutputs,
1897                                                &allows_mem, &allows_reg, &is_inout))
1898               {
1899                 /* If the operand is going to end up in memory,
1900                      mark it addressable.  */
1901                 if (!allows_reg && !cxx_mark_addressable (*op))
1902                     operand = error_mark_node;
1903               }
1904             else
1905               operand = error_mark_node;
1906 
1907             TREE_VALUE (t) = operand;
1908           }
1909 
1910       for (i = 0, t = input_operands; t; ++i, t = TREE_CHAIN (t))
1911           {
1912             constraint = TREE_STRING_POINTER (TREE_VALUE (TREE_PURPOSE (t)));
1913             bool constraint_parsed
1914               = parse_input_constraint (&constraint, i, ninputs, noutputs, 0,
1915                                               oconstraints, &allows_mem, &allows_reg);
1916             /* If the operand is going to end up in memory, don't call
1917                decay_conversion.  */
1918             if (constraint_parsed && !allows_reg && allows_mem)
1919               operand = mark_lvalue_use (TREE_VALUE (t));
1920             else
1921               operand = decay_conversion (TREE_VALUE (t), tf_warning_or_error);
1922 
1923             /* If the type of the operand hasn't been determined (e.g.,
1924                because it involves an overloaded function), then issue
1925                an error message.  There's no context available to
1926                resolve the overloading.  */
1927             if (TREE_TYPE (operand) == unknown_type_node)
1928               {
1929                 error_at (loc,
1930                               "type of %<asm%> operand %qE could not be determined",
1931                               TREE_VALUE (t));
1932                 operand = error_mark_node;
1933               }
1934 
1935             if (constraint_parsed)
1936               {
1937                 /* If the operand is going to end up in memory,
1938                      mark it addressable.  */
1939                 if (!allows_reg && allows_mem)
1940                     {
1941                       /* Strip the nops as we allow this case.  FIXME, this really
1942                          should be rejected or made deprecated.  */
1943                       STRIP_NOPS (operand);
1944 
1945                       tree *op = &operand;
1946                       while (TREE_CODE (*op) == COMPOUND_EXPR)
1947                         op = &TREE_OPERAND (*op, 1);
1948                       switch (TREE_CODE (*op))
1949                         {
1950                         case PREINCREMENT_EXPR:
1951                         case PREDECREMENT_EXPR:
1952                         case MODIFY_EXPR:
1953                           *op = genericize_compound_lvalue (*op);
1954                           op = &TREE_OPERAND (*op, 1);
1955                           break;
1956                         default:
1957                           break;
1958                         }
1959 
1960                       if (!cxx_mark_addressable (*op))
1961                         operand = error_mark_node;
1962                     }
1963                 else if (!allows_reg && !allows_mem)
1964                     {
1965                       /* If constraint allows neither register nor memory,
1966                          try harder to get a constant.  */
1967                       tree constop = maybe_constant_value (operand);
1968                       if (TREE_CONSTANT (constop))
1969                         operand = constop;
1970                     }
1971               }
1972             else
1973               operand = error_mark_node;
1974 
1975             TREE_VALUE (t) = operand;
1976           }
1977     }
1978 
1979   r = build_stmt (loc, ASM_EXPR, string,
1980                       output_operands, input_operands,
1981                       clobbers, labels);
1982   ASM_VOLATILE_P (r) = volatile_p || noutputs == 0;
1983   ASM_INLINE_P (r) = inline_p;
1984   r = maybe_cleanup_point_expr_void (r);
1985   return add_stmt (r);
1986 }
1987 
1988 /* Finish a label with the indicated NAME.  Returns the new label.  */
1989 
1990 tree
finish_label_stmt(tree name)1991 finish_label_stmt (tree name)
1992 {
1993   tree decl = define_label (input_location, name);
1994 
1995   if (decl == error_mark_node)
1996     return error_mark_node;
1997 
1998   add_stmt (build_stmt (input_location, LABEL_EXPR, decl));
1999 
2000   return decl;
2001 }
2002 
2003 /* Finish a series of declarations for local labels.  G++ allows users
2004    to declare "local" labels, i.e., labels with scope.  This extension
2005    is useful when writing code involving statement-expressions.  */
2006 
2007 void
finish_label_decl(tree name)2008 finish_label_decl (tree name)
2009 {
2010   if (!at_function_scope_p ())
2011     {
2012       error ("%<__label__%> declarations are only allowed in function scopes");
2013       return;
2014     }
2015 
2016   add_decl_expr (declare_local_label (name));
2017 }
2018 
2019 /* When DECL goes out of scope, make sure that CLEANUP is executed.  */
2020 
2021 void
finish_decl_cleanup(tree decl,tree cleanup)2022 finish_decl_cleanup (tree decl, tree cleanup)
2023 {
2024   push_cleanup (decl, cleanup, false);
2025 }
2026 
2027 /* If the current scope exits with an exception, run CLEANUP.  */
2028 
2029 void
finish_eh_cleanup(tree cleanup)2030 finish_eh_cleanup (tree cleanup)
2031 {
2032   push_cleanup (NULL, cleanup, true);
2033 }
2034 
2035 /* The MEM_INITS is a list of mem-initializers, in reverse of the
2036    order they were written by the user.  Each node is as for
2037    emit_mem_initializers.  */
2038 
2039 void
finish_mem_initializers(tree mem_inits)2040 finish_mem_initializers (tree mem_inits)
2041 {
2042   /* Reorder the MEM_INITS so that they are in the order they appeared
2043      in the source program.  */
2044   mem_inits = nreverse (mem_inits);
2045 
2046   if (processing_template_decl)
2047     {
2048       tree mem;
2049 
2050       for (mem = mem_inits; mem; mem = TREE_CHAIN (mem))
2051         {
2052           /* If the TREE_PURPOSE is a TYPE_PACK_EXPANSION, skip the
2053              check for bare parameter packs in the TREE_VALUE, because
2054              any parameter packs in the TREE_VALUE have already been
2055              bound as part of the TREE_PURPOSE.  See
2056              make_pack_expansion for more information.  */
2057           if (TREE_CODE (TREE_PURPOSE (mem)) != TYPE_PACK_EXPANSION
2058               && check_for_bare_parameter_packs (TREE_VALUE (mem)))
2059             TREE_VALUE (mem) = error_mark_node;
2060         }
2061 
2062       add_stmt (build_min_nt_loc (UNKNOWN_LOCATION,
2063                                           CTOR_INITIALIZER, mem_inits));
2064     }
2065   else
2066     emit_mem_initializers (mem_inits);
2067 }
2068 
2069 /* Obfuscate EXPR if it looks like an id-expression or member access so
2070    that the call to finish_decltype in do_auto_deduction will give the
2071    right result.  If EVEN_UNEVAL, do this even in unevaluated context.  */
2072 
2073 tree
force_paren_expr(tree expr,bool even_uneval)2074 force_paren_expr (tree expr, bool even_uneval)
2075 {
2076   /* This is only needed for decltype(auto) in C++14.  */
2077   if (cxx_dialect < cxx14)
2078     return expr;
2079 
2080   /* If we're in unevaluated context, we can't be deducing a
2081      return/initializer type, so we don't need to mess with this.  */
2082   if (cp_unevaluated_operand && !even_uneval)
2083     return expr;
2084 
2085   if (TREE_CODE (expr) == COMPONENT_REF
2086       || TREE_CODE (expr) == SCOPE_REF
2087       || REFERENCE_REF_P (expr))
2088     REF_PARENTHESIZED_P (expr) = true;
2089   else if (DECL_P (tree_strip_any_location_wrapper (expr)))
2090     {
2091       location_t loc = cp_expr_location (expr);
2092       const tree_code code = processing_template_decl ? PAREN_EXPR
2093                                                                   : VIEW_CONVERT_EXPR;
2094       expr = build1_loc (loc, code, TREE_TYPE (expr), expr);
2095       REF_PARENTHESIZED_P (expr) = true;
2096     }
2097   return expr;
2098 }
2099 
2100 /* If T is an id-expression obfuscated by force_paren_expr, undo the
2101    obfuscation and return the underlying id-expression.  Otherwise
2102    return T.  */
2103 
2104 tree
maybe_undo_parenthesized_ref(tree t)2105 maybe_undo_parenthesized_ref (tree t)
2106 {
2107   if (cxx_dialect < cxx14)
2108     return t;
2109 
2110   if ((TREE_CODE (t) == PAREN_EXPR || TREE_CODE (t) == VIEW_CONVERT_EXPR)
2111       && REF_PARENTHESIZED_P (t))
2112     t = TREE_OPERAND (t, 0);
2113 
2114   return t;
2115 }
2116 
2117 /* Finish a parenthesized expression EXPR.  */
2118 
2119 cp_expr
finish_parenthesized_expr(cp_expr expr)2120 finish_parenthesized_expr (cp_expr expr)
2121 {
2122   if (EXPR_P (expr))
2123     /* This inhibits warnings in c_common_truthvalue_conversion.  */
2124     suppress_warning (expr, OPT_Wparentheses);
2125 
2126   if (TREE_CODE (expr) == OFFSET_REF
2127       || TREE_CODE (expr) == SCOPE_REF)
2128     /* [expr.unary.op]/3 The qualified id of a pointer-to-member must not be
2129        enclosed in parentheses.  */
2130     PTRMEM_OK_P (expr) = 0;
2131 
2132   tree stripped_expr = tree_strip_any_location_wrapper (expr);
2133   if (TREE_CODE (stripped_expr) == STRING_CST)
2134     PAREN_STRING_LITERAL_P (stripped_expr) = 1;
2135 
2136   expr = cp_expr (force_paren_expr (expr), expr.get_location ());
2137 
2138   return expr;
2139 }
2140 
2141 /* Finish a reference to a non-static data member (DECL) that is not
2142    preceded by `.' or `->'.  */
2143 
2144 tree
finish_non_static_data_member(tree decl,tree object,tree qualifying_scope)2145 finish_non_static_data_member (tree decl, tree object, tree qualifying_scope)
2146 {
2147   gcc_assert (TREE_CODE (decl) == FIELD_DECL);
2148   bool try_omp_private = !object && omp_private_member_map;
2149   tree ret;
2150 
2151   if (!object)
2152     {
2153       tree scope = qualifying_scope;
2154       if (scope == NULL_TREE)
2155           {
2156             scope = context_for_name_lookup (decl);
2157             if (!TYPE_P (scope))
2158               {
2159                 /* Can happen during error recovery (c++/85014).  */
2160                 gcc_assert (seen_error ());
2161                 return error_mark_node;
2162               }
2163           }
2164       object = maybe_dummy_object (scope, NULL);
2165     }
2166 
2167   object = maybe_resolve_dummy (object, true);
2168   if (object == error_mark_node)
2169     return error_mark_node;
2170 
2171   /* DR 613/850: Can use non-static data members without an associated
2172      object in sizeof/decltype/alignof.  */
2173   if (is_dummy_object (object) && cp_unevaluated_operand == 0
2174       && (!processing_template_decl || !current_class_ref))
2175     {
2176       if (current_function_decl
2177             && DECL_STATIC_FUNCTION_P (current_function_decl))
2178           error ("invalid use of member %qD in static member function", decl);
2179       else
2180           error ("invalid use of non-static data member %qD", decl);
2181       inform (DECL_SOURCE_LOCATION (decl), "declared here");
2182 
2183       return error_mark_node;
2184     }
2185 
2186   if (current_class_ptr)
2187     TREE_USED (current_class_ptr) = 1;
2188   if (processing_template_decl)
2189     {
2190       tree type = TREE_TYPE (decl);
2191 
2192       if (TYPE_REF_P (type))
2193           /* Quals on the object don't matter.  */;
2194       else if (PACK_EXPANSION_P (type))
2195           /* Don't bother trying to represent this.  */
2196           type = NULL_TREE;
2197       else
2198           {
2199             /* Set the cv qualifiers.  */
2200             int quals = cp_type_quals (TREE_TYPE (object));
2201 
2202             if (DECL_MUTABLE_P (decl))
2203               quals &= ~TYPE_QUAL_CONST;
2204 
2205             quals |= cp_type_quals (TREE_TYPE (decl));
2206             type = cp_build_qualified_type (type, quals);
2207           }
2208 
2209       if (qualifying_scope)
2210           /* Wrap this in a SCOPE_REF for now.  */
2211           ret = build_qualified_name (type, qualifying_scope, decl,
2212                                             /*template_p=*/false);
2213       else
2214           ret = (convert_from_reference
2215                  (build_min (COMPONENT_REF, type, object, decl, NULL_TREE)));
2216     }
2217   /* If PROCESSING_TEMPLATE_DECL is nonzero here, then
2218      QUALIFYING_SCOPE is also non-null.  */
2219   else
2220     {
2221       tree access_type = TREE_TYPE (object);
2222 
2223       perform_or_defer_access_check (TYPE_BINFO (access_type), decl,
2224                                              decl, tf_warning_or_error);
2225 
2226       /* If the data member was named `C::M', convert `*this' to `C'
2227            first.  */
2228       if (qualifying_scope)
2229           {
2230             tree binfo = NULL_TREE;
2231             object = build_scoped_ref (object, qualifying_scope,
2232                                              &binfo);
2233           }
2234 
2235       ret = build_class_member_access_expr (object, decl,
2236                                                       /*access_path=*/NULL_TREE,
2237                                                       /*preserve_reference=*/false,
2238                                                       tf_warning_or_error);
2239     }
2240   if (try_omp_private)
2241     {
2242       tree *v = omp_private_member_map->get (decl);
2243       if (v)
2244           ret = convert_from_reference (*v);
2245     }
2246   return ret;
2247 }
2248 
2249 /* DECL was the declaration to which a qualified-id resolved.  Issue
2250    an error message if it is not accessible.  If OBJECT_TYPE is
2251    non-NULL, we have just seen `x->' or `x.' and OBJECT_TYPE is the
2252    type of `*x', or `x', respectively.  If the DECL was named as
2253    `A::B' then NESTED_NAME_SPECIFIER is `A'.  Return value is like
2254    perform_access_checks above.  */
2255 
2256 bool
check_accessibility_of_qualified_id(tree decl,tree object_type,tree nested_name_specifier,tsubst_flags_t complain)2257 check_accessibility_of_qualified_id (tree decl,
2258                                              tree object_type,
2259                                              tree nested_name_specifier,
2260                                              tsubst_flags_t complain)
2261 {
2262   /* If we're not checking, return immediately.  */
2263   if (deferred_access_no_check)
2264     return true;
2265 
2266   /* Determine the SCOPE of DECL.  */
2267   tree scope = context_for_name_lookup (decl);
2268   /* If the SCOPE is not a type, then DECL is not a member.  */
2269   if (!TYPE_P (scope)
2270       /* If SCOPE is dependent then we can't perform this access check now,
2271            and since we'll perform this access check again after substitution
2272            there's no need to explicitly defer it.  */
2273       || dependent_type_p (scope))
2274     return true;
2275 
2276   tree qualifying_type = NULL_TREE;
2277   /* Compute the scope through which DECL is being accessed.  */
2278   if (object_type
2279       /* OBJECT_TYPE might not be a class type; consider:
2280 
2281              class A { typedef int I; };
2282              I *p;
2283              p->A::I::~I();
2284 
2285            In this case, we will have "A::I" as the DECL, but "I" as the
2286            OBJECT_TYPE.  */
2287       && CLASS_TYPE_P (object_type)
2288       && DERIVED_FROM_P (scope, object_type))
2289     /* If we are processing a `->' or `.' expression, use the type of the
2290        left-hand side.  */
2291     qualifying_type = object_type;
2292   else if (nested_name_specifier)
2293     {
2294       /* If the reference is to a non-static member of the
2295            current class, treat it as if it were referenced through
2296            `this'.  */
2297       if (DECL_NONSTATIC_MEMBER_P (decl)
2298             && current_class_ptr)
2299           if (tree current = current_nonlambda_class_type ())
2300             {
2301               if (dependent_type_p (current))
2302               /* In general we can't know whether this access goes through
2303                  `this' until instantiation time.  Punt now, or else we might
2304                  create a deferred access check that's not relative to `this'
2305                  when it ought to be.  We'll check this access again after
2306                  substitution, e.g. from tsubst_qualified_id.  */
2307                 return true;
2308 
2309               if (DERIVED_FROM_P (scope, current))
2310                 qualifying_type = current;
2311             }
2312       /* Otherwise, use the type indicated by the
2313            nested-name-specifier.  */
2314       if (!qualifying_type)
2315           qualifying_type = nested_name_specifier;
2316     }
2317   else
2318     /* Otherwise, the name must be from the current class or one of
2319        its bases.  */
2320     qualifying_type = currently_open_derived_class (scope);
2321 
2322   if (qualifying_type
2323       /* It is possible for qualifying type to be a TEMPLATE_TYPE_PARM
2324            or similar in a default argument value.  */
2325       && CLASS_TYPE_P (qualifying_type))
2326     return perform_or_defer_access_check (TYPE_BINFO (qualifying_type), decl,
2327                                                     decl, complain);
2328 
2329   return true;
2330 }
2331 
2332 /* EXPR is the result of a qualified-id.  The QUALIFYING_CLASS was the
2333    class named to the left of the "::" operator.  DONE is true if this
2334    expression is a complete postfix-expression; it is false if this
2335    expression is followed by '->', '[', '(', etc.  ADDRESS_P is true
2336    iff this expression is the operand of '&'.  TEMPLATE_P is true iff
2337    the qualified-id was of the form "A::template B".  TEMPLATE_ARG_P
2338    is true iff this qualified name appears as a template argument.  */
2339 
2340 tree
finish_qualified_id_expr(tree qualifying_class,tree expr,bool done,bool address_p,bool template_p,bool template_arg_p,tsubst_flags_t complain)2341 finish_qualified_id_expr (tree qualifying_class,
2342                                 tree expr,
2343                                 bool done,
2344                                 bool address_p,
2345                                 bool template_p,
2346                                 bool template_arg_p,
2347                                 tsubst_flags_t complain)
2348 {
2349   gcc_assert (TYPE_P (qualifying_class));
2350 
2351   if (error_operand_p (expr))
2352     return error_mark_node;
2353 
2354   if (DECL_P (expr)
2355       /* Functions are marked after overload resolution; avoid redundant
2356            warnings.  */
2357       && TREE_CODE (expr) != FUNCTION_DECL
2358       && !mark_used (expr, complain))
2359     return error_mark_node;
2360 
2361   if (template_p)
2362     {
2363       if (TREE_CODE (expr) == UNBOUND_CLASS_TEMPLATE)
2364           {
2365             /* cp_parser_lookup_name thought we were looking for a type,
2366                but we're actually looking for a declaration.  */
2367             qualifying_class = TYPE_CONTEXT (expr);
2368             expr = TYPE_IDENTIFIER (expr);
2369           }
2370       else
2371           check_template_keyword (expr);
2372     }
2373 
2374   /* If EXPR occurs as the operand of '&', use special handling that
2375      permits a pointer-to-member.  */
2376   if (address_p && done
2377       && TREE_CODE (qualifying_class) != ENUMERAL_TYPE)
2378     {
2379       if (TREE_CODE (expr) == SCOPE_REF)
2380           expr = TREE_OPERAND (expr, 1);
2381       expr = build_offset_ref (qualifying_class, expr,
2382                                      /*address_p=*/true, complain);
2383       return expr;
2384     }
2385 
2386   /* No need to check access within an enum.  */
2387   if (TREE_CODE (qualifying_class) == ENUMERAL_TYPE
2388       && TREE_CODE (expr) != IDENTIFIER_NODE)
2389     return expr;
2390 
2391   /* Within the scope of a class, turn references to non-static
2392      members into expression of the form "this->...".  */
2393   if (template_arg_p)
2394     /* But, within a template argument, we do not want make the
2395        transformation, as there is no "this" pointer.  */
2396     ;
2397   else if (TREE_CODE (expr) == FIELD_DECL)
2398     {
2399       push_deferring_access_checks (dk_no_check);
2400       expr = finish_non_static_data_member (expr, NULL_TREE,
2401                                                       qualifying_class);
2402       pop_deferring_access_checks ();
2403     }
2404   else if (BASELINK_P (expr))
2405     {
2406       /* See if any of the functions are non-static members.  */
2407       /* If so, the expression may be relative to 'this'.  */
2408       if (!shared_member_p (expr)
2409             && current_class_ptr
2410             && DERIVED_FROM_P (qualifying_class,
2411                                    current_nonlambda_class_type ()))
2412           expr = (build_class_member_access_expr
2413                     (maybe_dummy_object (qualifying_class, NULL),
2414                      expr,
2415                      BASELINK_ACCESS_BINFO (expr),
2416                      /*preserve_reference=*/false,
2417                      complain));
2418       else if (done)
2419           /* The expression is a qualified name whose address is not
2420              being taken.  */
2421           expr = build_offset_ref (qualifying_class, expr, /*address_p=*/false,
2422                                          complain);
2423     }
2424   else if (!template_p
2425              && TREE_CODE (expr) == TEMPLATE_DECL
2426              && !DECL_FUNCTION_TEMPLATE_P (expr))
2427     {
2428       if (complain & tf_error)
2429           error ("%qE missing template arguments", expr);
2430       return error_mark_node;
2431     }
2432   else
2433     {
2434       /* In a template, return a SCOPE_REF for most qualified-ids
2435            so that we can check access at instantiation time.  But if
2436            we're looking at a member of the current instantiation, we
2437            know we have access and building up the SCOPE_REF confuses
2438            non-type template argument handling.  */
2439       if (processing_template_decl
2440             && (!currently_open_class (qualifying_class)
2441                 || TREE_CODE (expr) == IDENTIFIER_NODE
2442                 || TREE_CODE (expr) == TEMPLATE_ID_EXPR
2443                 || TREE_CODE (expr) == BIT_NOT_EXPR))
2444           expr = build_qualified_name (TREE_TYPE (expr),
2445                                              qualifying_class, expr,
2446                                              template_p);
2447       else if (tree wrap = maybe_get_tls_wrapper_call (expr))
2448           expr = wrap;
2449 
2450       expr = convert_from_reference (expr);
2451     }
2452 
2453   return expr;
2454 }
2455 
2456 /* Begin a statement-expression.  The value returned must be passed to
2457    finish_stmt_expr.  */
2458 
2459 tree
begin_stmt_expr(void)2460 begin_stmt_expr (void)
2461 {
2462   return push_stmt_list ();
2463 }
2464 
2465 /* Process the final expression of a statement expression. EXPR can be
2466    NULL, if the final expression is empty.  Return a STATEMENT_LIST
2467    containing all the statements in the statement-expression, or
2468    ERROR_MARK_NODE if there was an error.  */
2469 
2470 tree
finish_stmt_expr_expr(tree expr,tree stmt_expr)2471 finish_stmt_expr_expr (tree expr, tree stmt_expr)
2472 {
2473   if (error_operand_p (expr))
2474     {
2475       /* The type of the statement-expression is the type of the last
2476          expression.  */
2477       TREE_TYPE (stmt_expr) = error_mark_node;
2478       return error_mark_node;
2479     }
2480 
2481   /* If the last statement does not have "void" type, then the value
2482      of the last statement is the value of the entire expression.  */
2483   if (expr)
2484     {
2485       tree type = TREE_TYPE (expr);
2486 
2487       if (type && type_unknown_p (type))
2488           {
2489             error ("a statement expression is an insufficient context"
2490                      " for overload resolution");
2491             TREE_TYPE (stmt_expr) = error_mark_node;
2492             return error_mark_node;
2493           }
2494       else if (processing_template_decl)
2495           {
2496             expr = build_stmt (input_location, EXPR_STMT, expr);
2497             expr = add_stmt (expr);
2498             /* Mark the last statement so that we can recognize it as such at
2499                template-instantiation time.  */
2500             EXPR_STMT_STMT_EXPR_RESULT (expr) = 1;
2501           }
2502       else if (VOID_TYPE_P (type))
2503           {
2504             /* Just treat this like an ordinary statement.  */
2505             expr = finish_expr_stmt (expr);
2506           }
2507       else
2508           {
2509             /* It actually has a value we need to deal with.  First, force it
2510                to be an rvalue so that we won't need to build up a copy
2511                constructor call later when we try to assign it to something.  */
2512             expr = force_rvalue (expr, tf_warning_or_error);
2513             if (error_operand_p (expr))
2514               return error_mark_node;
2515 
2516             /* Update for array-to-pointer decay.  */
2517             type = TREE_TYPE (expr);
2518 
2519             /* Wrap it in a CLEANUP_POINT_EXPR and add it to the list like a
2520                normal statement, but don't convert to void or actually add
2521                the EXPR_STMT.  */
2522             if (TREE_CODE (expr) != CLEANUP_POINT_EXPR)
2523               expr = maybe_cleanup_point_expr (expr);
2524             add_stmt (expr);
2525           }
2526 
2527       /* The type of the statement-expression is the type of the last
2528            expression.  */
2529       TREE_TYPE (stmt_expr) = type;
2530     }
2531 
2532   return stmt_expr;
2533 }
2534 
2535 /* Finish a statement-expression.  EXPR should be the value returned
2536    by the previous begin_stmt_expr.  Returns an expression
2537    representing the statement-expression.  */
2538 
2539 tree
finish_stmt_expr(tree stmt_expr,bool has_no_scope)2540 finish_stmt_expr (tree stmt_expr, bool has_no_scope)
2541 {
2542   tree type;
2543   tree result;
2544 
2545   if (error_operand_p (stmt_expr))
2546     {
2547       pop_stmt_list (stmt_expr);
2548       return error_mark_node;
2549     }
2550 
2551   gcc_assert (TREE_CODE (stmt_expr) == STATEMENT_LIST);
2552 
2553   type = TREE_TYPE (stmt_expr);
2554   result = pop_stmt_list (stmt_expr);
2555   TREE_TYPE (result) = type;
2556 
2557   if (processing_template_decl)
2558     {
2559       result = build_min (STMT_EXPR, type, result);
2560       TREE_SIDE_EFFECTS (result) = 1;
2561       STMT_EXPR_NO_SCOPE (result) = has_no_scope;
2562     }
2563   else if (CLASS_TYPE_P (type))
2564     {
2565       /* Wrap the statement-expression in a TARGET_EXPR so that the
2566            temporary object created by the final expression is destroyed at
2567            the end of the full-expression containing the
2568            statement-expression.  */
2569       result = force_target_expr (type, result, tf_warning_or_error);
2570     }
2571 
2572   return result;
2573 }
2574 
2575 /* Returns the expression which provides the value of STMT_EXPR.  */
2576 
2577 tree
stmt_expr_value_expr(tree stmt_expr)2578 stmt_expr_value_expr (tree stmt_expr)
2579 {
2580   tree t = STMT_EXPR_STMT (stmt_expr);
2581 
2582   if (TREE_CODE (t) == BIND_EXPR)
2583     t = BIND_EXPR_BODY (t);
2584 
2585   if (TREE_CODE (t) == STATEMENT_LIST && STATEMENT_LIST_TAIL (t))
2586     t = STATEMENT_LIST_TAIL (t)->stmt;
2587 
2588   if (TREE_CODE (t) == EXPR_STMT)
2589     t = EXPR_STMT_EXPR (t);
2590 
2591   return t;
2592 }
2593 
2594 /* Return TRUE iff EXPR_STMT is an empty list of
2595    expression statements.  */
2596 
2597 bool
empty_expr_stmt_p(tree expr_stmt)2598 empty_expr_stmt_p (tree expr_stmt)
2599 {
2600   tree body = NULL_TREE;
2601 
2602   if (expr_stmt == void_node)
2603     return true;
2604 
2605   if (expr_stmt)
2606     {
2607       if (TREE_CODE (expr_stmt) == EXPR_STMT)
2608           body = EXPR_STMT_EXPR (expr_stmt);
2609       else if (TREE_CODE (expr_stmt) == STATEMENT_LIST)
2610           body = expr_stmt;
2611     }
2612 
2613   if (body)
2614     {
2615       if (TREE_CODE (body) == STATEMENT_LIST)
2616           return tsi_end_p (tsi_start (body));
2617       else
2618           return empty_expr_stmt_p (body);
2619     }
2620   return false;
2621 }
2622 
2623 /* Perform Koenig lookup.  FN_EXPR is the postfix-expression representing
2624    the function (or functions) to call; ARGS are the arguments to the
2625    call.  Returns the functions to be considered by overload resolution.  */
2626 
2627 cp_expr
perform_koenig_lookup(cp_expr fn_expr,vec<tree,va_gc> * args,tsubst_flags_t complain)2628 perform_koenig_lookup (cp_expr fn_expr, vec<tree, va_gc> *args,
2629                            tsubst_flags_t complain)
2630 {
2631   tree identifier = NULL_TREE;
2632   tree functions = NULL_TREE;
2633   tree tmpl_args = NULL_TREE;
2634   bool template_id = false;
2635   location_t loc = fn_expr.get_location ();
2636   tree fn = fn_expr.get_value ();
2637 
2638   STRIP_ANY_LOCATION_WRAPPER (fn);
2639 
2640   if (TREE_CODE (fn) == TEMPLATE_ID_EXPR)
2641     {
2642       /* Use a separate flag to handle null args.  */
2643       template_id = true;
2644       tmpl_args = TREE_OPERAND (fn, 1);
2645       fn = TREE_OPERAND (fn, 0);
2646     }
2647 
2648   /* Find the name of the overloaded function.  */
2649   if (identifier_p (fn))
2650     identifier = fn;
2651   else
2652     {
2653       functions = fn;
2654       identifier = OVL_NAME (functions);
2655     }
2656 
2657   /* A call to a namespace-scope function using an unqualified name.
2658 
2659      Do Koenig lookup -- unless any of the arguments are
2660      type-dependent.  */
2661   if (!any_type_dependent_arguments_p (args)
2662       && !any_dependent_template_arguments_p (tmpl_args))
2663     {
2664       fn = lookup_arg_dependent (identifier, functions, args);
2665       if (!fn)
2666           {
2667             /* The unqualified name could not be resolved.  */
2668             if (complain & tf_error)
2669               fn = unqualified_fn_lookup_error (cp_expr (identifier, loc));
2670             else
2671               fn = identifier;
2672           }
2673     }
2674 
2675   if (fn && template_id && fn != error_mark_node)
2676     fn = build2 (TEMPLATE_ID_EXPR, unknown_type_node, fn, tmpl_args);
2677 
2678   return cp_expr (fn, loc);
2679 }
2680 
2681 /* Generate an expression for `FN (ARGS)'.  This may change the
2682    contents of ARGS.
2683 
2684    If DISALLOW_VIRTUAL is true, the call to FN will be not generated
2685    as a virtual call, even if FN is virtual.  (This flag is set when
2686    encountering an expression where the function name is explicitly
2687    qualified.  For example a call to `X::f' never generates a virtual
2688    call.)
2689 
2690    Returns code for the call.  */
2691 
2692 tree
finish_call_expr(tree fn,vec<tree,va_gc> ** args,bool disallow_virtual,bool koenig_p,tsubst_flags_t complain)2693 finish_call_expr (tree fn, vec<tree, va_gc> **args, bool disallow_virtual,
2694                       bool koenig_p, tsubst_flags_t complain)
2695 {
2696   tree result;
2697   tree orig_fn;
2698   vec<tree, va_gc> *orig_args = *args;
2699 
2700   if (fn == error_mark_node)
2701     return error_mark_node;
2702 
2703   gcc_assert (!TYPE_P (fn));
2704 
2705   /* If FN may be a FUNCTION_DECL obfuscated by force_paren_expr, undo
2706      it so that we can tell this is a call to a known function.  */
2707   fn = maybe_undo_parenthesized_ref (fn);
2708 
2709   STRIP_ANY_LOCATION_WRAPPER (fn);
2710 
2711   orig_fn = fn;
2712 
2713   if (processing_template_decl)
2714     {
2715       /* If FN is a local extern declaration (or set thereof) in a template,
2716            look it up again at instantiation time.  */
2717       if (is_overloaded_fn (fn))
2718           {
2719             tree ifn = get_first_fn (fn);
2720             if (TREE_CODE (ifn) == FUNCTION_DECL
2721                 && dependent_local_decl_p (ifn))
2722               orig_fn = DECL_NAME (ifn);
2723           }
2724 
2725       /* If the call expression is dependent, build a CALL_EXPR node
2726            with no type; type_dependent_expression_p recognizes
2727            expressions with no type as being dependent.  */
2728       if (type_dependent_expression_p (fn)
2729             || any_type_dependent_arguments_p (*args))
2730           {
2731             result = build_min_nt_call_vec (orig_fn, *args);
2732             SET_EXPR_LOCATION (result, cp_expr_loc_or_input_loc (fn));
2733             KOENIG_LOOKUP_P (result) = koenig_p;
2734             if (is_overloaded_fn (fn))
2735               fn = get_fns (fn);
2736 
2737             if (cfun)
2738               {
2739                 bool abnormal = true;
2740                 for (lkp_iterator iter (fn); abnormal && iter; ++iter)
2741                     {
2742                       tree fndecl = STRIP_TEMPLATE (*iter);
2743                       if (TREE_CODE (fndecl) != FUNCTION_DECL
2744                           || !TREE_THIS_VOLATILE (fndecl))
2745                         abnormal = false;
2746                     }
2747                 /* FIXME: Stop warning about falling off end of non-void
2748                      function.   But this is wrong.  Even if we only see
2749                      no-return fns at this point, we could select a
2750                      future-defined return fn during instantiation.  Or
2751                      vice-versa.  */
2752                 if (abnormal)
2753                     current_function_returns_abnormally = 1;
2754               }
2755             return result;
2756           }
2757       orig_args = make_tree_vector_copy (*args);
2758       if (!BASELINK_P (fn)
2759             && TREE_CODE (fn) != PSEUDO_DTOR_EXPR
2760             && TREE_TYPE (fn) != unknown_type_node)
2761           fn = build_non_dependent_expr (fn);
2762       make_args_non_dependent (*args);
2763     }
2764 
2765   if (TREE_CODE (fn) == COMPONENT_REF)
2766     {
2767       tree member = TREE_OPERAND (fn, 1);
2768       if (BASELINK_P (member))
2769           {
2770             tree object = TREE_OPERAND (fn, 0);
2771             return build_new_method_call (object, member,
2772                                                   args, NULL_TREE,
2773                                         (disallow_virtual
2774                                          ? LOOKUP_NORMAL | LOOKUP_NONVIRTUAL
2775                                                    : LOOKUP_NORMAL),
2776                                                   /*fn_p=*/NULL,
2777                                                   complain);
2778           }
2779     }
2780 
2781   /* Per 13.3.1.1, '(&f)(...)' is the same as '(f)(...)'.  */
2782   if (TREE_CODE (fn) == ADDR_EXPR
2783       && TREE_CODE (TREE_OPERAND (fn, 0)) == OVERLOAD)
2784     fn = TREE_OPERAND (fn, 0);
2785 
2786   if (is_overloaded_fn (fn))
2787     fn = baselink_for_fns (fn);
2788 
2789   result = NULL_TREE;
2790   if (BASELINK_P (fn))
2791     {
2792       tree object;
2793 
2794       /* A call to a member function.  From [over.call.func]:
2795 
2796              If the keyword this is in scope and refers to the class of
2797              that member function, or a derived class thereof, then the
2798              function call is transformed into a qualified function call
2799              using (*this) as the postfix-expression to the left of the
2800              . operator.... [Otherwise] a contrived object of type T
2801              becomes the implied object argument.
2802 
2803           In this situation:
2804 
2805             struct A { void f(); };
2806             struct B : public A {};
2807             struct C : public A { void g() { B::f(); }};
2808 
2809           "the class of that member function" refers to `A'.  But 11.2
2810           [class.access.base] says that we need to convert 'this' to B* as
2811           part of the access, so we pass 'B' to maybe_dummy_object.  */
2812 
2813       if (DECL_MAYBE_IN_CHARGE_CONSTRUCTOR_P (get_first_fn (fn)))
2814           {
2815             /* A constructor call always uses a dummy object.  (This constructor
2816                call which has the form A::A () is actually invalid and we are
2817                going to reject it later in build_new_method_call.)  */
2818             object = build_dummy_object (BINFO_TYPE (BASELINK_ACCESS_BINFO (fn)));
2819           }
2820       else
2821           object = maybe_dummy_object (BINFO_TYPE (BASELINK_ACCESS_BINFO (fn)),
2822                                              NULL);
2823 
2824       result = build_new_method_call (object, fn, args, NULL_TREE,
2825                                               (disallow_virtual
2826                                                ? LOOKUP_NORMAL|LOOKUP_NONVIRTUAL
2827                                                : LOOKUP_NORMAL),
2828                                               /*fn_p=*/NULL,
2829                                               complain);
2830     }
2831   else if (concept_check_p (fn))
2832     {
2833       /* FN is actually a template-id referring to a concept definition.  */
2834       tree id = unpack_concept_check (fn);
2835       tree tmpl = TREE_OPERAND (id, 0);
2836       tree args = TREE_OPERAND (id, 1);
2837 
2838       if (!function_concept_p (tmpl))
2839           {
2840             error_at (EXPR_LOC_OR_LOC (fn, input_location),
2841                         "cannot call a concept as a function");
2842             return error_mark_node;
2843           }
2844 
2845       /* Ensure the result is wrapped as a call expression.  */
2846       result = build_concept_check (tmpl, args, tf_warning_or_error);
2847     }
2848   else if (is_overloaded_fn (fn))
2849     {
2850       /* If the function is an overloaded builtin, resolve it.  */
2851       if (TREE_CODE (fn) == FUNCTION_DECL
2852             && (DECL_BUILT_IN_CLASS (fn) == BUILT_IN_NORMAL
2853                 || DECL_BUILT_IN_CLASS (fn) == BUILT_IN_MD))
2854           result = resolve_overloaded_builtin (input_location, fn, *args);
2855 
2856       if (!result)
2857           {
2858             if (warn_sizeof_pointer_memaccess
2859                 && (complain & tf_warning)
2860                 && !vec_safe_is_empty (*args)
2861                 && !processing_template_decl)
2862               {
2863                 location_t sizeof_arg_loc[3];
2864                 tree sizeof_arg[3];
2865                 unsigned int i;
2866                 for (i = 0; i < 3; i++)
2867                     {
2868                       tree t;
2869 
2870                       sizeof_arg_loc[i] = UNKNOWN_LOCATION;
2871                       sizeof_arg[i] = NULL_TREE;
2872                       if (i >= (*args)->length ())
2873                         continue;
2874                       t = (**args)[i];
2875                       if (TREE_CODE (t) != SIZEOF_EXPR)
2876                         continue;
2877                       if (SIZEOF_EXPR_TYPE_P (t))
2878                         sizeof_arg[i] = TREE_TYPE (TREE_OPERAND (t, 0));
2879                       else
2880                         sizeof_arg[i] = TREE_OPERAND (t, 0);
2881                       sizeof_arg_loc[i] = EXPR_LOCATION (t);
2882                     }
2883                 sizeof_pointer_memaccess_warning
2884                     (sizeof_arg_loc, fn, *args,
2885                      sizeof_arg, same_type_ignoring_top_level_qualifiers_p);
2886               }
2887 
2888             if ((complain & tf_warning)
2889                 && TREE_CODE (fn) == FUNCTION_DECL
2890                 && fndecl_built_in_p (fn, BUILT_IN_MEMSET)
2891                 && vec_safe_length (*args) == 3
2892                 && !any_type_dependent_arguments_p (*args))
2893               {
2894                 tree arg0 = (*orig_args)[0];
2895                 tree arg1 = (*orig_args)[1];
2896                 tree arg2 = (*orig_args)[2];
2897                 int literal_mask = ((literal_integer_zerop (arg1) << 1)
2898                                           | (literal_integer_zerop (arg2) << 2));
2899                 warn_for_memset (input_location, arg0, arg2, literal_mask);
2900               }
2901 
2902             /* A call to a namespace-scope function.  */
2903             result = build_new_function_call (fn, args, complain);
2904           }
2905     }
2906   else if (TREE_CODE (fn) == PSEUDO_DTOR_EXPR)
2907     {
2908       if (!vec_safe_is_empty (*args))
2909           error ("arguments to destructor are not allowed");
2910       /* C++20/DR: If the postfix-expression names a pseudo-destructor (in
2911            which case the postfix-expression is a possibly-parenthesized class
2912            member access), the function call destroys the object of scalar type
2913            denoted by the object expression of the class member access.  */
2914       tree ob = TREE_OPERAND (fn, 0);
2915       if (obvalue_p (ob))
2916           result = build_trivial_dtor_call (ob, true);
2917       else
2918           /* No location to clobber.  */
2919           result = convert_to_void (ob, ICV_STATEMENT, complain);
2920     }
2921   else if (CLASS_TYPE_P (TREE_TYPE (fn)))
2922     /* If the "function" is really an object of class type, it might
2923        have an overloaded `operator ()'.  */
2924     result = build_op_call (fn, args, complain);
2925 
2926   if (!result)
2927     /* A call where the function is unknown.  */
2928     result = cp_build_function_call_vec (fn, args, complain);
2929 
2930   if (processing_template_decl && result != error_mark_node)
2931     {
2932       if (INDIRECT_REF_P (result))
2933           result = TREE_OPERAND (result, 0);
2934 
2935       /* Prune all but the selected function from the original overload
2936            set so that we can avoid some duplicate work at instantiation time.  */
2937       if (TREE_CODE (result) == CALL_EXPR
2938             && really_overloaded_fn (orig_fn))
2939           {
2940             tree sel_fn = CALL_EXPR_FN (result);
2941             if (TREE_CODE (sel_fn) == COMPONENT_REF)
2942               {
2943                 /* The non-dependent result of build_new_method_call.  */
2944                 sel_fn = TREE_OPERAND (sel_fn, 1);
2945                 gcc_assert (BASELINK_P (sel_fn));
2946               }
2947             else if (TREE_CODE (sel_fn) == ADDR_EXPR)
2948               /* Our original callee wasn't wrapped in an ADDR_EXPR,
2949                  so strip this ADDR_EXPR added by build_over_call.  */
2950               sel_fn = TREE_OPERAND (sel_fn, 0);
2951             orig_fn = sel_fn;
2952           }
2953 
2954       result = build_call_vec (TREE_TYPE (result), orig_fn, orig_args);
2955       SET_EXPR_LOCATION (result, input_location);
2956       KOENIG_LOOKUP_P (result) = koenig_p;
2957       release_tree_vector (orig_args);
2958       result = convert_from_reference (result);
2959     }
2960 
2961   return result;
2962 }
2963 
2964 /* Finish a call to a postfix increment or decrement or EXPR.  (Which
2965    is indicated by CODE, which should be POSTINCREMENT_EXPR or
2966    POSTDECREMENT_EXPR.)  */
2967 
2968 cp_expr
finish_increment_expr(cp_expr expr,enum tree_code code)2969 finish_increment_expr (cp_expr expr, enum tree_code code)
2970 {
2971   /* input_location holds the location of the trailing operator token.
2972      Build a location of the form:
2973        expr++
2974        ~~~~^~
2975      with the caret at the operator token, ranging from the start
2976      of EXPR to the end of the operator token.  */
2977   location_t combined_loc = make_location (input_location,
2978                                                      expr.get_start (),
2979                                                      get_finish (input_location));
2980   cp_expr result = build_x_unary_op (combined_loc, code, expr,
2981                                              NULL_TREE, tf_warning_or_error);
2982   /* TODO: build_x_unary_op doesn't honor the location, so set it here.  */
2983   result.set_location (combined_loc);
2984   return result;
2985 }
2986 
2987 /* Finish a use of `this'.  Returns an expression for `this'.  */
2988 
2989 tree
finish_this_expr(void)2990 finish_this_expr (void)
2991 {
2992   tree result = NULL_TREE;
2993 
2994   if (current_class_ptr)
2995     {
2996       tree type = TREE_TYPE (current_class_ref);
2997 
2998       /* In a lambda expression, 'this' refers to the captured 'this'.  */
2999       if (LAMBDA_TYPE_P (type))
3000         result = lambda_expr_this_capture (CLASSTYPE_LAMBDA_EXPR (type), true);
3001       else
3002         result = current_class_ptr;
3003     }
3004 
3005   if (result)
3006     /* The keyword 'this' is a prvalue expression.  */
3007     return rvalue (result);
3008 
3009   tree fn = current_nonlambda_function ();
3010   if (fn && DECL_STATIC_FUNCTION_P (fn))
3011     error ("%<this%> is unavailable for static member functions");
3012   else if (fn)
3013     error ("invalid use of %<this%> in non-member function");
3014   else
3015     error ("invalid use of %<this%> at top level");
3016   return error_mark_node;
3017 }
3018 
3019 /* Finish a pseudo-destructor expression.  If SCOPE is NULL, the
3020    expression was of the form `OBJECT.~DESTRUCTOR' where DESTRUCTOR is
3021    the TYPE for the type given.  If SCOPE is non-NULL, the expression
3022    was of the form `OBJECT.SCOPE::~DESTRUCTOR'.  */
3023 
3024 tree
finish_pseudo_destructor_expr(tree object,tree scope,tree destructor,location_t loc)3025 finish_pseudo_destructor_expr (tree object, tree scope, tree destructor,
3026                                      location_t loc)
3027 {
3028   if (object == error_mark_node || destructor == error_mark_node)
3029     return error_mark_node;
3030 
3031   gcc_assert (TYPE_P (destructor));
3032 
3033   if (!processing_template_decl)
3034     {
3035       if (scope == error_mark_node)
3036           {
3037             error_at (loc, "invalid qualifying scope in pseudo-destructor name");
3038             return error_mark_node;
3039           }
3040       if (is_auto (destructor))
3041           destructor = TREE_TYPE (object);
3042       if (scope && TYPE_P (scope) && !check_dtor_name (scope, destructor))
3043           {
3044             error_at (loc,
3045                         "qualified type %qT does not match destructor name ~%qT",
3046                         scope, destructor);
3047             return error_mark_node;
3048           }
3049 
3050 
3051       /* [expr.pseudo] says both:
3052 
3053              The type designated by the pseudo-destructor-name shall be
3054              the same as the object type.
3055 
3056            and:
3057 
3058              The cv-unqualified versions of the object type and of the
3059              type designated by the pseudo-destructor-name shall be the
3060              same type.
3061 
3062            We implement the more generous second sentence, since that is
3063            what most other compilers do.  */
3064       if (!same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (object),
3065                                                                   destructor))
3066           {
3067             error_at (loc, "%qE is not of type %qT", object, destructor);
3068             return error_mark_node;
3069           }
3070     }
3071 
3072   tree type = (type_dependent_expression_p (object)
3073                  ? NULL_TREE : void_type_node);
3074 
3075   return build3_loc (loc, PSEUDO_DTOR_EXPR, type, object,
3076                          scope, destructor);
3077 }
3078 
3079 /* Finish an expression of the form CODE EXPR.  */
3080 
3081 cp_expr
finish_unary_op_expr(location_t op_loc,enum tree_code code,cp_expr expr,tsubst_flags_t complain)3082 finish_unary_op_expr (location_t op_loc, enum tree_code code, cp_expr expr,
3083                           tsubst_flags_t complain)
3084 {
3085   /* Build a location of the form:
3086        ++expr
3087        ^~~~~~
3088      with the caret at the operator token, ranging from the start
3089      of the operator token to the end of EXPR.  */
3090   location_t combined_loc = make_location (op_loc,
3091                                                      op_loc, expr.get_finish ());
3092   cp_expr result = build_x_unary_op (combined_loc, code, expr,
3093                                              NULL_TREE, complain);
3094   /* TODO: build_x_unary_op doesn't always honor the location.  */
3095   result.set_location (combined_loc);
3096 
3097   if (result == error_mark_node)
3098     return result;
3099 
3100   if (!(complain & tf_warning))
3101     return result;
3102 
3103   tree result_ovl = result;
3104   tree expr_ovl = expr;
3105 
3106   if (!processing_template_decl)
3107     expr_ovl = cp_fully_fold (expr_ovl);
3108 
3109   if (!CONSTANT_CLASS_P (expr_ovl)
3110       || TREE_OVERFLOW_P (expr_ovl))
3111     return result;
3112 
3113   if (!processing_template_decl)
3114     result_ovl = cp_fully_fold (result_ovl);
3115 
3116   if (CONSTANT_CLASS_P (result_ovl) && TREE_OVERFLOW_P (result_ovl))
3117     overflow_warning (combined_loc, result_ovl);
3118 
3119   return result;
3120 }
3121 
3122 /* Return true if CONSTRUCTOR EXPR after pack expansion could have no
3123    elements.  */
3124 
3125 static bool
maybe_zero_constructor_nelts(tree expr)3126 maybe_zero_constructor_nelts (tree expr)
3127 {
3128   if (CONSTRUCTOR_NELTS (expr) == 0)
3129     return true;
3130   if (!processing_template_decl)
3131     return false;
3132   for (constructor_elt &elt : CONSTRUCTOR_ELTS (expr))
3133     if (!PACK_EXPANSION_P (elt.value))
3134       return false;
3135   return true;
3136 }
3137 
3138 /* Finish a compound-literal expression or C++11 functional cast with aggregate
3139    initializer.  TYPE is the type to which the CONSTRUCTOR in COMPOUND_LITERAL
3140    is being cast.  */
3141 
3142 tree
finish_compound_literal(tree type,tree compound_literal,tsubst_flags_t complain,fcl_t fcl_context)3143 finish_compound_literal (tree type, tree compound_literal,
3144                                tsubst_flags_t complain,
3145                                fcl_t fcl_context)
3146 {
3147   if (type == error_mark_node)
3148     return error_mark_node;
3149 
3150   if (TYPE_REF_P (type))
3151     {
3152       compound_literal
3153           = finish_compound_literal (TREE_TYPE (type), compound_literal,
3154                                            complain, fcl_context);
3155       /* The prvalue is then used to direct-initialize the reference.  */
3156       tree r = (perform_implicit_conversion_flags
3157                     (type, compound_literal, complain, LOOKUP_NORMAL));
3158       return convert_from_reference (r);
3159     }
3160 
3161   if (!TYPE_OBJ_P (type))
3162     {
3163       /* DR2351 */
3164       if (VOID_TYPE_P (type) && CONSTRUCTOR_NELTS (compound_literal) == 0)
3165           return void_node;
3166       else if (VOID_TYPE_P (type)
3167                  && processing_template_decl
3168                  && maybe_zero_constructor_nelts (compound_literal))
3169           /* If there are only packs in compound_literal, it could
3170              be void{} after pack expansion.  */;
3171       else
3172           {
3173             if (complain & tf_error)
3174               error ("compound literal of non-object type %qT", type);
3175             return error_mark_node;
3176           }
3177     }
3178 
3179   if (template_placeholder_p (type))
3180     {
3181       type = do_auto_deduction (type, compound_literal, type, complain,
3182                                         adc_variable_type);
3183       if (type == error_mark_node)
3184           return error_mark_node;
3185     }
3186   /* C++23 auto{x}.  */
3187   else if (is_auto (type)
3188              && !AUTO_IS_DECLTYPE (type)
3189              && CONSTRUCTOR_NELTS (compound_literal) == 1)
3190     {
3191       if (is_constrained_auto (type))
3192           {
3193             if (complain & tf_error)
3194               error ("%<auto{x}%> cannot be constrained");
3195             return error_mark_node;
3196           }
3197       else if (cxx_dialect < cxx23)
3198           pedwarn (input_location, OPT_Wc__23_extensions,
3199                      "%<auto{x}%> only available with "
3200                      "%<-std=c++2b%> or %<-std=gnu++2b%>");
3201       type = do_auto_deduction (type, compound_literal, type, complain,
3202                                         adc_variable_type);
3203       if (type == error_mark_node)
3204           return error_mark_node;
3205     }
3206 
3207   /* Used to hold a copy of the compound literal in a template.  */
3208   tree orig_cl = NULL_TREE;
3209 
3210   if (processing_template_decl)
3211     {
3212       const bool dependent_p
3213           = (instantiation_dependent_expression_p (compound_literal)
3214              || dependent_type_p (type));
3215       if (dependent_p)
3216           /* We're about to return, no need to copy.  */
3217           orig_cl = compound_literal;
3218       else
3219           /* We're going to need a copy.  */
3220           orig_cl = unshare_constructor (compound_literal);
3221       TREE_TYPE (orig_cl) = type;
3222       /* Mark the expression as a compound literal.  */
3223       TREE_HAS_CONSTRUCTOR (orig_cl) = 1;
3224       /* And as instantiation-dependent.  */
3225       CONSTRUCTOR_IS_DEPENDENT (orig_cl) = dependent_p;
3226       if (fcl_context == fcl_c99)
3227           CONSTRUCTOR_C99_COMPOUND_LITERAL (orig_cl) = 1;
3228       /* If the compound literal is dependent, we're done for now.  */
3229       if (dependent_p)
3230           return orig_cl;
3231       /* Otherwise, do go on to e.g. check narrowing.  */
3232     }
3233 
3234   type = complete_type (type);
3235 
3236   if (TYPE_NON_AGGREGATE_CLASS (type))
3237     {
3238       /* Trying to deal with a CONSTRUCTOR instead of a TREE_LIST
3239            everywhere that deals with function arguments would be a pain, so
3240            just wrap it in a TREE_LIST.  The parser set a flag so we know
3241            that it came from T{} rather than T({}).  */
3242       CONSTRUCTOR_IS_DIRECT_INIT (compound_literal) = 1;
3243       compound_literal = build_tree_list (NULL_TREE, compound_literal);
3244       return build_functional_cast (input_location, type,
3245                                             compound_literal, complain);
3246     }
3247 
3248   if (TREE_CODE (type) == ARRAY_TYPE
3249       && check_array_initializer (NULL_TREE, type, compound_literal))
3250     return error_mark_node;
3251   compound_literal = reshape_init (type, compound_literal, complain);
3252   if (SCALAR_TYPE_P (type)
3253       && !BRACE_ENCLOSED_INITIALIZER_P (compound_literal)
3254       && !check_narrowing (type, compound_literal, complain))
3255     return error_mark_node;
3256   if (TREE_CODE (type) == ARRAY_TYPE
3257       && TYPE_DOMAIN (type) == NULL_TREE)
3258     {
3259       cp_complete_array_type_or_error (&type, compound_literal,
3260                                                false, complain);
3261       if (type == error_mark_node)
3262           return error_mark_node;
3263     }
3264   compound_literal = digest_init_flags (type, compound_literal,
3265                                                   LOOKUP_NORMAL | LOOKUP_NO_NARROWING,
3266                                                   complain);
3267   if (compound_literal == error_mark_node)
3268     return error_mark_node;
3269 
3270   /* If we're in a template, return the original compound literal.  */
3271   if (orig_cl)
3272     return orig_cl;
3273 
3274   if (TREE_CODE (compound_literal) == CONSTRUCTOR)
3275     {
3276       TREE_HAS_CONSTRUCTOR (compound_literal) = true;
3277       if (fcl_context == fcl_c99)
3278           CONSTRUCTOR_C99_COMPOUND_LITERAL (compound_literal) = 1;
3279     }
3280 
3281   /* Put static/constant array temporaries in static variables.  */
3282   /* FIXME all C99 compound literals should be variables rather than C++
3283      temporaries, unless they are used as an aggregate initializer.  */
3284   if ((!at_function_scope_p () || CP_TYPE_CONST_P (type))
3285       && fcl_context == fcl_c99
3286       && TREE_CODE (type) == ARRAY_TYPE
3287       && !TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type)
3288       && initializer_constant_valid_p (compound_literal, type))
3289     {
3290       tree decl = create_temporary_var (type);
3291       DECL_CONTEXT (decl) = NULL_TREE;
3292       DECL_INITIAL (decl) = compound_literal;
3293       TREE_STATIC (decl) = 1;
3294       if (literal_type_p (type) && CP_TYPE_CONST_NON_VOLATILE_P (type))
3295           {
3296             /* 5.19 says that a constant expression can include an
3297                lvalue-rvalue conversion applied to "a glvalue of literal type
3298                that refers to a non-volatile temporary object initialized
3299                with a constant expression".  Rather than try to communicate
3300                that this VAR_DECL is a temporary, just mark it constexpr.  */
3301             DECL_DECLARED_CONSTEXPR_P (decl) = true;
3302             DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl) = true;
3303             TREE_CONSTANT (decl) = true;
3304           }
3305       cp_apply_type_quals_to_decl (cp_type_quals (type), decl);
3306       decl = pushdecl_top_level (decl);
3307       DECL_NAME (decl) = make_anon_name ();
3308       SET_DECL_ASSEMBLER_NAME (decl, DECL_NAME (decl));
3309       /* Make sure the destructor is callable.  */
3310       tree clean = cxx_maybe_build_cleanup (decl, complain);
3311       if (clean == error_mark_node)
3312           return error_mark_node;
3313       return decl;
3314     }
3315 
3316   /* Represent other compound literals with TARGET_EXPR so we produce
3317      a prvalue, and can elide copies.  */
3318   if (!VECTOR_TYPE_P (type)
3319       && (TREE_CODE (compound_literal) == CONSTRUCTOR
3320             || TREE_CODE (compound_literal) == VEC_INIT_EXPR))
3321     {
3322       /* The CONSTRUCTOR is now an initializer, not a compound literal.  */
3323       if (TREE_CODE (compound_literal) == CONSTRUCTOR)
3324           TREE_HAS_CONSTRUCTOR (compound_literal) = false;
3325       compound_literal = get_target_expr_sfinae (compound_literal, complain);
3326     }
3327   else
3328     /* For e.g. int{42} just make sure it's a prvalue.  */
3329     compound_literal = rvalue (compound_literal);
3330 
3331   return compound_literal;
3332 }
3333 
3334 /* Return the declaration for the function-name variable indicated by
3335    ID.  */
3336 
3337 tree
finish_fname(tree id)3338 finish_fname (tree id)
3339 {
3340   tree decl;
3341 
3342   decl = fname_decl (input_location, C_RID_CODE (id), id);
3343   if (processing_template_decl && current_function_decl
3344       && decl != error_mark_node)
3345     decl = DECL_NAME (decl);
3346   return decl;
3347 }
3348 
3349 /* Finish a translation unit.  */
3350 
3351 void
finish_translation_unit(void)3352 finish_translation_unit (void)
3353 {
3354   /* In case there were missing closebraces,
3355      get us back to the global binding level.  */
3356   pop_everything ();
3357   while (current_namespace != global_namespace)
3358     pop_namespace ();
3359 
3360   /* Do file scope __FUNCTION__ et al.  */
3361   finish_fname_decls ();
3362 
3363   if (vec_safe_length (scope_chain->omp_declare_target_attribute))
3364     {
3365       if (!errorcount)
3366           error ("%<#pragma omp declare target%> without corresponding "
3367                  "%<#pragma omp end declare target%>");
3368       vec_safe_truncate (scope_chain->omp_declare_target_attribute, 0);
3369     }
3370 }
3371 
3372 /* Finish a template type parameter, specified as AGGR IDENTIFIER.
3373    Returns the parameter.  */
3374 
3375 tree
finish_template_type_parm(tree aggr,tree identifier)3376 finish_template_type_parm (tree aggr, tree identifier)
3377 {
3378   if (aggr != class_type_node)
3379     {
3380       permerror (input_location, "template type parameters must use the keyword %<class%> or %<typename%>");
3381       aggr = class_type_node;
3382     }
3383 
3384   return build_tree_list (aggr, identifier);
3385 }
3386 
3387 /* Finish a template template parameter, specified as AGGR IDENTIFIER.
3388    Returns the parameter.  */
3389 
3390 tree
finish_template_template_parm(tree aggr,tree identifier)3391 finish_template_template_parm (tree aggr, tree identifier)
3392 {
3393   tree decl = build_decl (input_location,
3394                                 TYPE_DECL, identifier, NULL_TREE);
3395 
3396   tree tmpl = build_lang_decl (TEMPLATE_DECL, identifier, NULL_TREE);
3397   DECL_TEMPLATE_PARMS (tmpl) = current_template_parms;
3398   DECL_TEMPLATE_RESULT (tmpl) = decl;
3399   DECL_ARTIFICIAL (decl) = 1;
3400 
3401   /* Associate the constraints with the underlying declaration,
3402      not the template.  */
3403   tree reqs = TEMPLATE_PARMS_CONSTRAINTS (current_template_parms);
3404   tree constr = build_constraints (reqs, NULL_TREE);
3405   set_constraints (decl, constr);
3406 
3407   end_template_decl ();
3408 
3409   gcc_assert (DECL_TEMPLATE_PARMS (tmpl));
3410 
3411   check_default_tmpl_args (decl, DECL_TEMPLATE_PARMS (tmpl),
3412                                  /*is_primary=*/true, /*is_partial=*/false,
3413                                  /*is_friend=*/0);
3414 
3415   return finish_template_type_parm (aggr, tmpl);
3416 }
3417 
3418 /* ARGUMENT is the default-argument value for a template template
3419    parameter.  If ARGUMENT is invalid, issue error messages and return
3420    the ERROR_MARK_NODE.  Otherwise, ARGUMENT itself is returned.  */
3421 
3422 tree
check_template_template_default_arg(tree argument)3423 check_template_template_default_arg (tree argument)
3424 {
3425   if (TREE_CODE (argument) != TEMPLATE_DECL
3426       && TREE_CODE (argument) != TEMPLATE_TEMPLATE_PARM
3427       && TREE_CODE (argument) != UNBOUND_CLASS_TEMPLATE)
3428     {
3429       if (TREE_CODE (argument) == TYPE_DECL)
3430           error ("invalid use of type %qT as a default value for a template "
3431                  "template-parameter", TREE_TYPE (argument));
3432       else
3433           error ("invalid default argument for a template template parameter");
3434       return error_mark_node;
3435     }
3436 
3437   return argument;
3438 }
3439 
3440 /* Begin a class definition, as indicated by T.  */
3441 
3442 tree
begin_class_definition(tree t)3443 begin_class_definition (tree t)
3444 {
3445   if (error_operand_p (t) || error_operand_p (TYPE_MAIN_DECL (t)))
3446     return error_mark_node;
3447 
3448   if (processing_template_parmlist && !LAMBDA_TYPE_P (t))
3449     {
3450       error ("definition of %q#T inside template parameter list", t);
3451       return error_mark_node;
3452     }
3453 
3454   /* According to the C++ ABI, decimal classes defined in ISO/IEC TR 24733
3455      are passed the same as decimal scalar types.  */
3456   if (TREE_CODE (t) == RECORD_TYPE
3457       && !processing_template_decl)
3458     {
3459       tree ns = TYPE_CONTEXT (t);
3460       if (ns && TREE_CODE (ns) == NAMESPACE_DECL
3461             && DECL_CONTEXT (ns) == std_node
3462             && DECL_NAME (ns)
3463             && id_equal (DECL_NAME (ns), "decimal"))
3464           {
3465             const char *n = TYPE_NAME_STRING (t);
3466             if ((strcmp (n, "decimal32") == 0)
3467                 || (strcmp (n, "decimal64") == 0)
3468                 || (strcmp (n, "decimal128") == 0))
3469               TYPE_TRANSPARENT_AGGR (t) = 1;
3470           }
3471     }
3472 
3473   /* A non-implicit typename comes from code like:
3474 
3475        template <typename T> struct A {
3476            template <typename U> struct A<T>::B ...
3477 
3478      This is erroneous.  */
3479   else if (TREE_CODE (t) == TYPENAME_TYPE)
3480     {
3481       error ("invalid definition of qualified type %qT", t);
3482       t = error_mark_node;
3483     }
3484 
3485   if (t == error_mark_node || ! MAYBE_CLASS_TYPE_P (t))
3486     {
3487       t = make_class_type (RECORD_TYPE);
3488       pushtag (make_anon_name (), t);
3489     }
3490 
3491   if (TYPE_BEING_DEFINED (t))
3492     {
3493       t = make_class_type (TREE_CODE (t));
3494       pushtag (TYPE_IDENTIFIER (t), t);
3495     }
3496 
3497   if (modules_p ())
3498     {
3499       if (!module_may_redeclare (TYPE_NAME (t)))
3500           {
3501             error ("cannot declare %qD in a different module", TYPE_NAME (t));
3502             inform (DECL_SOURCE_LOCATION (TYPE_NAME (t)), "declared here");
3503             return error_mark_node;
3504           }
3505       set_instantiating_module (TYPE_NAME (t));
3506       set_defining_module (TYPE_NAME (t));
3507     }
3508 
3509   maybe_process_partial_specialization (t);
3510   pushclass (t);
3511   TYPE_BEING_DEFINED (t) = 1;
3512   class_binding_level->defining_class_p = 1;
3513 
3514   if (flag_pack_struct)
3515     {
3516       tree v;
3517       TYPE_PACKED (t) = 1;
3518       /* Even though the type is being defined for the first time
3519            here, there might have been a forward declaration, so there
3520            might be cv-qualified variants of T.  */
3521       for (v = TYPE_NEXT_VARIANT (t); v; v = TYPE_NEXT_VARIANT (v))
3522           TYPE_PACKED (v) = 1;
3523     }
3524   /* Reset the interface data, at the earliest possible
3525      moment, as it might have been set via a class foo;
3526      before.  */
3527   if (! TYPE_UNNAMED_P (t))
3528     {
3529       struct c_fileinfo *finfo = \
3530           get_fileinfo (LOCATION_FILE (input_location));
3531       CLASSTYPE_INTERFACE_ONLY (t) = finfo->interface_only;
3532       SET_CLASSTYPE_INTERFACE_UNKNOWN_X
3533           (t, finfo->interface_unknown);
3534     }
3535   reset_specialization ();
3536 
3537   /* Make a declaration for this class in its own scope.  */
3538   build_self_reference ();
3539 
3540   return t;
3541 }
3542 
3543 /* Finish the member declaration given by DECL.  */
3544 
3545 void
finish_member_declaration(tree decl)3546 finish_member_declaration (tree decl)
3547 {
3548   if (decl == error_mark_node || decl == NULL_TREE)
3549     return;
3550 
3551   if (decl == void_type_node)
3552     /* The COMPONENT was a friend, not a member, and so there's
3553        nothing for us to do.  */
3554     return;
3555 
3556   /* We should see only one DECL at a time.  */
3557   gcc_assert (DECL_CHAIN (decl) == NULL_TREE);
3558 
3559   /* Don't add decls after definition.  */
3560   gcc_assert (TYPE_BEING_DEFINED (current_class_type)
3561                 /* We can add lambda types when late parsing default
3562                      arguments.  */
3563                 || LAMBDA_TYPE_P (TREE_TYPE (decl)));
3564 
3565   /* Set up access control for DECL.  */
3566   TREE_PRIVATE (decl)
3567     = (current_access_specifier == access_private_node);
3568   TREE_PROTECTED (decl)
3569     = (current_access_specifier == access_protected_node);
3570   if (TREE_CODE (decl) == TEMPLATE_DECL)
3571     {
3572       TREE_PRIVATE (DECL_TEMPLATE_RESULT (decl)) = TREE_PRIVATE (decl);
3573       TREE_PROTECTED (DECL_TEMPLATE_RESULT (decl)) = TREE_PROTECTED (decl);
3574     }
3575 
3576   /* Mark the DECL as a member of the current class, unless it's
3577      a member of an enumeration.  */
3578   if (TREE_CODE (decl) != CONST_DECL)
3579     DECL_CONTEXT (decl) = current_class_type;
3580 
3581   /* Remember the single FIELD_DECL an anonymous aggregate type is used for.  */
3582   if (TREE_CODE (decl) == FIELD_DECL
3583       && ANON_AGGR_TYPE_P (TREE_TYPE (decl)))
3584     {
3585       gcc_assert (!ANON_AGGR_TYPE_FIELD (TYPE_MAIN_VARIANT (TREE_TYPE (decl))));
3586       ANON_AGGR_TYPE_FIELD (TYPE_MAIN_VARIANT (TREE_TYPE (decl))) = decl;
3587     }
3588 
3589   if (TREE_CODE (decl) == USING_DECL)
3590     /* Avoid debug info for class-scope USING_DECLS for now, we'll
3591        call cp_emit_debug_info_for_using later. */
3592     DECL_IGNORED_P (decl) = 1;
3593 
3594   /* Check for bare parameter packs in the non-static data member
3595      declaration.  */
3596   if (TREE_CODE (decl) == FIELD_DECL)
3597     {
3598       if (check_for_bare_parameter_packs (TREE_TYPE (decl)))
3599         TREE_TYPE (decl) = error_mark_node;
3600       if (check_for_bare_parameter_packs (DECL_ATTRIBUTES (decl)))
3601         DECL_ATTRIBUTES (decl) = NULL_TREE;
3602     }
3603 
3604   /* [dcl.link]
3605 
3606      A C language linkage is ignored for the names of class members
3607      and the member function type of class member functions.  */
3608   if (DECL_LANG_SPECIFIC (decl))
3609     SET_DECL_LANGUAGE (decl, lang_cplusplus);
3610 
3611   bool add = false;
3612 
3613   /* Functions and non-functions are added differently.  */
3614   if (DECL_DECLARES_FUNCTION_P (decl))
3615     add = add_method (current_class_type, decl, false);
3616   /* Enter the DECL into the scope of the class, if the class
3617      isn't a closure (whose fields are supposed to be unnamed).  */
3618   else if (CLASSTYPE_LAMBDA_EXPR (current_class_type)
3619              || maybe_push_used_methods (decl)
3620              || pushdecl_class_level (decl))
3621     add = true;
3622 
3623   if (add)
3624     {
3625       /* All TYPE_DECLs go at the end of TYPE_FIELDS.  Ordinary fields
3626            go at the beginning.  The reason is that
3627            legacy_nonfn_member_lookup searches the list in order, and we
3628            want a field name to override a type name so that the "struct
3629            stat hack" will work.  In particular:
3630 
3631              struct S { enum E { }; static const int E = 5; int ary[S::E]; } s;
3632 
3633            is valid.  */
3634 
3635       if (TREE_CODE (decl) == TYPE_DECL)
3636           TYPE_FIELDS (current_class_type)
3637             = chainon (TYPE_FIELDS (current_class_type), decl);
3638       else
3639           {
3640             DECL_CHAIN (decl) = TYPE_FIELDS (current_class_type);
3641             TYPE_FIELDS (current_class_type) = decl;
3642           }
3643 
3644       maybe_add_class_template_decl_list (current_class_type, decl,
3645                                                     /*friend_p=*/0);
3646     }
3647 }
3648 
3649 /* Finish processing a complete template declaration.  The PARMS are
3650    the template parameters.  */
3651 
3652 void
finish_template_decl(tree parms)3653 finish_template_decl (tree parms)
3654 {
3655   if (parms)
3656     end_template_decl ();
3657   else
3658     end_specialization ();
3659 }
3660 
3661 // Returns the template type of the class scope being entered. If we're
3662 // entering a constrained class scope. TYPE is the class template
3663 // scope being entered and we may need to match the intended type with
3664 // a constrained specialization. For example:
3665 //
3666 //    template<Object T>
3667 //      struct S { void f(); }; #1
3668 //
3669 //    template<Object T>
3670 //      void S<T>::f() { }      #2
3671 //
3672 // We check, in #2, that S<T> refers precisely to the type declared by
3673 // #1 (i.e., that the constraints match). Note that the following should
3674 // be an error since there is no specialization of S<T> that is
3675 // unconstrained, but this is not diagnosed here.
3676 //
3677 //    template<typename T>
3678 //      void S<T>::f() { }
3679 //
3680 // We cannot diagnose this problem here since this function also matches
3681 // qualified template names that are not part of a definition. For example:
3682 //
3683 //    template<Integral T, Floating_point U>
3684 //      typename pair<T, U>::first_type void f(T, U);
3685 //
3686 // Here, it is unlikely that there is a partial specialization of
3687 // pair constrained for for Integral and Floating_point arguments.
3688 //
3689 // The general rule is: if a constrained specialization with matching
3690 // constraints is found return that type. Also note that if TYPE is not a
3691 // class-type (e.g. a typename type), then no fixup is needed.
3692 
3693 static tree
fixup_template_type(tree type)3694 fixup_template_type (tree type)
3695 {
3696   // Find the template parameter list at the a depth appropriate to
3697   // the scope we're trying to enter.
3698   tree parms = current_template_parms;
3699   int depth = template_class_depth (type);
3700   for (int n = current_template_depth; n > depth && parms; --n)
3701     parms = TREE_CHAIN (parms);
3702   if (!parms)
3703     return type;
3704   tree cur_reqs = TEMPLATE_PARMS_CONSTRAINTS (parms);
3705   tree cur_constr = build_constraints (cur_reqs, NULL_TREE);
3706 
3707   // Search for a specialization whose type and constraints match.
3708   tree tmpl = CLASSTYPE_TI_TEMPLATE (type);
3709   tree specs = DECL_TEMPLATE_SPECIALIZATIONS (tmpl);
3710   while (specs)
3711     {
3712       tree spec_constr = get_constraints (TREE_VALUE (specs));
3713 
3714       // If the type and constraints match a specialization, then we
3715       // are entering that type.
3716       if (same_type_p (type, TREE_TYPE (specs))
3717             && equivalent_constraints (cur_constr, spec_constr))
3718         return TREE_TYPE (specs);
3719       specs = TREE_CHAIN (specs);
3720     }
3721 
3722   // If no specialization matches, then must return the type
3723   // previously found.
3724   return type;
3725 }
3726 
3727 /* Finish processing a template-id (which names a type) of the form
3728    NAME < ARGS >.  Return the TYPE_DECL for the type named by the
3729    template-id.  If ENTERING_SCOPE is nonzero we are about to enter
3730    the scope of template-id indicated.  */
3731 
3732 tree
finish_template_type(tree name,tree args,int entering_scope)3733 finish_template_type (tree name, tree args, int entering_scope)
3734 {
3735   tree type;
3736 
3737   type = lookup_template_class (name, args,
3738                                         NULL_TREE, NULL_TREE, entering_scope,
3739                                         tf_warning_or_error | tf_user);
3740 
3741   /* If we might be entering the scope of a partial specialization,
3742      find the one with the right constraints.  */
3743   if (flag_concepts
3744       && entering_scope
3745       && CLASS_TYPE_P (type)
3746       && CLASSTYPE_TEMPLATE_INFO (type)
3747       && dependent_type_p (type)
3748       && PRIMARY_TEMPLATE_P (CLASSTYPE_TI_TEMPLATE (type)))
3749     type = fixup_template_type (type);
3750 
3751   if (type == error_mark_node)
3752     return type;
3753   else if (CLASS_TYPE_P (type) && !alias_type_or_template_p (type))
3754     return TYPE_STUB_DECL (type);
3755   else
3756     return TYPE_NAME (type);
3757 }
3758 
3759 /* Finish processing a BASE_CLASS with the indicated ACCESS_SPECIFIER.
3760    Return a TREE_LIST containing the ACCESS_SPECIFIER and the
3761    BASE_CLASS, or NULL_TREE if an error occurred.  The
3762    ACCESS_SPECIFIER is one of
3763    access_{default,public,protected_private}_node.  For a virtual base
3764    we set TREE_TYPE.  */
3765 
3766 tree
finish_base_specifier(tree base,tree access,bool virtual_p)3767 finish_base_specifier (tree base, tree access, bool virtual_p)
3768 {
3769   tree result;
3770 
3771   if (base == error_mark_node)
3772     {
3773       error ("invalid base-class specification");
3774       result = NULL_TREE;
3775     }
3776   else if (! MAYBE_CLASS_TYPE_P (base))
3777     {
3778       error ("%qT is not a class type", base);
3779       result = NULL_TREE;
3780     }
3781   else
3782     {
3783       if (cp_type_quals (base) != 0)
3784           {
3785             /* DR 484: Can a base-specifier name a cv-qualified
3786                class type?  */
3787             base = TYPE_MAIN_VARIANT (base);
3788           }
3789       result = build_tree_list (access, base);
3790       if (virtual_p)
3791           TREE_TYPE (result) = integer_type_node;
3792     }
3793 
3794   return result;
3795 }
3796 
3797 /* If FNS is a member function, a set of member functions, or a
3798    template-id referring to one or more member functions, return a
3799    BASELINK for FNS, incorporating the current access context.
3800    Otherwise, return FNS unchanged.  */
3801 
3802 tree
baselink_for_fns(tree fns)3803 baselink_for_fns (tree fns)
3804 {
3805   tree scope;
3806   tree cl;
3807 
3808   if (BASELINK_P (fns)
3809       || error_operand_p (fns))
3810     return fns;
3811 
3812   scope = ovl_scope (fns);
3813   if (!CLASS_TYPE_P (scope))
3814     return fns;
3815 
3816   cl = currently_open_derived_class (scope);
3817   if (!cl)
3818     cl = scope;
3819   tree access_path = TYPE_BINFO (cl);
3820   tree conv_path = (cl == scope ? access_path
3821                         : lookup_base (cl, scope, ba_any, NULL, tf_none));
3822   return build_baselink (conv_path, access_path, fns, /*optype=*/NULL_TREE);
3823 }
3824 
3825 /* Returns true iff DECL is a variable from a function outside
3826    the current one.  */
3827 
3828 static bool
outer_var_p(tree decl)3829 outer_var_p (tree decl)
3830 {
3831   return ((VAR_P (decl) || TREE_CODE (decl) == PARM_DECL)
3832             && DECL_FUNCTION_SCOPE_P (decl)
3833             /* Don't get confused by temporaries.  */
3834             && DECL_NAME (decl)
3835             && (DECL_CONTEXT (decl) != current_function_decl
3836                 || parsing_nsdmi ()));
3837 }
3838 
3839 /* As above, but also checks that DECL is automatic.  */
3840 
3841 bool
outer_automatic_var_p(tree decl)3842 outer_automatic_var_p (tree decl)
3843 {
3844   return (outer_var_p (decl)
3845             && !TREE_STATIC (decl));
3846 }
3847 
3848 /* DECL satisfies outer_automatic_var_p.  Possibly complain about it or
3849    rewrite it for lambda capture.
3850 
3851    If ODR_USE is true, we're being called from mark_use, and we complain about
3852    use of constant variables.  If ODR_USE is false, we're being called for the
3853    id-expression, and we do lambda capture.  */
3854 
3855 tree
process_outer_var_ref(tree decl,tsubst_flags_t complain,bool odr_use)3856 process_outer_var_ref (tree decl, tsubst_flags_t complain, bool odr_use)
3857 {
3858   if (cp_unevaluated_operand)
3859     {
3860       tree type = TREE_TYPE (decl);
3861       if (!dependent_type_p (type)
3862             && variably_modified_type_p (type, NULL_TREE))
3863           /* VLAs are used even in unevaluated context.  */;
3864       else
3865           /* It's not a use (3.2) if we're in an unevaluated context.  */
3866           return decl;
3867     }
3868   if (decl == error_mark_node)
3869     return decl;
3870 
3871   tree context = DECL_CONTEXT (decl);
3872   tree containing_function = current_function_decl;
3873   tree lambda_stack = NULL_TREE;
3874   tree lambda_expr = NULL_TREE;
3875   tree initializer = convert_from_reference (decl);
3876 
3877   /* Mark it as used now even if the use is ill-formed.  */
3878   if (!mark_used (decl, complain))
3879     return error_mark_node;
3880 
3881   if (parsing_nsdmi ())
3882     containing_function = NULL_TREE;
3883 
3884   if (containing_function && LAMBDA_FUNCTION_P (containing_function))
3885     {
3886       /* Check whether we've already built a proxy.  */
3887       tree var = decl;
3888       while (is_normal_capture_proxy (var))
3889           var = DECL_CAPTURED_VARIABLE (var);
3890       tree d = retrieve_local_specialization (var);
3891 
3892       if (d && d != decl && is_capture_proxy (d))
3893           {
3894             if (DECL_CONTEXT (d) == containing_function)
3895               /* We already have an inner proxy.  */
3896               return d;
3897             else
3898               /* We need to capture an outer proxy.  */
3899               return process_outer_var_ref (d, complain, odr_use);
3900           }
3901     }
3902 
3903   /* If we are in a lambda function, we can move out until we hit
3904      1. the context,
3905      2. a non-lambda function, or
3906      3. a non-default capturing lambda function.  */
3907   while (context != containing_function
3908            /* containing_function can be null with invalid generic lambdas.  */
3909            && containing_function
3910            && LAMBDA_FUNCTION_P (containing_function))
3911     {
3912       tree closure = DECL_CONTEXT (containing_function);
3913       lambda_expr = CLASSTYPE_LAMBDA_EXPR (closure);
3914 
3915       if (TYPE_CLASS_SCOPE_P (closure))
3916           /* A lambda in an NSDMI (c++/64496).  */
3917           break;
3918 
3919       if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_NONE)
3920           break;
3921 
3922       lambda_stack = tree_cons (NULL_TREE, lambda_expr, lambda_stack);
3923 
3924       containing_function = decl_function_context (containing_function);
3925     }
3926 
3927   /* In a lambda within a template, wait until instantiation time to implicitly
3928      capture a parameter pack.  We want to wait because we don't know if we're
3929      capturing the whole pack or a single element, and it's OK to wait because
3930      find_parameter_packs_r walks into the lambda body.  */
3931   if (context == containing_function
3932       && DECL_PACK_P (decl))
3933     return decl;
3934 
3935   if (lambda_expr && VAR_P (decl) && DECL_ANON_UNION_VAR_P (decl))
3936     {
3937       if (complain & tf_error)
3938           error ("cannot capture member %qD of anonymous union", decl);
3939       return error_mark_node;
3940     }
3941   /* Do lambda capture when processing the id-expression, not when
3942      odr-using a variable.  */
3943   if (!odr_use && context == containing_function)
3944     decl = add_default_capture (lambda_stack,
3945                                         /*id=*/DECL_NAME (decl), initializer);
3946   /* Only an odr-use of an outer automatic variable causes an
3947      error, and a constant variable can decay to a prvalue
3948      constant without odr-use.  So don't complain yet.  */
3949   else if (!odr_use && decl_constant_var_p (decl))
3950     return decl;
3951   else if (lambda_expr)
3952     {
3953       if (complain & tf_error)
3954           {
3955             error ("%qD is not captured", decl);
3956             tree closure = LAMBDA_EXPR_CLOSURE (lambda_expr);
3957             if (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lambda_expr) == CPLD_NONE)
3958               inform (location_of (closure),
3959                         "the lambda has no capture-default");
3960             else if (TYPE_CLASS_SCOPE_P (closure))
3961               inform (UNKNOWN_LOCATION, "lambda in local class %q+T cannot "
3962                         "capture variables from the enclosing context",
3963                         TYPE_CONTEXT (closure));
3964             inform (DECL_SOURCE_LOCATION (decl), "%q#D declared here", decl);
3965           }
3966       return error_mark_node;
3967     }
3968   else
3969     {
3970       if (complain & tf_error)
3971           {
3972             error (VAR_P (decl)
3973                      ? G_("use of local variable with automatic storage from "
3974                           "containing function")
3975                      : G_("use of parameter from containing function"));
3976             inform (DECL_SOURCE_LOCATION (decl), "%q#D declared here", decl);
3977           }
3978       return error_mark_node;
3979     }
3980   return decl;
3981 }
3982 
3983 /* ID_EXPRESSION is a representation of parsed, but unprocessed,
3984    id-expression.  (See cp_parser_id_expression for details.)  SCOPE,
3985    if non-NULL, is the type or namespace used to explicitly qualify
3986    ID_EXPRESSION.  DECL is the entity to which that name has been
3987    resolved.
3988 
3989    *CONSTANT_EXPRESSION_P is true if we are presently parsing a
3990    constant-expression.  In that case, *NON_CONSTANT_EXPRESSION_P will
3991    be set to true if this expression isn't permitted in a
3992    constant-expression, but it is otherwise not set by this function.
3993    *ALLOW_NON_CONSTANT_EXPRESSION_P is true if we are parsing a
3994    constant-expression, but a non-constant expression is also
3995    permissible.
3996 
3997    DONE is true if this expression is a complete postfix-expression;
3998    it is false if this expression is followed by '->', '[', '(', etc.
3999    ADDRESS_P is true iff this expression is the operand of '&'.
4000    TEMPLATE_P is true iff the qualified-id was of the form
4001    "A::template B".  TEMPLATE_ARG_P is true iff this qualified name
4002    appears as a template argument.
4003 
4004    If an error occurs, and it is the kind of error that might cause
4005    the parser to abort a tentative parse, *ERROR_MSG is filled in.  It
4006    is the caller's responsibility to issue the message.  *ERROR_MSG
4007    will be a string with static storage duration, so the caller need
4008    not "free" it.
4009 
4010    Return an expression for the entity, after issuing appropriate
4011    diagnostics.  This function is also responsible for transforming a
4012    reference to a non-static member into a COMPONENT_REF that makes
4013    the use of "this" explicit.
4014 
4015    Upon return, *IDK will be filled in appropriately.  */
4016 static cp_expr
finish_id_expression_1(tree id_expression,tree decl,tree scope,cp_id_kind * idk,bool integral_constant_expression_p,bool allow_non_integral_constant_expression_p,bool * non_integral_constant_expression_p,bool template_p,bool done,bool address_p,bool template_arg_p,const char ** error_msg,location_t location)4017 finish_id_expression_1 (tree id_expression,
4018                               tree decl,
4019                               tree scope,
4020                               cp_id_kind *idk,
4021                               bool integral_constant_expression_p,
4022                               bool allow_non_integral_constant_expression_p,
4023                               bool *non_integral_constant_expression_p,
4024                               bool template_p,
4025                               bool done,
4026                               bool address_p,
4027                               bool template_arg_p,
4028                               const char **error_msg,
4029                               location_t location)
4030 {
4031   decl = strip_using_decl (decl);
4032 
4033   /* Initialize the output parameters.  */
4034   *idk = CP_ID_KIND_NONE;
4035   *error_msg = NULL;
4036 
4037   if (id_expression == error_mark_node)
4038     return error_mark_node;
4039   /* If we have a template-id, then no further lookup is
4040      required.  If the template-id was for a template-class, we
4041      will sometimes have a TYPE_DECL at this point.  */
4042   else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
4043              || TREE_CODE (decl) == TYPE_DECL)
4044     ;
4045   /* Look up the name.  */
4046   else
4047     {
4048       if (decl == error_mark_node)
4049           {
4050             /* Name lookup failed.  */
4051             if (scope
4052                 && (!TYPE_P (scope)
4053                       || (!dependent_type_p (scope)
4054                           && !(identifier_p (id_expression)
4055                                  && IDENTIFIER_CONV_OP_P (id_expression)
4056                                  && dependent_type_p (TREE_TYPE (id_expression))))))
4057               {
4058                 /* If the qualifying type is non-dependent (and the name
4059                      does not name a conversion operator to a dependent
4060                      type), issue an error.  */
4061                 qualified_name_lookup_error (scope, id_expression, decl, location);
4062                 return error_mark_node;
4063               }
4064             else if (!scope)
4065               {
4066                 /* It may be resolved via Koenig lookup.  */
4067                 *idk = CP_ID_KIND_UNQUALIFIED;
4068                 return id_expression;
4069               }
4070             else
4071               decl = id_expression;
4072           }
4073 
4074       /* Remember that the name was used in the definition of
4075            the current class so that we can check later to see if
4076            the meaning would have been different after the class
4077            was entirely defined.  */
4078       if (!scope && decl != error_mark_node && identifier_p (id_expression))
4079           maybe_note_name_used_in_class (id_expression, decl);
4080 
4081       /* A use in unevaluated operand might not be instantiated appropriately
4082            if tsubst_copy builds a dummy parm, or if we never instantiate a
4083            generic lambda, so mark it now.  */
4084       if (processing_template_decl && cp_unevaluated_operand)
4085           mark_type_use (decl);
4086 
4087       /* Disallow uses of local variables from containing functions, except
4088            within lambda-expressions.  */
4089       if (outer_automatic_var_p (decl))
4090           {
4091             decl = process_outer_var_ref (decl, tf_warning_or_error);
4092             if (decl == error_mark_node)
4093               return error_mark_node;
4094           }
4095 
4096       /* Also disallow uses of function parameters outside the function
4097            body, except inside an unevaluated context (i.e. decltype).  */
4098       if (TREE_CODE (decl) == PARM_DECL
4099             && DECL_CONTEXT (decl) == NULL_TREE
4100             && !cp_unevaluated_operand)
4101           {
4102             *error_msg = G_("use of parameter outside function body");
4103             return error_mark_node;
4104           }
4105     }
4106 
4107   /* If we didn't find anything, or what we found was a type,
4108      then this wasn't really an id-expression.  */
4109   if (TREE_CODE (decl) == TEMPLATE_DECL
4110       && !DECL_FUNCTION_TEMPLATE_P (decl))
4111     {
4112       *error_msg = G_("missing template arguments");
4113       return error_mark_node;
4114     }
4115   else if (TREE_CODE (decl) == TYPE_DECL
4116              || TREE_CODE (decl) == NAMESPACE_DECL)
4117     {
4118       *error_msg = G_("expected primary-expression");
4119       return error_mark_node;
4120     }
4121 
4122   /* If the name resolved to a template parameter, there is no
4123      need to look it up again later.  */
4124   if ((TREE_CODE (decl) == CONST_DECL && DECL_TEMPLATE_PARM_P (decl))
4125       || TREE_CODE (decl) == TEMPLATE_PARM_INDEX)
4126     {
4127       tree r;
4128 
4129       *idk = CP_ID_KIND_NONE;
4130       if (TREE_CODE (decl) == TEMPLATE_PARM_INDEX)
4131           decl = TEMPLATE_PARM_DECL (decl);
4132       r = DECL_INITIAL (decl);
4133       if (CLASS_TYPE_P (TREE_TYPE (r)) && !CP_TYPE_CONST_P (TREE_TYPE (r)))
4134           {
4135             /* If the entity is a template parameter object for a template
4136                parameter of type T, the type of the expression is const T.  */
4137             tree ctype = TREE_TYPE (r);
4138             ctype = cp_build_qualified_type (ctype, (cp_type_quals (ctype)
4139                                                                | TYPE_QUAL_CONST));
4140             r = build1 (VIEW_CONVERT_EXPR, ctype, r);
4141           }
4142       r = convert_from_reference (r);
4143       if (integral_constant_expression_p
4144             && !dependent_type_p (TREE_TYPE (decl))
4145             && !(INTEGRAL_OR_ENUMERATION_TYPE_P (TREE_TYPE (r))))
4146           {
4147             if (!allow_non_integral_constant_expression_p)
4148               error ("template parameter %qD of type %qT is not allowed in "
4149                        "an integral constant expression because it is not of "
4150                        "integral or enumeration type", decl, TREE_TYPE (decl));
4151             *non_integral_constant_expression_p = true;
4152           }
4153       return r;
4154     }
4155   else
4156     {
4157       bool dependent_p = type_dependent_expression_p (decl);
4158 
4159       /* If the declaration was explicitly qualified indicate
4160            that.  The semantics of `A::f(3)' are different than
4161            `f(3)' if `f' is virtual.  */
4162       *idk = (scope
4163                 ? CP_ID_KIND_QUALIFIED
4164                 : (TREE_CODE (decl) == TEMPLATE_ID_EXPR
4165                      ? CP_ID_KIND_TEMPLATE_ID
4166                      : (dependent_p
4167                         ? CP_ID_KIND_UNQUALIFIED_DEPENDENT
4168                         : CP_ID_KIND_UNQUALIFIED)));
4169 
4170       if (dependent_p
4171             && !scope
4172             && DECL_P (decl)
4173             && any_dependent_type_attributes_p (DECL_ATTRIBUTES (decl)))
4174           /* Dependent type attributes on the decl mean that the TREE_TYPE is
4175              wrong, so just return the identifier.  */
4176           return id_expression;
4177 
4178       if (DECL_CLASS_TEMPLATE_P (decl))
4179           {
4180             error ("use of class template %qT as expression", decl);
4181             return error_mark_node;
4182           }
4183 
4184       if (TREE_CODE (decl) == TREE_LIST)
4185           {
4186             /* Ambiguous reference to base members.  */
4187             error ("request for member %qD is ambiguous in "
4188                      "multiple inheritance lattice", id_expression);
4189             print_candidates (decl);
4190             return error_mark_node;
4191           }
4192 
4193       /* Mark variable-like entities as used.  Functions are similarly
4194            marked either below or after overload resolution.  */
4195       if ((VAR_P (decl)
4196              || TREE_CODE (decl) == PARM_DECL
4197              || TREE_CODE (decl) == CONST_DECL
4198              || TREE_CODE (decl) == RESULT_DECL)
4199             && !mark_used (decl))
4200           return error_mark_node;
4201 
4202       /* Only certain kinds of names are allowed in constant
4203            expression.  Template parameters have already
4204            been handled above.  */
4205       if (! error_operand_p (decl)
4206             && !dependent_p
4207             && integral_constant_expression_p
4208             && !decl_constant_var_p (decl)
4209             && TREE_CODE (decl) != CONST_DECL
4210             && !builtin_valid_in_constant_expr_p (decl)
4211             && !concept_check_p (decl))
4212           {
4213             if (!allow_non_integral_constant_expression_p)
4214               {
4215                 error ("%qD cannot appear in a constant-expression", decl);
4216                 return error_mark_node;
4217               }
4218             *non_integral_constant_expression_p = true;
4219           }
4220 
4221       if (tree wrap = maybe_get_tls_wrapper_call (decl))
4222           /* Replace an evaluated use of the thread_local variable with
4223              a call to its wrapper.  */
4224           decl = wrap;
4225       else if (TREE_CODE (decl) == TEMPLATE_ID_EXPR
4226                  && !dependent_p
4227                  && variable_template_p (TREE_OPERAND (decl, 0))
4228                  && !concept_check_p (decl))
4229           {
4230             decl = finish_template_variable (decl);
4231             mark_used (decl);
4232             decl = convert_from_reference (decl);
4233           }
4234       else if (concept_check_p (decl))
4235           {
4236             /* Nothing more to do. All of the analysis for concept checks
4237                is done by build_conept_id, called from the parser.  */
4238           }
4239       else if (scope)
4240           {
4241             if (TREE_CODE (decl) == SCOPE_REF)
4242               {
4243                 gcc_assert (same_type_p (scope, TREE_OPERAND (decl, 0)));
4244                 decl = TREE_OPERAND (decl, 1);
4245               }
4246 
4247             decl = (adjust_result_of_qualified_name_lookup
4248                       (decl, scope, current_nonlambda_class_type()));
4249 
4250             cp_warn_deprecated_use_scopes (scope);
4251 
4252             if (TYPE_P (scope))
4253               decl = finish_qualified_id_expr (scope,
4254                                                        decl,
4255                                                        done,
4256                                                        address_p,
4257                                                        template_p,
4258                                                        template_arg_p,
4259                                                        tf_warning_or_error);
4260             else
4261               decl = convert_from_reference (decl);
4262           }
4263       else if (TREE_CODE (decl) == FIELD_DECL)
4264           {
4265             /* Since SCOPE is NULL here, this is an unqualified name.
4266                Access checking has been performed during name lookup
4267                already.  Turn off checking to avoid duplicate errors.  */
4268             push_deferring_access_checks (dk_no_check);
4269             decl = finish_non_static_data_member (decl, NULL_TREE,
4270                                                             /*qualifying_scope=*/NULL_TREE);
4271             pop_deferring_access_checks ();
4272           }
4273       else if (is_overloaded_fn (decl))
4274           {
4275             /* We only need to look at the first function,
4276                because all the fns share the attribute we're
4277                concerned with (all member fns or all non-members).  */
4278             tree first_fn = get_first_fn (decl);
4279             first_fn = STRIP_TEMPLATE (first_fn);
4280 
4281             if (!template_arg_p
4282                 && (TREE_CODE (first_fn) == USING_DECL
4283                       || (TREE_CODE (first_fn) == FUNCTION_DECL
4284                           && DECL_FUNCTION_MEMBER_P (first_fn)
4285                           && !shared_member_p (decl))))
4286               {
4287                 /* A set of member functions.  */
4288                 decl = maybe_dummy_object (DECL_CONTEXT (first_fn), 0);
4289                 return finish_class_member_access_expr (decl, id_expression,
4290                                                                   /*template_p=*/false,
4291                                                                   tf_warning_or_error);
4292               }
4293 
4294             decl = baselink_for_fns (decl);
4295           }
4296       else
4297           {
4298             if (DECL_P (decl) && DECL_NONLOCAL (decl)
4299                 && DECL_CLASS_SCOPE_P (decl))
4300               {
4301                 tree context = context_for_name_lookup (decl);
4302                 if (context != current_class_type)
4303                     {
4304                       tree path = currently_open_derived_class (context);
4305                       if (!path)
4306                         /* PATH can be null for using an enum of an unrelated
4307                            class; we checked its access in lookup_using_decl.
4308 
4309                            ??? Should this case make a clone instead, like
4310                            handle_using_decl?  */
4311                         gcc_assert (TREE_CODE (decl) == CONST_DECL);
4312                       else
4313                         perform_or_defer_access_check (TYPE_BINFO (path),
4314                                                                decl, decl,
4315                                                                tf_warning_or_error);
4316                     }
4317               }
4318 
4319             decl = convert_from_reference (decl);
4320           }
4321     }
4322 
4323   return cp_expr (decl, location);
4324 }
4325 
4326 /* As per finish_id_expression_1, but adding a wrapper node
4327    around the result if needed to express LOCATION.  */
4328 
4329 cp_expr
finish_id_expression(tree id_expression,tree decl,tree scope,cp_id_kind * idk,bool integral_constant_expression_p,bool allow_non_integral_constant_expression_p,bool * non_integral_constant_expression_p,bool template_p,bool done,bool address_p,bool template_arg_p,const char ** error_msg,location_t location)4330 finish_id_expression (tree id_expression,
4331                           tree decl,
4332                           tree scope,
4333                           cp_id_kind *idk,
4334                           bool integral_constant_expression_p,
4335                           bool allow_non_integral_constant_expression_p,
4336                           bool *non_integral_constant_expression_p,
4337                           bool template_p,
4338                           bool done,
4339                           bool address_p,
4340                           bool template_arg_p,
4341                           const char **error_msg,
4342                           location_t location)
4343 {
4344   cp_expr result
4345     = finish_id_expression_1 (id_expression, decl, scope, idk,
4346                                     integral_constant_expression_p,
4347                                     allow_non_integral_constant_expression_p,
4348                                     non_integral_constant_expression_p,
4349                                     template_p, done, address_p, template_arg_p,
4350                                     error_msg, location);
4351   return result.maybe_add_location_wrapper ();
4352 }
4353 
4354 /* Implement the __typeof keyword: Return the type of EXPR, suitable for
4355    use as a type-specifier.  */
4356 
4357 tree
finish_typeof(tree expr)4358 finish_typeof (tree expr)
4359 {
4360   tree type;
4361 
4362   if (type_dependent_expression_p (expr))
4363     {
4364       type = cxx_make_type (TYPEOF_TYPE);
4365       TYPEOF_TYPE_EXPR (type) = expr;
4366       SET_TYPE_STRUCTURAL_EQUALITY (type);
4367 
4368       return type;
4369     }
4370 
4371   expr = mark_type_use (expr);
4372 
4373   type = unlowered_expr_type (expr);
4374 
4375   if (!type || type == unknown_type_node)
4376     {
4377       error ("type of %qE is unknown", expr);
4378       return error_mark_node;
4379     }
4380 
4381   return type;
4382 }
4383 
4384 /* Implement the __underlying_type keyword: Return the underlying
4385    type of TYPE, suitable for use as a type-specifier.  */
4386 
4387 tree
finish_underlying_type(tree type)4388 finish_underlying_type (tree type)
4389 {
4390   tree underlying_type;
4391 
4392   if (processing_template_decl)
4393     {
4394       underlying_type = cxx_make_type (UNDERLYING_TYPE);
4395       UNDERLYING_TYPE_TYPE (underlying_type) = type;
4396       SET_TYPE_STRUCTURAL_EQUALITY (underlying_type);
4397 
4398       return underlying_type;
4399     }
4400 
4401   if (!complete_type_or_else (type, NULL_TREE))
4402     return error_mark_node;
4403 
4404   if (TREE_CODE (type) != ENUMERAL_TYPE)
4405     {
4406       error ("%qT is not an enumeration type", type);
4407       return error_mark_node;
4408     }
4409 
4410   underlying_type = ENUM_UNDERLYING_TYPE (type);
4411 
4412   /* Fixup necessary in this case because ENUM_UNDERLYING_TYPE
4413      includes TYPE_MIN_VALUE and TYPE_MAX_VALUE information.
4414      See finish_enum_value_list for details.  */
4415   if (!ENUM_FIXED_UNDERLYING_TYPE_P (type))
4416     underlying_type
4417       = c_common_type_for_mode (TYPE_MODE (underlying_type),
4418                                         TYPE_UNSIGNED (underlying_type));
4419 
4420   return underlying_type;
4421 }
4422 
4423 /* Implement the __direct_bases keyword: Return the direct base classes
4424    of type.  */
4425 
4426 tree
calculate_direct_bases(tree type,tsubst_flags_t complain)4427 calculate_direct_bases (tree type, tsubst_flags_t complain)
4428 {
4429   if (!complete_type_or_maybe_complain (type, NULL_TREE, complain)
4430       || !NON_UNION_CLASS_TYPE_P (type))
4431     return make_tree_vec (0);
4432 
4433   releasing_vec vector;
4434   vec<tree, va_gc> *base_binfos = BINFO_BASE_BINFOS (TYPE_BINFO (type));
4435   tree binfo;
4436   unsigned i;
4437 
4438   /* Virtual bases are initialized first */
4439   for (i = 0; base_binfos->iterate (i, &binfo); i++)
4440     if (BINFO_VIRTUAL_P (binfo))
4441       vec_safe_push (vector, binfo);
4442 
4443   /* Now non-virtuals */
4444   for (i = 0; base_binfos->iterate (i, &binfo); i++)
4445     if (!BINFO_VIRTUAL_P (binfo))
4446       vec_safe_push (vector, binfo);
4447 
4448   tree bases_vec = make_tree_vec (vector->length ());
4449 
4450   for (i = 0; i < vector->length (); ++i)
4451     TREE_VEC_ELT (bases_vec, i) = BINFO_TYPE ((*vector)[i]);
4452 
4453   return bases_vec;
4454 }
4455 
4456 /* Implement the __bases keyword: Return the base classes
4457    of type */
4458 
4459 /* Find morally non-virtual base classes by walking binfo hierarchy */
4460 /* Virtual base classes are handled separately in finish_bases */
4461 
4462 static tree
dfs_calculate_bases_pre(tree binfo,void *)4463 dfs_calculate_bases_pre (tree binfo, void * /*data_*/)
4464 {
4465   /* Don't walk bases of virtual bases */
4466   return BINFO_VIRTUAL_P (binfo) ? dfs_skip_bases : NULL_TREE;
4467 }
4468 
4469 static tree
dfs_calculate_bases_post(tree binfo,void * data_)4470 dfs_calculate_bases_post (tree binfo, void *data_)
4471 {
4472   vec<tree, va_gc> **data = ((vec<tree, va_gc> **) data_);
4473   if (!BINFO_VIRTUAL_P (binfo))
4474     vec_safe_push (*data, BINFO_TYPE (binfo));
4475   return NULL_TREE;
4476 }
4477 
4478 /* Calculates the morally non-virtual base classes of a class */
4479 static vec<tree, va_gc> *
calculate_bases_helper(tree type)4480 calculate_bases_helper (tree type)
4481 {
4482   vec<tree, va_gc> *vector = make_tree_vector ();
4483 
4484   /* Now add non-virtual base classes in order of construction */
4485   if (TYPE_BINFO (type))
4486     dfs_walk_all (TYPE_BINFO (type),
4487                       dfs_calculate_bases_pre, dfs_calculate_bases_post, &vector);
4488   return vector;
4489 }
4490 
4491 tree
calculate_bases(tree type,tsubst_flags_t complain)4492 calculate_bases (tree type, tsubst_flags_t complain)
4493 {
4494   if (!complete_type_or_maybe_complain (type, NULL_TREE, complain)
4495       || !NON_UNION_CLASS_TYPE_P (type))
4496     return make_tree_vec (0);
4497 
4498   releasing_vec vector;
4499   tree bases_vec = NULL_TREE;
4500   unsigned i;
4501   vec<tree, va_gc> *vbases;
4502   tree binfo;
4503 
4504   /* First go through virtual base classes */
4505   for (vbases = CLASSTYPE_VBASECLASSES (type), i = 0;
4506        vec_safe_iterate (vbases, i, &binfo); i++)
4507     {
4508       releasing_vec vbase_bases
4509           = calculate_bases_helper (BINFO_TYPE (binfo));
4510       vec_safe_splice (vector, vbase_bases);
4511     }
4512 
4513   /* Now for the non-virtual bases */
4514   releasing_vec nonvbases = calculate_bases_helper (type);
4515   vec_safe_splice (vector, nonvbases);
4516 
4517   /* Note that during error recovery vector->length can even be zero.  */
4518   if (vector->length () > 1)
4519     {
4520       /* Last element is entire class, so don't copy */
4521       bases_vec = make_tree_vec (vector->length () - 1);
4522 
4523       for (i = 0; i < vector->length () - 1; ++i)
4524           TREE_VEC_ELT (bases_vec, i) = (*vector)[i];
4525     }
4526   else
4527     bases_vec = make_tree_vec (0);
4528 
4529   return bases_vec;
4530 }
4531 
4532 tree
finish_bases(tree type,bool direct)4533 finish_bases (tree type, bool direct)
4534 {
4535   tree bases = NULL_TREE;
4536 
4537   if (!processing_template_decl)
4538     {
4539       /* Parameter packs can only be used in templates */
4540       error ("parameter pack %<__bases%> only valid in template declaration");
4541       return error_mark_node;
4542     }
4543 
4544   bases = cxx_make_type (BASES);
4545   BASES_TYPE (bases) = type;
4546   BASES_DIRECT (bases) = direct;
4547   SET_TYPE_STRUCTURAL_EQUALITY (bases);
4548 
4549   return bases;
4550 }
4551 
4552 /* Perform C++-specific checks for __builtin_offsetof before calling
4553    fold_offsetof.  */
4554 
4555 tree
finish_offsetof(tree object_ptr,tree expr,location_t loc)4556 finish_offsetof (tree object_ptr, tree expr, location_t loc)
4557 {
4558   /* If we're processing a template, we can't finish the semantics yet.
4559      Otherwise we can fold the entire expression now.  */
4560   if (processing_template_decl)
4561     {
4562       expr = build2 (OFFSETOF_EXPR, size_type_node, expr, object_ptr);
4563       SET_EXPR_LOCATION (expr, loc);
4564       return expr;
4565     }
4566 
4567   if (expr == error_mark_node)
4568     return error_mark_node;
4569 
4570   if (TREE_CODE (expr) == PSEUDO_DTOR_EXPR)
4571     {
4572       error ("cannot apply %<offsetof%> to destructor %<~%T%>",
4573                 TREE_OPERAND (expr, 2));
4574       return error_mark_node;
4575     }
4576   if (FUNC_OR_METHOD_TYPE_P (TREE_TYPE (expr))
4577       || TREE_TYPE (expr) == unknown_type_node)
4578     {
4579       while (TREE_CODE (expr) == COMPONENT_REF
4580                || TREE_CODE (expr) == COMPOUND_EXPR)
4581           expr = TREE_OPERAND (expr, 1);
4582 
4583       if (DECL_P (expr))
4584           {
4585             error ("cannot apply %<offsetof%> to member function %qD", expr);
4586             inform (DECL_SOURCE_LOCATION (expr), "declared here");
4587           }
4588       else
4589           error ("cannot apply %<offsetof%> to member function");
4590       return error_mark_node;
4591     }
4592   if (TREE_CODE (expr) == CONST_DECL)
4593     {
4594       error ("cannot apply %<offsetof%> to an enumerator %qD", expr);
4595       return error_mark_node;
4596     }
4597   if (REFERENCE_REF_P (expr))
4598     expr = TREE_OPERAND (expr, 0);
4599   if (!complete_type_or_else (TREE_TYPE (TREE_TYPE (object_ptr)), object_ptr))
4600     return error_mark_node;
4601   if (warn_invalid_offsetof
4602       && CLASS_TYPE_P (TREE_TYPE (TREE_TYPE (object_ptr)))
4603       && CLASSTYPE_NON_STD_LAYOUT (TREE_TYPE (TREE_TYPE (object_ptr)))
4604       && cp_unevaluated_operand == 0)
4605     warning_at (loc, OPT_Winvalid_offsetof, "%<offsetof%> within "
4606                     "non-standard-layout type %qT is conditionally-supported",
4607                     TREE_TYPE (TREE_TYPE (object_ptr)));
4608   return fold_offsetof (expr);
4609 }
4610 
4611 /* Replace the AGGR_INIT_EXPR at *TP with an equivalent CALL_EXPR.  This
4612    function is broken out from the above for the benefit of the tree-ssa
4613    project.  */
4614 
4615 void
simplify_aggr_init_expr(tree * tp)4616 simplify_aggr_init_expr (tree *tp)
4617 {
4618   tree aggr_init_expr = *tp;
4619 
4620   /* Form an appropriate CALL_EXPR.  */
4621   tree fn = AGGR_INIT_EXPR_FN (aggr_init_expr);
4622   tree slot = AGGR_INIT_EXPR_SLOT (aggr_init_expr);
4623   tree type = TREE_TYPE (slot);
4624 
4625   tree call_expr;
4626   enum style_t { ctor, arg, pcc } style;
4627 
4628   if (AGGR_INIT_VIA_CTOR_P (aggr_init_expr))
4629     style = ctor;
4630 #ifdef PCC_STATIC_STRUCT_RETURN
4631   else if (1)
4632     style = pcc;
4633 #endif
4634   else
4635     {
4636       gcc_assert (TREE_ADDRESSABLE (type));
4637       style = arg;
4638     }
4639 
4640   call_expr = build_call_array_loc (input_location,
4641                                             TREE_TYPE (TREE_TYPE (TREE_TYPE (fn))),
4642                                             fn,
4643                                             aggr_init_expr_nargs (aggr_init_expr),
4644                                             AGGR_INIT_EXPR_ARGP (aggr_init_expr));
4645   TREE_NOTHROW (call_expr) = TREE_NOTHROW (aggr_init_expr);
4646   CALL_FROM_THUNK_P (call_expr) = AGGR_INIT_FROM_THUNK_P (aggr_init_expr);
4647   CALL_EXPR_OPERATOR_SYNTAX (call_expr)
4648     = CALL_EXPR_OPERATOR_SYNTAX (aggr_init_expr);
4649   CALL_EXPR_ORDERED_ARGS (call_expr) = CALL_EXPR_ORDERED_ARGS (aggr_init_expr);
4650   CALL_EXPR_REVERSE_ARGS (call_expr) = CALL_EXPR_REVERSE_ARGS (aggr_init_expr);
4651 
4652   if (style == ctor)
4653     {
4654       /* Replace the first argument to the ctor with the address of the
4655            slot.  */
4656       cxx_mark_addressable (slot);
4657       CALL_EXPR_ARG (call_expr, 0) =
4658           build1 (ADDR_EXPR, build_pointer_type (type), slot);
4659     }
4660   else if (style == arg)
4661     {
4662       /* Just mark it addressable here, and leave the rest to
4663            expand_call{,_inline}.  */
4664       cxx_mark_addressable (slot);
4665       CALL_EXPR_RETURN_SLOT_OPT (call_expr) = true;
4666       call_expr = build2 (INIT_EXPR, TREE_TYPE (call_expr), slot, call_expr);
4667     }
4668   else if (style == pcc)
4669     {
4670       /* If we're using the non-reentrant PCC calling convention, then we
4671            need to copy the returned value out of the static buffer into the
4672            SLOT.  */
4673       push_deferring_access_checks (dk_no_check);
4674       call_expr = build_aggr_init (slot, call_expr,
4675                                            DIRECT_BIND | LOOKUP_ONLYCONVERTING,
4676                                    tf_warning_or_error);
4677       pop_deferring_access_checks ();
4678       call_expr = build2 (COMPOUND_EXPR, TREE_TYPE (slot), call_expr, slot);
4679     }
4680 
4681   if (AGGR_INIT_ZERO_FIRST (aggr_init_expr))
4682     {
4683       tree init = build_zero_init (type, NULL_TREE,
4684                                            /*static_storage_p=*/false);
4685       init = build2 (INIT_EXPR, void_type_node, slot, init);
4686       call_expr = build2 (COMPOUND_EXPR, TREE_TYPE (call_expr),
4687                                 init, call_expr);
4688     }
4689 
4690   *tp = call_expr;
4691 }
4692 
4693 /* Emit all thunks to FN that should be emitted when FN is emitted.  */
4694 
4695 void
emit_associated_thunks(tree fn)4696 emit_associated_thunks (tree fn)
4697 {
4698   /* When we use vcall offsets, we emit thunks with the virtual
4699      functions to which they thunk. The whole point of vcall offsets
4700      is so that you can know statically the entire set of thunks that
4701      will ever be needed for a given virtual function, thereby
4702      enabling you to output all the thunks with the function itself.  */
4703   if (DECL_VIRTUAL_P (fn)
4704       /* Do not emit thunks for extern template instantiations.  */
4705       && ! DECL_REALLY_EXTERN (fn))
4706     {
4707       tree thunk;
4708 
4709       for (thunk = DECL_THUNKS (fn); thunk; thunk = DECL_CHAIN (thunk))
4710           {
4711             if (!THUNK_ALIAS (thunk))
4712               {
4713                 use_thunk (thunk, /*emit_p=*/1);
4714                 if (DECL_RESULT_THUNK_P (thunk))
4715                     {
4716                       tree probe;
4717 
4718                       for (probe = DECL_THUNKS (thunk);
4719                            probe; probe = DECL_CHAIN (probe))
4720                         use_thunk (probe, /*emit_p=*/1);
4721                     }
4722               }
4723             else
4724               gcc_assert (!DECL_THUNKS (thunk));
4725           }
4726     }
4727 }
4728 
4729 /* Generate RTL for FN.  */
4730 
4731 bool
expand_or_defer_fn_1(tree fn)4732 expand_or_defer_fn_1 (tree fn)
4733 {
4734   /* When the parser calls us after finishing the body of a template
4735      function, we don't really want to expand the body.  */
4736   if (processing_template_decl)
4737     {
4738       /* Normally, collection only occurs in rest_of_compilation.  So,
4739            if we don't collect here, we never collect junk generated
4740            during the processing of templates until we hit a
4741            non-template function.  It's not safe to do this inside a
4742            nested class, though, as the parser may have local state that
4743            is not a GC root.  */
4744       if (!function_depth)
4745           ggc_collect ();
4746       return false;
4747     }
4748 
4749   gcc_assert (DECL_SAVED_TREE (fn));
4750 
4751   /* We make a decision about linkage for these functions at the end
4752      of the compilation.  Until that point, we do not want the back
4753      end to output them -- but we do want it to see the bodies of
4754      these functions so that it can inline them as appropriate.  */
4755   if (DECL_DECLARED_INLINE_P (fn) || DECL_IMPLICIT_INSTANTIATION (fn))
4756     {
4757       if (DECL_INTERFACE_KNOWN (fn))
4758           /* We've already made a decision as to how this function will
4759              be handled.  */;
4760       else if (!at_eof
4761                  || DECL_IMMEDIATE_FUNCTION_P (fn)
4762                  || DECL_OMP_DECLARE_REDUCTION_P (fn))
4763           tentative_decl_linkage (fn);
4764       else
4765           import_export_decl (fn);
4766 
4767       /* If the user wants us to keep all inline functions, then mark
4768            this function as needed so that finish_file will make sure to
4769            output it later.  Similarly, all dllexport'd functions must
4770            be emitted; there may be callers in other DLLs.  */
4771       if (DECL_DECLARED_INLINE_P (fn)
4772             && !DECL_REALLY_EXTERN (fn)
4773             && !DECL_IMMEDIATE_FUNCTION_P (fn)
4774             && !DECL_OMP_DECLARE_REDUCTION_P (fn)
4775             && (flag_keep_inline_functions
4776                 || (flag_keep_inline_dllexport
4777                       && lookup_attribute ("dllexport", DECL_ATTRIBUTES (fn)))))
4778           {
4779             mark_needed (fn);
4780             DECL_EXTERNAL (fn) = 0;
4781           }
4782     }
4783 
4784   /* If this is a constructor or destructor body, we have to clone
4785      it.  */
4786   if (maybe_clone_body (fn))
4787     {
4788       /* We don't want to process FN again, so pretend we've written
4789            it out, even though we haven't.  */
4790       TREE_ASM_WRITTEN (fn) = 1;
4791       /* If this is a constexpr function, keep DECL_SAVED_TREE.  */
4792       if (!DECL_DECLARED_CONSTEXPR_P (fn)
4793             && !(modules_p () && DECL_DECLARED_INLINE_P (fn)))
4794           DECL_SAVED_TREE (fn) = NULL_TREE;
4795       return false;
4796     }
4797 
4798   /* There's no reason to do any of the work here if we're only doing
4799      semantic analysis; this code just generates RTL.  */
4800   if (flag_syntax_only)
4801     {
4802       /* Pretend that this function has been written out so that we don't try
4803            to expand it again.  */
4804       TREE_ASM_WRITTEN (fn) = 1;
4805       return false;
4806     }
4807 
4808   if (DECL_OMP_DECLARE_REDUCTION_P (fn))
4809     return false;
4810 
4811   return true;
4812 }
4813 
4814 void
expand_or_defer_fn(tree fn)4815 expand_or_defer_fn (tree fn)
4816 {
4817   if (expand_or_defer_fn_1 (fn))
4818     {
4819       function_depth++;
4820 
4821       /* Expand or defer, at the whim of the compilation unit manager.  */
4822       cgraph_node::finalize_function (fn, function_depth > 1);
4823       emit_associated_thunks (fn);
4824 
4825       function_depth--;
4826 
4827       if (DECL_IMMEDIATE_FUNCTION_P (fn))
4828           {
4829             if (cgraph_node *node = cgraph_node::get (fn))
4830               {
4831                 node->body_removed = true;
4832                 node->analyzed = false;
4833                 node->definition = false;
4834                 node->force_output = false;
4835               }
4836           }
4837     }
4838 }
4839 
4840 class nrv_data
4841 {
4842 public:
nrv_data()4843   nrv_data () : visited (37) {}
4844 
4845   tree var;
4846   tree result;
4847   hash_table<nofree_ptr_hash <tree_node> > visited;
4848   bool in_nrv_cleanup;
4849 };
4850 
4851 /* Helper function for walk_tree, used by finalize_nrv below.  */
4852 
4853 static tree
finalize_nrv_r(tree * tp,int * walk_subtrees,void * data)4854 finalize_nrv_r (tree* tp, int* walk_subtrees, void* data)
4855 {
4856   class nrv_data *dp = (class nrv_data *)data;
4857   tree_node **slot;
4858 
4859   /* No need to walk into types.  There wouldn't be any need to walk into
4860      non-statements, except that we have to consider STMT_EXPRs.  */
4861   if (TYPE_P (*tp))
4862     *walk_subtrees = 0;
4863   /* Change all returns to just refer to the RESULT_DECL; this is a nop,
4864      but differs from using NULL_TREE in that it indicates that we care
4865      about the value of the RESULT_DECL.  But preserve anything appended
4866      by check_return_expr.  */
4867   else if (TREE_CODE (*tp) == RETURN_EXPR)
4868     {
4869       tree *p = &TREE_OPERAND (*tp, 0);
4870       while (TREE_CODE (*p) == COMPOUND_EXPR)
4871           p = &TREE_OPERAND (*p, 0);
4872       gcc_checking_assert (TREE_CODE (*p) == INIT_EXPR
4873                                  && TREE_OPERAND (*p, 0) == dp->result);
4874       *p = dp->result;
4875     }
4876   /* Change all cleanups for the NRV to only run when an exception is
4877      thrown.  */
4878   else if (TREE_CODE (*tp) == CLEANUP_STMT
4879              && CLEANUP_DECL (*tp) == dp->var)
4880     {
4881       dp->in_nrv_cleanup = true;
4882       cp_walk_tree (&CLEANUP_BODY (*tp), finalize_nrv_r, data, 0);
4883       dp->in_nrv_cleanup = false;
4884       cp_walk_tree (&CLEANUP_EXPR (*tp), finalize_nrv_r, data, 0);
4885       *walk_subtrees = 0;
4886 
4887       CLEANUP_EH_ONLY (*tp) = true;
4888 
4889       /* If a cleanup might throw, we need to clear current_retval_sentinel on
4890            the exception path so an outer cleanup added by
4891            maybe_splice_retval_cleanup doesn't run.  */
4892       if (current_retval_sentinel
4893             && cp_function_chain->throwing_cleanup)
4894           {
4895             tree clear = build2 (MODIFY_EXPR, boolean_type_node,
4896                                      current_retval_sentinel,
4897                                      boolean_false_node);
4898 
4899             /* We're already only on the EH path, just prepend it.  */
4900             tree &exp = CLEANUP_EXPR (*tp);
4901             exp = build2 (COMPOUND_EXPR, void_type_node, clear, exp);
4902           }
4903     }
4904   /* Disable maybe_splice_retval_cleanup within the NRV cleanup scope, we don't
4905      want to destroy the retval before the variable goes out of scope.  */
4906   else if (TREE_CODE (*tp) == CLEANUP_STMT
4907              && dp->in_nrv_cleanup
4908              && CLEANUP_DECL (*tp) == dp->result)
4909     CLEANUP_EXPR (*tp) = void_node;
4910   /* Replace the DECL_EXPR for the NRV with an initialization of the
4911      RESULT_DECL, if needed.  */
4912   else if (TREE_CODE (*tp) == DECL_EXPR
4913              && DECL_EXPR_DECL (*tp) == dp->var)
4914     {
4915       tree init;
4916       if (DECL_INITIAL (dp->var)
4917             && DECL_INITIAL (dp->var) != error_mark_node)
4918           init = build2 (INIT_EXPR, void_type_node, dp->result,
4919                            DECL_INITIAL (dp->var));
4920       else
4921           init = build_empty_stmt (EXPR_LOCATION (*tp));
4922       DECL_INITIAL (dp->var) = NULL_TREE;
4923       SET_EXPR_LOCATION (init, EXPR_LOCATION (*tp));
4924       *tp = init;
4925     }
4926   /* And replace all uses of the NRV with the RESULT_DECL.  */
4927   else if (*tp == dp->var)
4928     *tp = dp->result;
4929 
4930   /* Avoid walking into the same tree more than once.  Unfortunately, we
4931      can't just use walk_tree_without duplicates because it would only call
4932      us for the first occurrence of dp->var in the function body.  */
4933   slot = dp->visited.find_slot (*tp, INSERT);
4934   if (*slot)
4935     *walk_subtrees = 0;
4936   else
4937     *slot = *tp;
4938 
4939   /* Keep iterating.  */
4940   return NULL_TREE;
4941 }
4942 
4943 /* Called from finish_function to implement the named return value
4944    optimization by overriding all the RETURN_EXPRs and pertinent
4945    CLEANUP_STMTs and replacing all occurrences of VAR with RESULT, the
4946    RESULT_DECL for the function.  */
4947 
4948 void
finalize_nrv(tree * tp,tree var,tree result)4949 finalize_nrv (tree *tp, tree var, tree result)
4950 {
4951   class nrv_data data;
4952 
4953   /* Copy name from VAR to RESULT.  */
4954   DECL_NAME (result) = DECL_NAME (var);
4955   /* Don't forget that we take its address.  */
4956   TREE_ADDRESSABLE (result) = TREE_ADDRESSABLE (var);
4957   /* Finally set DECL_VALUE_EXPR to avoid assigning
4958      a stack slot at -O0 for the original var and debug info
4959      uses RESULT location for VAR.  */
4960   SET_DECL_VALUE_EXPR (var, result);
4961   DECL_HAS_VALUE_EXPR_P (var) = 1;
4962 
4963   data.var = var;
4964   data.result = result;
4965   data.in_nrv_cleanup = false;
4966   cp_walk_tree (tp, finalize_nrv_r, &data, 0);
4967 }
4968 
4969 /* Create CP_OMP_CLAUSE_INFO for clause C.  Returns true if it is invalid.  */
4970 
4971 bool
cxx_omp_create_clause_info(tree c,tree type,bool need_default_ctor,bool need_copy_ctor,bool need_copy_assignment,bool need_dtor)4972 cxx_omp_create_clause_info (tree c, tree type, bool need_default_ctor,
4973                                   bool need_copy_ctor, bool need_copy_assignment,
4974                                   bool need_dtor)
4975 {
4976   int save_errorcount = errorcount;
4977   tree info, t;
4978 
4979   /* Always allocate 3 elements for simplicity.  These are the
4980      function decls for the ctor, dtor, and assignment op.
4981      This layout is known to the three lang hooks,
4982      cxx_omp_clause_default_init, cxx_omp_clause_copy_init,
4983      and cxx_omp_clause_assign_op.  */
4984   info = make_tree_vec (3);
4985   CP_OMP_CLAUSE_INFO (c) = info;
4986 
4987   if (need_default_ctor || need_copy_ctor)
4988     {
4989       if (need_default_ctor)
4990           t = get_default_ctor (type);
4991       else
4992           t = get_copy_ctor (type, tf_warning_or_error);
4993 
4994       if (t && !trivial_fn_p (t))
4995           TREE_VEC_ELT (info, 0) = t;
4996     }
4997 
4998   if (need_dtor && TYPE_HAS_NONTRIVIAL_DESTRUCTOR (type))
4999     TREE_VEC_ELT (info, 1) = get_dtor (type, tf_warning_or_error);
5000 
5001   if (need_copy_assignment)
5002     {
5003       t = get_copy_assign (type);
5004 
5005       if (t && !trivial_fn_p (t))
5006           TREE_VEC_ELT (info, 2) = t;
5007     }
5008 
5009   return errorcount != save_errorcount;
5010 }
5011 
5012 /* If DECL is DECL_OMP_PRIVATIZED_MEMBER, return corresponding
5013    FIELD_DECL, otherwise return DECL itself.  */
5014 
5015 static tree
omp_clause_decl_field(tree decl)5016 omp_clause_decl_field (tree decl)
5017 {
5018   if (VAR_P (decl)
5019       && DECL_HAS_VALUE_EXPR_P (decl)
5020       && DECL_ARTIFICIAL (decl)
5021       && DECL_LANG_SPECIFIC (decl)
5022       && DECL_OMP_PRIVATIZED_MEMBER (decl))
5023     {
5024       tree f = DECL_VALUE_EXPR (decl);
5025       if (INDIRECT_REF_P (f))
5026           f = TREE_OPERAND (f, 0);
5027       if (TREE_CODE (f) == COMPONENT_REF)
5028           {
5029             f = TREE_OPERAND (f, 1);
5030             gcc_assert (TREE_CODE (f) == FIELD_DECL);
5031             return f;
5032           }
5033     }
5034   return NULL_TREE;
5035 }
5036 
5037 /* Adjust DECL if needed for printing using %qE.  */
5038 
5039 static tree
omp_clause_printable_decl(tree decl)5040 omp_clause_printable_decl (tree decl)
5041 {
5042   tree t = omp_clause_decl_field (decl);
5043   if (t)
5044     return t;
5045   return decl;
5046 }
5047 
5048 /* For a FIELD_DECL F and corresponding DECL_OMP_PRIVATIZED_MEMBER
5049    VAR_DECL T that doesn't need a DECL_EXPR added, record it for
5050    privatization.  */
5051 
5052 static void
omp_note_field_privatization(tree f,tree t)5053 omp_note_field_privatization (tree f, tree t)
5054 {
5055   if (!omp_private_member_map)
5056     omp_private_member_map = new hash_map<tree, tree>;
5057   tree &v = omp_private_member_map->get_or_insert (f);
5058   if (v == NULL_TREE)
5059     {
5060       v = t;
5061       omp_private_member_vec.safe_push (f);
5062       /* Signal that we don't want to create DECL_EXPR for this dummy var.  */
5063       omp_private_member_vec.safe_push (integer_zero_node);
5064     }
5065 }
5066 
5067 /* Privatize FIELD_DECL T, return corresponding DECL_OMP_PRIVATIZED_MEMBER
5068    dummy VAR_DECL.  */
5069 
5070 tree
omp_privatize_field(tree t,bool shared)5071 omp_privatize_field (tree t, bool shared)
5072 {
5073   tree m = finish_non_static_data_member (t, NULL_TREE, NULL_TREE);
5074   if (m == error_mark_node)
5075     return error_mark_node;
5076   if (!omp_private_member_map && !shared)
5077     omp_private_member_map = new hash_map<tree, tree>;
5078   if (TYPE_REF_P (TREE_TYPE (t)))
5079     {
5080       gcc_assert (INDIRECT_REF_P (m));
5081       m = TREE_OPERAND (m, 0);
5082     }
5083   tree vb = NULL_TREE;
5084   tree &v = shared ? vb : omp_private_member_map->get_or_insert (t);
5085   if (v == NULL_TREE)
5086     {
5087       v = create_temporary_var (TREE_TYPE (m));
5088       retrofit_lang_decl (v);
5089       DECL_OMP_PRIVATIZED_MEMBER (v) = 1;
5090       SET_DECL_VALUE_EXPR (v, m);
5091       DECL_HAS_VALUE_EXPR_P (v) = 1;
5092       if (!shared)
5093           omp_private_member_vec.safe_push (t);
5094     }
5095   return v;
5096 }
5097 
5098 /* Helper function for handle_omp_array_sections.  Called recursively
5099    to handle multiple array-section-subscripts.  C is the clause,
5100    T current expression (initially OMP_CLAUSE_DECL), which is either
5101    a TREE_LIST for array-section-subscript (TREE_PURPOSE is low-bound
5102    expression if specified, TREE_VALUE length expression if specified,
5103    TREE_CHAIN is what it has been specified after, or some decl.
5104    TYPES vector is populated with array section types, MAYBE_ZERO_LEN
5105    set to true if any of the array-section-subscript could have length
5106    of zero (explicit or implicit), FIRST_NON_ONE is the index of the
5107    first array-section-subscript which is known not to have length
5108    of one.  Given say:
5109    map(a[:b][2:1][:c][:2][:d][e:f][2:5])
5110    FIRST_NON_ONE will be 3, array-section-subscript [:b], [2:1] and [:c]
5111    all are or may have length of 1, array-section-subscript [:2] is the
5112    first one known not to have length 1.  For array-section-subscript
5113    <= FIRST_NON_ONE we diagnose non-contiguous arrays if low bound isn't
5114    0 or length isn't the array domain max + 1, for > FIRST_NON_ONE we
5115    can if MAYBE_ZERO_LEN is false.  MAYBE_ZERO_LEN will be true in the above
5116    case though, as some lengths could be zero.  */
5117 
5118 static tree
handle_omp_array_sections_1(tree c,tree t,vec<tree> & types,bool & maybe_zero_len,unsigned int & first_non_one,enum c_omp_region_type ort)5119 handle_omp_array_sections_1 (tree c, tree t, vec<tree> &types,
5120                                    bool &maybe_zero_len, unsigned int &first_non_one,
5121                                    enum c_omp_region_type ort)
5122 {
5123   tree ret, low_bound, length, type;
5124   if (TREE_CODE (t) != TREE_LIST)
5125     {
5126       if (error_operand_p (t))
5127           return error_mark_node;
5128       if (REFERENCE_REF_P (t)
5129             && TREE_CODE (TREE_OPERAND (t, 0)) == COMPONENT_REF)
5130           t = TREE_OPERAND (t, 0);
5131       ret = t;
5132       while (TREE_CODE (t) == INDIRECT_REF)
5133           {
5134             t = TREE_OPERAND (t, 0);
5135             STRIP_NOPS (t);
5136             if (TREE_CODE (t) == POINTER_PLUS_EXPR)
5137               t = TREE_OPERAND (t, 0);
5138           }
5139       while (TREE_CODE (t) == COMPOUND_EXPR)
5140           {
5141             t = TREE_OPERAND (t, 1);
5142             STRIP_NOPS (t);
5143           }
5144       if (TREE_CODE (t) == COMPONENT_REF
5145             && (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
5146                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO
5147                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FROM)
5148             && !type_dependent_expression_p (t))
5149           {
5150             if (TREE_CODE (TREE_OPERAND (t, 1)) == FIELD_DECL
5151                 && DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
5152               {
5153                 error_at (OMP_CLAUSE_LOCATION (c),
5154                               "bit-field %qE in %qs clause",
5155                               t, omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5156                 return error_mark_node;
5157               }
5158             while (TREE_CODE (t) == COMPONENT_REF)
5159               {
5160                 if (TREE_TYPE (TREE_OPERAND (t, 0))
5161                       && TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0))) == UNION_TYPE)
5162                     {
5163                       error_at (OMP_CLAUSE_LOCATION (c),
5164                                   "%qE is a member of a union", t);
5165                       return error_mark_node;
5166                     }
5167                 t = TREE_OPERAND (t, 0);
5168                 while (TREE_CODE (t) == MEM_REF
5169                          || TREE_CODE (t) == INDIRECT_REF
5170                          || TREE_CODE (t) == ARRAY_REF)
5171                     {
5172                       t = TREE_OPERAND (t, 0);
5173                       STRIP_NOPS (t);
5174                       if (TREE_CODE (t) == POINTER_PLUS_EXPR)
5175                         t = TREE_OPERAND (t, 0);
5176                     }
5177               }
5178             if (REFERENCE_REF_P (t))
5179               t = TREE_OPERAND (t, 0);
5180           }
5181       if (TREE_CODE (t) == FIELD_DECL)
5182           ret = finish_non_static_data_member (t, NULL_TREE, NULL_TREE);
5183       else if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
5184           {
5185             if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
5186               return NULL_TREE;
5187             if (DECL_P (t))
5188               error_at (OMP_CLAUSE_LOCATION (c),
5189                           "%qD is not a variable in %qs clause", t,
5190                           omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5191             else
5192               error_at (OMP_CLAUSE_LOCATION (c),
5193                           "%qE is not a variable in %qs clause", t,
5194                           omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5195             return error_mark_node;
5196           }
5197       else if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_AFFINITY
5198                  && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_DEPEND
5199                  && VAR_P (t) && CP_DECL_THREAD_LOCAL_P (t))
5200           {
5201             error_at (OMP_CLAUSE_LOCATION (c),
5202                         "%qD is threadprivate variable in %qs clause", t,
5203                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5204             return error_mark_node;
5205           }
5206       if (type_dependent_expression_p (ret))
5207           return NULL_TREE;
5208       ret = convert_from_reference (ret);
5209       return ret;
5210     }
5211 
5212   if ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP
5213       && (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5214             || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION
5215             || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TASK_REDUCTION)
5216       && TREE_CODE (TREE_CHAIN (t)) == FIELD_DECL)
5217     TREE_CHAIN (t) = omp_privatize_field (TREE_CHAIN (t), false);
5218   ret = handle_omp_array_sections_1 (c, TREE_CHAIN (t), types,
5219                                              maybe_zero_len, first_non_one, ort);
5220   if (ret == error_mark_node || ret == NULL_TREE)
5221     return ret;
5222 
5223   type = TREE_TYPE (ret);
5224   low_bound = TREE_PURPOSE (t);
5225   length = TREE_VALUE (t);
5226   if ((low_bound && type_dependent_expression_p (low_bound))
5227       || (length && type_dependent_expression_p (length)))
5228     return NULL_TREE;
5229 
5230   if (low_bound == error_mark_node || length == error_mark_node)
5231     return error_mark_node;
5232 
5233   if (low_bound && !INTEGRAL_TYPE_P (TREE_TYPE (low_bound)))
5234     {
5235       error_at (OMP_CLAUSE_LOCATION (c),
5236                     "low bound %qE of array section does not have integral type",
5237                     low_bound);
5238       return error_mark_node;
5239     }
5240   if (length && !INTEGRAL_TYPE_P (TREE_TYPE (length)))
5241     {
5242       error_at (OMP_CLAUSE_LOCATION (c),
5243                     "length %qE of array section does not have integral type",
5244                     length);
5245       return error_mark_node;
5246     }
5247   if (low_bound)
5248     low_bound = mark_rvalue_use (low_bound);
5249   if (length)
5250     length = mark_rvalue_use (length);
5251   /* We need to reduce to real constant-values for checks below.  */
5252   if (length)
5253     length = fold_simple (length);
5254   if (low_bound)
5255     low_bound = fold_simple (low_bound);
5256   if (low_bound
5257       && TREE_CODE (low_bound) == INTEGER_CST
5258       && TYPE_PRECISION (TREE_TYPE (low_bound))
5259            > TYPE_PRECISION (sizetype))
5260     low_bound = fold_convert (sizetype, low_bound);
5261   if (length
5262       && TREE_CODE (length) == INTEGER_CST
5263       && TYPE_PRECISION (TREE_TYPE (length))
5264            > TYPE_PRECISION (sizetype))
5265     length = fold_convert (sizetype, length);
5266   if (low_bound == NULL_TREE)
5267     low_bound = integer_zero_node;
5268 
5269   if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
5270       && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH
5271             || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_DETACH))
5272     {
5273       if (length != integer_one_node)
5274           {
5275             error_at (OMP_CLAUSE_LOCATION (c),
5276                         "expected single pointer in %qs clause",
5277                         user_omp_clause_code_name (c, ort == C_ORT_ACC));
5278             return error_mark_node;
5279           }
5280     }
5281   if (length != NULL_TREE)
5282     {
5283       if (!integer_nonzerop (length))
5284           {
5285             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_AFFINITY
5286                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND
5287                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5288                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION
5289                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TASK_REDUCTION)
5290               {
5291                 if (integer_zerop (length))
5292                     {
5293                       error_at (OMP_CLAUSE_LOCATION (c),
5294                                   "zero length array section in %qs clause",
5295                                   omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5296                       return error_mark_node;
5297                     }
5298               }
5299             else
5300               maybe_zero_len = true;
5301           }
5302       if (first_non_one == types.length ()
5303             && (TREE_CODE (length) != INTEGER_CST || integer_onep (length)))
5304           first_non_one++;
5305     }
5306   if (TREE_CODE (type) == ARRAY_TYPE)
5307     {
5308       if (length == NULL_TREE
5309             && (TYPE_DOMAIN (type) == NULL_TREE
5310                 || TYPE_MAX_VALUE (TYPE_DOMAIN (type)) == NULL_TREE))
5311           {
5312             error_at (OMP_CLAUSE_LOCATION (c),
5313                         "for unknown bound array type length expression must "
5314                         "be specified");
5315             return error_mark_node;
5316           }
5317       if (TREE_CODE (low_bound) == INTEGER_CST
5318             && tree_int_cst_sgn (low_bound) == -1)
5319           {
5320             error_at (OMP_CLAUSE_LOCATION (c),
5321                         "negative low bound in array section in %qs clause",
5322                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5323             return error_mark_node;
5324           }
5325       if (length != NULL_TREE
5326             && TREE_CODE (length) == INTEGER_CST
5327             && tree_int_cst_sgn (length) == -1)
5328           {
5329             error_at (OMP_CLAUSE_LOCATION (c),
5330                         "negative length in array section in %qs clause",
5331                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5332             return error_mark_node;
5333           }
5334       if (TYPE_DOMAIN (type)
5335             && TYPE_MAX_VALUE (TYPE_DOMAIN (type))
5336             && TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (type)))
5337                               == INTEGER_CST)
5338           {
5339             tree size
5340               = fold_convert (sizetype, TYPE_MAX_VALUE (TYPE_DOMAIN (type)));
5341             size = size_binop (PLUS_EXPR, size, size_one_node);
5342             if (TREE_CODE (low_bound) == INTEGER_CST)
5343               {
5344                 if (tree_int_cst_lt (size, low_bound))
5345                     {
5346                       error_at (OMP_CLAUSE_LOCATION (c),
5347                                   "low bound %qE above array section size "
5348                                   "in %qs clause", low_bound,
5349                                   omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5350                       return error_mark_node;
5351                     }
5352                 if (tree_int_cst_equal (size, low_bound))
5353                     {
5354                       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_AFFINITY
5355                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND
5356                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5357                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION
5358                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TASK_REDUCTION)
5359                         {
5360                           error_at (OMP_CLAUSE_LOCATION (c),
5361                                         "zero length array section in %qs clause",
5362                                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5363                           return error_mark_node;
5364                         }
5365                       maybe_zero_len = true;
5366                     }
5367                 else if (length == NULL_TREE
5368                            && first_non_one == types.length ()
5369                            && tree_int_cst_equal
5370                                   (TYPE_MAX_VALUE (TYPE_DOMAIN (type)),
5371                                    low_bound))
5372                     first_non_one++;
5373               }
5374             else if (length == NULL_TREE)
5375               {
5376                 if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_AFFINITY
5377                       && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_DEPEND
5378                       && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_REDUCTION
5379                       && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_IN_REDUCTION
5380                       && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_TASK_REDUCTION)
5381                     maybe_zero_len = true;
5382                 if (first_non_one == types.length ())
5383                     first_non_one++;
5384               }
5385             if (length && TREE_CODE (length) == INTEGER_CST)
5386               {
5387                 if (tree_int_cst_lt (size, length))
5388                     {
5389                       error_at (OMP_CLAUSE_LOCATION (c),
5390                                   "length %qE above array section size "
5391                                   "in %qs clause", length,
5392                                   omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5393                       return error_mark_node;
5394                     }
5395                 if (TREE_CODE (low_bound) == INTEGER_CST)
5396                     {
5397                       tree lbpluslen
5398                         = size_binop (PLUS_EXPR,
5399                                           fold_convert (sizetype, low_bound),
5400                                           fold_convert (sizetype, length));
5401                       if (TREE_CODE (lbpluslen) == INTEGER_CST
5402                           && tree_int_cst_lt (size, lbpluslen))
5403                         {
5404                           error_at (OMP_CLAUSE_LOCATION (c),
5405                                         "high bound %qE above array section size "
5406                                         "in %qs clause", lbpluslen,
5407                                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5408                           return error_mark_node;
5409                         }
5410                     }
5411               }
5412           }
5413       else if (length == NULL_TREE)
5414           {
5415             if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_AFFINITY
5416                 && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_DEPEND
5417                 && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_REDUCTION
5418                 && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_IN_REDUCTION
5419                 && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_TASK_REDUCTION)
5420               maybe_zero_len = true;
5421             if (first_non_one == types.length ())
5422               first_non_one++;
5423           }
5424 
5425       /* For [lb:] we will need to evaluate lb more than once.  */
5426       if (length == NULL_TREE && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_DEPEND)
5427           {
5428             tree lb = cp_save_expr (low_bound);
5429             if (lb != low_bound)
5430               {
5431                 TREE_PURPOSE (t) = lb;
5432                 low_bound = lb;
5433               }
5434           }
5435     }
5436   else if (TYPE_PTR_P (type))
5437     {
5438       if (length == NULL_TREE)
5439           {
5440             if (TREE_CODE (ret) == PARM_DECL && DECL_ARRAY_PARAMETER_P (ret))
5441               error_at (OMP_CLAUSE_LOCATION (c),
5442                           "for array function parameter length expression "
5443                           "must be specified");
5444             else
5445               error_at (OMP_CLAUSE_LOCATION (c),
5446                           "for pointer type length expression must be specified");
5447             return error_mark_node;
5448           }
5449       if (length != NULL_TREE
5450             && TREE_CODE (length) == INTEGER_CST
5451             && tree_int_cst_sgn (length) == -1)
5452           {
5453             error_at (OMP_CLAUSE_LOCATION (c),
5454                         "negative length in array section in %qs clause",
5455                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5456             return error_mark_node;
5457           }
5458       /* If there is a pointer type anywhere but in the very first
5459            array-section-subscript, the array section could be non-contiguous.  */
5460       if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_AFFINITY
5461             && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_DEPEND
5462             && TREE_CODE (TREE_CHAIN (t)) == TREE_LIST)
5463           {
5464             /* If any prior dimension has a non-one length, then deem this
5465                array section as non-contiguous.  */
5466             for (tree d = TREE_CHAIN (t); TREE_CODE (d) == TREE_LIST;
5467                  d = TREE_CHAIN (d))
5468               {
5469                 tree d_length = TREE_VALUE (d);
5470                 if (d_length == NULL_TREE || !integer_onep (d_length))
5471                     {
5472                       error_at (OMP_CLAUSE_LOCATION (c),
5473                                   "array section is not contiguous in %qs clause",
5474                                   omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5475                       return error_mark_node;
5476                     }
5477               }
5478           }
5479     }
5480   else
5481     {
5482       error_at (OMP_CLAUSE_LOCATION (c),
5483                     "%qE does not have pointer or array type", ret);
5484       return error_mark_node;
5485     }
5486   if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_DEPEND)
5487     types.safe_push (TREE_TYPE (ret));
5488   /* We will need to evaluate lb more than once.  */
5489   tree lb = cp_save_expr (low_bound);
5490   if (lb != low_bound)
5491     {
5492       TREE_PURPOSE (t) = lb;
5493       low_bound = lb;
5494     }
5495   /* Temporarily disable -fstrong-eval-order for array reductions.
5496      The SAVE_EXPR and COMPOUND_EXPR added if low_bound has side-effects
5497      is something the middle-end can't cope with and more importantly,
5498      it needs to be the actual base variable that is privatized, not some
5499      temporary assigned previous value of it.  That, together with OpenMP
5500      saying how many times the side-effects are evaluated is unspecified,
5501      makes int *a, *b; ... reduction(+:a[a = b, 3:10]) really unspecified.  */
5502   warning_sentinel s (flag_strong_eval_order,
5503                           OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5504                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION
5505                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TASK_REDUCTION);
5506   ret = grok_array_decl (OMP_CLAUSE_LOCATION (c), ret, low_bound, NULL,
5507                                tf_warning_or_error);
5508   return ret;
5509 }
5510 
5511 /* Handle array sections for clause C.  */
5512 
5513 static bool
handle_omp_array_sections(tree c,enum c_omp_region_type ort)5514 handle_omp_array_sections (tree c, enum c_omp_region_type ort)
5515 {
5516   bool maybe_zero_len = false;
5517   unsigned int first_non_one = 0;
5518   auto_vec<tree, 10> types;
5519   tree *tp = &OMP_CLAUSE_DECL (c);
5520   if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND
5521        || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_AFFINITY)
5522       && TREE_CODE (*tp) == TREE_LIST
5523       && TREE_PURPOSE (*tp)
5524       && TREE_CODE (TREE_PURPOSE (*tp)) == TREE_VEC)
5525     tp = &TREE_VALUE (*tp);
5526   tree first = handle_omp_array_sections_1 (c, *tp, types,
5527                                                       maybe_zero_len, first_non_one,
5528                                                       ort);
5529   if (first == error_mark_node)
5530     return true;
5531   if (first == NULL_TREE)
5532     return false;
5533   if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND
5534       || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_AFFINITY)
5535     {
5536       tree t = *tp;
5537       tree tem = NULL_TREE;
5538       if (processing_template_decl)
5539           return false;
5540       /* Need to evaluate side effects in the length expressions
5541            if any.  */
5542       while (TREE_CODE (t) == TREE_LIST)
5543           {
5544             if (TREE_VALUE (t) && TREE_SIDE_EFFECTS (TREE_VALUE (t)))
5545               {
5546                 if (tem == NULL_TREE)
5547                     tem = TREE_VALUE (t);
5548                 else
5549                     tem = build2 (COMPOUND_EXPR, TREE_TYPE (tem),
5550                                     TREE_VALUE (t), tem);
5551               }
5552             t = TREE_CHAIN (t);
5553           }
5554       if (tem)
5555           first = build2 (COMPOUND_EXPR, TREE_TYPE (first), tem, first);
5556       *tp = first;
5557     }
5558   else
5559     {
5560       unsigned int num = types.length (), i;
5561       tree t, side_effects = NULL_TREE, size = NULL_TREE;
5562       tree condition = NULL_TREE;
5563 
5564       if (int_size_in_bytes (TREE_TYPE (first)) <= 0)
5565           maybe_zero_len = true;
5566       if (processing_template_decl && maybe_zero_len)
5567           return false;
5568 
5569       for (i = num, t = OMP_CLAUSE_DECL (c); i > 0;
5570              t = TREE_CHAIN (t))
5571           {
5572             tree low_bound = TREE_PURPOSE (t);
5573             tree length = TREE_VALUE (t);
5574 
5575             i--;
5576             if (low_bound
5577                 && TREE_CODE (low_bound) == INTEGER_CST
5578                 && TYPE_PRECISION (TREE_TYPE (low_bound))
5579                      > TYPE_PRECISION (sizetype))
5580               low_bound = fold_convert (sizetype, low_bound);
5581             if (length
5582                 && TREE_CODE (length) == INTEGER_CST
5583                 && TYPE_PRECISION (TREE_TYPE (length))
5584                      > TYPE_PRECISION (sizetype))
5585               length = fold_convert (sizetype, length);
5586             if (low_bound == NULL_TREE)
5587               low_bound = integer_zero_node;
5588             if (!maybe_zero_len && i > first_non_one)
5589               {
5590                 if (integer_nonzerop (low_bound))
5591                     goto do_warn_noncontiguous;
5592                 if (length != NULL_TREE
5593                       && TREE_CODE (length) == INTEGER_CST
5594                       && TYPE_DOMAIN (types[i])
5595                       && TYPE_MAX_VALUE (TYPE_DOMAIN (types[i]))
5596                       && TREE_CODE (TYPE_MAX_VALUE (TYPE_DOMAIN (types[i])))
5597                          == INTEGER_CST)
5598                     {
5599                       tree size;
5600                       size = size_binop (PLUS_EXPR,
5601                                              TYPE_MAX_VALUE (TYPE_DOMAIN (types[i])),
5602                                              size_one_node);
5603                       if (!tree_int_cst_equal (length, size))
5604                         {
5605                          do_warn_noncontiguous:
5606                           error_at (OMP_CLAUSE_LOCATION (c),
5607                                         "array section is not contiguous in %qs "
5608                                         "clause",
5609                                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
5610                           return true;
5611                         }
5612                     }
5613                 if (!processing_template_decl
5614                       && length != NULL_TREE
5615                       && TREE_SIDE_EFFECTS (length))
5616                     {
5617                       if (side_effects == NULL_TREE)
5618                         side_effects = length;
5619                       else
5620                         side_effects = build2 (COMPOUND_EXPR,
5621                                                      TREE_TYPE (side_effects),
5622                                                      length, side_effects);
5623                     }
5624               }
5625             else if (processing_template_decl)
5626               continue;
5627             else
5628               {
5629                 tree l;
5630 
5631                 if (i > first_non_one
5632                       && ((length && integer_nonzerop (length))
5633                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5634                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION
5635                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TASK_REDUCTION))
5636                     continue;
5637                 if (length)
5638                     l = fold_convert (sizetype, length);
5639                 else
5640                     {
5641                       l = size_binop (PLUS_EXPR,
5642                                           TYPE_MAX_VALUE (TYPE_DOMAIN (types[i])),
5643                                           size_one_node);
5644                       l = size_binop (MINUS_EXPR, l,
5645                                           fold_convert (sizetype, low_bound));
5646                     }
5647                 if (i > first_non_one)
5648                     {
5649                       l = fold_build2 (NE_EXPR, boolean_type_node, l,
5650                                            size_zero_node);
5651                       if (condition == NULL_TREE)
5652                         condition = l;
5653                       else
5654                         condition = fold_build2 (BIT_AND_EXPR, boolean_type_node,
5655                                                        l, condition);
5656                     }
5657                 else if (size == NULL_TREE)
5658                     {
5659                       size = size_in_bytes (TREE_TYPE (types[i]));
5660                       tree eltype = TREE_TYPE (types[num - 1]);
5661                       while (TREE_CODE (eltype) == ARRAY_TYPE)
5662                         eltype = TREE_TYPE (eltype);
5663                       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5664                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION
5665                           || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TASK_REDUCTION)
5666                         size = size_binop (EXACT_DIV_EXPR, size,
5667                                                size_in_bytes (eltype));
5668                       size = size_binop (MULT_EXPR, size, l);
5669                       if (condition)
5670                         size = fold_build3 (COND_EXPR, sizetype, condition,
5671                                                   size, size_zero_node);
5672                     }
5673                 else
5674                     size = size_binop (MULT_EXPR, size, l);
5675               }
5676           }
5677       if (!processing_template_decl)
5678           {
5679             if (side_effects)
5680               size = build2 (COMPOUND_EXPR, sizetype, side_effects, size);
5681             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
5682                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION
5683                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TASK_REDUCTION)
5684               {
5685                 size = size_binop (MINUS_EXPR, size, size_one_node);
5686                 size = save_expr (size);
5687                 tree index_type = build_index_type (size);
5688                 tree eltype = TREE_TYPE (first);
5689                 while (TREE_CODE (eltype) == ARRAY_TYPE)
5690                     eltype = TREE_TYPE (eltype);
5691                 tree type = build_array_type (eltype, index_type);
5692                 tree ptype = build_pointer_type (eltype);
5693                 if (TYPE_REF_P (TREE_TYPE (t))
5694                       && INDIRECT_TYPE_P (TREE_TYPE (TREE_TYPE (t))))
5695                     t = convert_from_reference (t);
5696                 else if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
5697                     t = build_fold_addr_expr (t);
5698                 tree t2 = build_fold_addr_expr (first);
5699                 t2 = fold_convert_loc (OMP_CLAUSE_LOCATION (c),
5700                                              ptrdiff_type_node, t2);
5701                 t2 = fold_build2_loc (OMP_CLAUSE_LOCATION (c), MINUS_EXPR,
5702                                             ptrdiff_type_node, t2,
5703                                             fold_convert_loc (OMP_CLAUSE_LOCATION (c),
5704                                                                   ptrdiff_type_node, t));
5705                 if (tree_fits_shwi_p (t2))
5706                     t = build2 (MEM_REF, type, t,
5707                                   build_int_cst (ptype, tree_to_shwi (t2)));
5708                 else
5709                     {
5710                       t2 = fold_convert_loc (OMP_CLAUSE_LOCATION (c),
5711                                                    sizetype, t2);
5712                       t = build2_loc (OMP_CLAUSE_LOCATION (c), POINTER_PLUS_EXPR,
5713                                           TREE_TYPE (t), t, t2);
5714                       t = build2 (MEM_REF, type, t, build_int_cst (ptype, 0));
5715                     }
5716                 OMP_CLAUSE_DECL (c) = t;
5717                 return false;
5718               }
5719             OMP_CLAUSE_DECL (c) = first;
5720             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_HAS_DEVICE_ADDR)
5721               return false;
5722             OMP_CLAUSE_SIZE (c) = size;
5723             if (TREE_CODE (t) == FIELD_DECL)
5724               t = finish_non_static_data_member (t, NULL_TREE, NULL_TREE);
5725             if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP
5726                 || (TREE_CODE (t) == COMPONENT_REF
5727                       && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE))
5728               return false;
5729             switch (OMP_CLAUSE_MAP_KIND (c))
5730               {
5731               case GOMP_MAP_ALLOC:
5732               case GOMP_MAP_IF_PRESENT:
5733               case GOMP_MAP_TO:
5734               case GOMP_MAP_FROM:
5735               case GOMP_MAP_TOFROM:
5736               case GOMP_MAP_ALWAYS_TO:
5737               case GOMP_MAP_ALWAYS_FROM:
5738               case GOMP_MAP_ALWAYS_TOFROM:
5739               case GOMP_MAP_RELEASE:
5740               case GOMP_MAP_DELETE:
5741               case GOMP_MAP_FORCE_TO:
5742               case GOMP_MAP_FORCE_FROM:
5743               case GOMP_MAP_FORCE_TOFROM:
5744               case GOMP_MAP_FORCE_PRESENT:
5745                 OMP_CLAUSE_MAP_MAYBE_ZERO_LENGTH_ARRAY_SECTION (c) = 1;
5746                 break;
5747               default:
5748                 break;
5749               }
5750             bool reference_always_pointer = true;
5751             tree c2 = build_omp_clause (OMP_CLAUSE_LOCATION (c),
5752                                               OMP_CLAUSE_MAP);
5753             if (TREE_CODE (t) == COMPONENT_REF)
5754               {
5755                 OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_ATTACH_DETACH);
5756 
5757                 if ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP
5758                       && TYPE_REF_P (TREE_TYPE (t)))
5759                     {
5760                       if (TREE_CODE (TREE_TYPE (TREE_TYPE (t))) == ARRAY_TYPE)
5761                         OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_ALWAYS_POINTER);
5762                       else
5763                         t = convert_from_reference (t);
5764 
5765                       reference_always_pointer = false;
5766                     }
5767               }
5768             else if (REFERENCE_REF_P (t)
5769                        && TREE_CODE (TREE_OPERAND (t, 0)) == COMPONENT_REF)
5770               {
5771                 gomp_map_kind k;
5772                 if ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP
5773                       && TREE_CODE (TREE_TYPE (t)) == POINTER_TYPE)
5774                     k = GOMP_MAP_ATTACH_DETACH;
5775                 else
5776                     {
5777                       t = TREE_OPERAND (t, 0);
5778                       k = (ort == C_ORT_ACC
5779                            ? GOMP_MAP_ATTACH_DETACH : GOMP_MAP_ALWAYS_POINTER);
5780                     }
5781                 OMP_CLAUSE_SET_MAP_KIND (c2, k);
5782               }
5783             else
5784               OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_FIRSTPRIVATE_POINTER);
5785             OMP_CLAUSE_MAP_IMPLICIT (c2) = OMP_CLAUSE_MAP_IMPLICIT (c);
5786             if (OMP_CLAUSE_MAP_KIND (c2) != GOMP_MAP_FIRSTPRIVATE_POINTER
5787                 && !cxx_mark_addressable (t))
5788               return false;
5789             OMP_CLAUSE_DECL (c2) = t;
5790             t = build_fold_addr_expr (first);
5791             t = fold_convert_loc (OMP_CLAUSE_LOCATION (c),
5792                                         ptrdiff_type_node, t);
5793             tree ptr = OMP_CLAUSE_DECL (c2);
5794             ptr = convert_from_reference (ptr);
5795             if (!INDIRECT_TYPE_P (TREE_TYPE (ptr)))
5796               ptr = build_fold_addr_expr (ptr);
5797             t = fold_build2_loc (OMP_CLAUSE_LOCATION (c), MINUS_EXPR,
5798                                      ptrdiff_type_node, t,
5799                                      fold_convert_loc (OMP_CLAUSE_LOCATION (c),
5800                                                              ptrdiff_type_node, ptr));
5801             OMP_CLAUSE_SIZE (c2) = t;
5802             OMP_CLAUSE_CHAIN (c2) = OMP_CLAUSE_CHAIN (c);
5803             OMP_CLAUSE_CHAIN (c) = c2;
5804 
5805             ptr = OMP_CLAUSE_DECL (c2);
5806             if (reference_always_pointer
5807                 && OMP_CLAUSE_MAP_KIND (c2) != GOMP_MAP_FIRSTPRIVATE_POINTER
5808                 && TYPE_REF_P (TREE_TYPE (ptr))
5809                 && INDIRECT_TYPE_P (TREE_TYPE (TREE_TYPE (ptr))))
5810               {
5811                 tree c3 = build_omp_clause (OMP_CLAUSE_LOCATION (c),
5812                                                     OMP_CLAUSE_MAP);
5813                 OMP_CLAUSE_SET_MAP_KIND (c3, OMP_CLAUSE_MAP_KIND (c2));
5814                 OMP_CLAUSE_MAP_IMPLICIT (c2) = OMP_CLAUSE_MAP_IMPLICIT (c);
5815                 OMP_CLAUSE_DECL (c3) = ptr;
5816                 if (OMP_CLAUSE_MAP_KIND (c2) == GOMP_MAP_ALWAYS_POINTER
5817                       || OMP_CLAUSE_MAP_KIND (c2) == GOMP_MAP_ATTACH_DETACH)
5818                     {
5819                       OMP_CLAUSE_DECL (c2) = build_simple_mem_ref (ptr);
5820                       OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_ALWAYS_POINTER);
5821                     }
5822                 else
5823                     OMP_CLAUSE_DECL (c2) = convert_from_reference (ptr);
5824                 OMP_CLAUSE_SIZE (c3) = size_zero_node;
5825                 OMP_CLAUSE_CHAIN (c3) = OMP_CLAUSE_CHAIN (c2);
5826                 OMP_CLAUSE_CHAIN (c2) = c3;
5827               }
5828           }
5829     }
5830   return false;
5831 }
5832 
5833 /* Return identifier to look up for omp declare reduction.  */
5834 
5835 tree
omp_reduction_id(enum tree_code reduction_code,tree reduction_id,tree type)5836 omp_reduction_id (enum tree_code reduction_code, tree reduction_id, tree type)
5837 {
5838   const char *p = NULL;
5839   const char *m = NULL;
5840   switch (reduction_code)
5841     {
5842     case PLUS_EXPR:
5843     case MULT_EXPR:
5844     case MINUS_EXPR:
5845     case BIT_AND_EXPR:
5846     case BIT_XOR_EXPR:
5847     case BIT_IOR_EXPR:
5848     case TRUTH_ANDIF_EXPR:
5849     case TRUTH_ORIF_EXPR:
5850       reduction_id = ovl_op_identifier (false, reduction_code);
5851       break;
5852     case MIN_EXPR:
5853       p = "min";
5854       break;
5855     case MAX_EXPR:
5856       p = "max";
5857       break;
5858     default:
5859       break;
5860     }
5861 
5862   if (p == NULL)
5863     {
5864       if (TREE_CODE (reduction_id) != IDENTIFIER_NODE)
5865           return error_mark_node;
5866       p = IDENTIFIER_POINTER (reduction_id);
5867     }
5868 
5869   if (type != NULL_TREE)
5870     m = mangle_type_string (TYPE_MAIN_VARIANT (type));
5871 
5872   const char prefix[] = "omp declare reduction ";
5873   size_t lenp = sizeof (prefix);
5874   if (strncmp (p, prefix, lenp - 1) == 0)
5875     lenp = 1;
5876   size_t len = strlen (p);
5877   size_t lenm = m ? strlen (m) + 1 : 0;
5878   char *name = XALLOCAVEC (char, lenp + len + lenm);
5879   if (lenp > 1)
5880     memcpy (name, prefix, lenp - 1);
5881   memcpy (name + lenp - 1, p, len + 1);
5882   if (m)
5883     {
5884       name[lenp + len - 1] = '~';
5885       memcpy (name + lenp + len, m, lenm);
5886     }
5887   return get_identifier (name);
5888 }
5889 
5890 /* Lookup OpenMP UDR ID for TYPE, return the corresponding artificial
5891    FUNCTION_DECL or NULL_TREE if not found.  */
5892 
5893 static tree
omp_reduction_lookup(location_t loc,tree id,tree type,tree * baselinkp,vec<tree> * ambiguousp)5894 omp_reduction_lookup (location_t loc, tree id, tree type, tree *baselinkp,
5895                           vec<tree> *ambiguousp)
5896 {
5897   tree orig_id = id;
5898   tree baselink = NULL_TREE;
5899   if (identifier_p (id))
5900     {
5901       cp_id_kind idk;
5902       bool nonint_cst_expression_p;
5903       const char *error_msg;
5904       id = omp_reduction_id (ERROR_MARK, id, type);
5905       tree decl = lookup_name (id);
5906       if (decl == NULL_TREE)
5907           decl = error_mark_node;
5908       id = finish_id_expression (id, decl, NULL_TREE, &idk, false, true,
5909                                          &nonint_cst_expression_p, false, true, false,
5910                                          false, &error_msg, loc);
5911       if (idk == CP_ID_KIND_UNQUALIFIED
5912             && identifier_p (id))
5913           {
5914             vec<tree, va_gc> *args = NULL;
5915             vec_safe_push (args, build_reference_type (type));
5916             id = perform_koenig_lookup (id, args, tf_none);
5917           }
5918     }
5919   else if (TREE_CODE (id) == SCOPE_REF)
5920     id = lookup_qualified_name (TREE_OPERAND (id, 0),
5921                                         omp_reduction_id (ERROR_MARK,
5922                                                               TREE_OPERAND (id, 1),
5923                                                               type),
5924                                         LOOK_want::NORMAL, false);
5925   tree fns = id;
5926   id = NULL_TREE;
5927   if (fns && is_overloaded_fn (fns))
5928     {
5929       for (lkp_iterator iter (get_fns (fns)); iter; ++iter)
5930           {
5931             tree fndecl = *iter;
5932             if (TREE_CODE (fndecl) == FUNCTION_DECL)
5933               {
5934                 tree argtype = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (fndecl)));
5935                 if (same_type_p (TREE_TYPE (argtype), type))
5936                     {
5937                       id = fndecl;
5938                       break;
5939                     }
5940               }
5941           }
5942 
5943       if (id && BASELINK_P (fns))
5944           {
5945             if (baselinkp)
5946               *baselinkp = fns;
5947             else
5948               baselink = fns;
5949           }
5950     }
5951 
5952   if (!id && CLASS_TYPE_P (type) && TYPE_BINFO (type))
5953     {
5954       auto_vec<tree> ambiguous;
5955       tree binfo = TYPE_BINFO (type), base_binfo, ret = NULL_TREE;
5956       unsigned int ix;
5957       if (ambiguousp == NULL)
5958           ambiguousp = &ambiguous;
5959       for (ix = 0; BINFO_BASE_ITERATE (binfo, ix, base_binfo); ix++)
5960           {
5961             id = omp_reduction_lookup (loc, orig_id, BINFO_TYPE (base_binfo),
5962                                              baselinkp ? baselinkp : &baselink,
5963                                              ambiguousp);
5964             if (id == NULL_TREE)
5965               continue;
5966             if (!ambiguousp->is_empty ())
5967               ambiguousp->safe_push (id);
5968             else if (ret != NULL_TREE)
5969               {
5970                 ambiguousp->safe_push (ret);
5971                 ambiguousp->safe_push (id);
5972                 ret = NULL_TREE;
5973               }
5974             else
5975               ret = id;
5976           }
5977       if (ambiguousp != &ambiguous)
5978           return ret;
5979       if (!ambiguous.is_empty ())
5980           {
5981             const char *str = _("candidates are:");
5982             unsigned int idx;
5983             tree udr;
5984             error_at (loc, "user defined reduction lookup is ambiguous");
5985             FOR_EACH_VEC_ELT (ambiguous, idx, udr)
5986               {
5987                 inform (DECL_SOURCE_LOCATION (udr), "%s %#qD", str, udr);
5988                 if (idx == 0)
5989                     str = get_spaces (str);
5990               }
5991             ret = error_mark_node;
5992             baselink = NULL_TREE;
5993           }
5994       id = ret;
5995     }
5996   if (id && baselink)
5997     perform_or_defer_access_check (BASELINK_BINFO (baselink),
5998                                            id, id, tf_warning_or_error);
5999   return id;
6000 }
6001 
6002 /* Helper function for cp_parser_omp_declare_reduction_exprs
6003    and tsubst_omp_udr.
6004    Remove CLEANUP_STMT for data (omp_priv variable).
6005    Also append INIT_EXPR for DECL_INITIAL of omp_priv after its
6006    DECL_EXPR.  */
6007 
6008 tree
cp_remove_omp_priv_cleanup_stmt(tree * tp,int * walk_subtrees,void * data)6009 cp_remove_omp_priv_cleanup_stmt (tree *tp, int *walk_subtrees, void *data)
6010 {
6011   if (TYPE_P (*tp))
6012     *walk_subtrees = 0;
6013   else if (TREE_CODE (*tp) == CLEANUP_STMT && CLEANUP_DECL (*tp) == (tree) data)
6014     *tp = CLEANUP_BODY (*tp);
6015   else if (TREE_CODE (*tp) == DECL_EXPR)
6016     {
6017       tree decl = DECL_EXPR_DECL (*tp);
6018       if (!processing_template_decl
6019             && decl == (tree) data
6020             && DECL_INITIAL (decl)
6021             && DECL_INITIAL (decl) != error_mark_node)
6022           {
6023             tree list = NULL_TREE;
6024             append_to_statement_list_force (*tp, &list);
6025             tree init_expr = build2 (INIT_EXPR, void_type_node,
6026                                            decl, DECL_INITIAL (decl));
6027             DECL_INITIAL (decl) = NULL_TREE;
6028             append_to_statement_list_force (init_expr, &list);
6029             *tp = list;
6030           }
6031     }
6032   return NULL_TREE;
6033 }
6034 
6035 /* Data passed from cp_check_omp_declare_reduction to
6036    cp_check_omp_declare_reduction_r.  */
6037 
6038 struct cp_check_omp_declare_reduction_data
6039 {
6040   location_t loc;
6041   tree stmts[7];
6042   bool combiner_p;
6043 };
6044 
6045 /* Helper function for cp_check_omp_declare_reduction, called via
6046    cp_walk_tree.  */
6047 
6048 static tree
cp_check_omp_declare_reduction_r(tree * tp,int *,void * data)6049 cp_check_omp_declare_reduction_r (tree *tp, int *, void *data)
6050 {
6051   struct cp_check_omp_declare_reduction_data *udr_data
6052     = (struct cp_check_omp_declare_reduction_data *) data;
6053   if (SSA_VAR_P (*tp)
6054       && !DECL_ARTIFICIAL (*tp)
6055       && *tp != DECL_EXPR_DECL (udr_data->stmts[udr_data->combiner_p ? 0 : 3])
6056       && *tp != DECL_EXPR_DECL (udr_data->stmts[udr_data->combiner_p ? 1 : 4]))
6057     {
6058       location_t loc = udr_data->loc;
6059       if (udr_data->combiner_p)
6060           error_at (loc, "%<#pragma omp declare reduction%> combiner refers to "
6061                            "variable %qD which is not %<omp_out%> nor %<omp_in%>",
6062                       *tp);
6063       else
6064           error_at (loc, "%<#pragma omp declare reduction%> initializer refers "
6065                            "to variable %qD which is not %<omp_priv%> nor "
6066                            "%<omp_orig%>",
6067                       *tp);
6068       return *tp;
6069     }
6070   return NULL_TREE;
6071 }
6072 
6073 /* Diagnose violation of OpenMP #pragma omp declare reduction restrictions.  */
6074 
6075 bool
cp_check_omp_declare_reduction(tree udr)6076 cp_check_omp_declare_reduction (tree udr)
6077 {
6078   tree type = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (udr)));
6079   gcc_assert (TYPE_REF_P (type));
6080   type = TREE_TYPE (type);
6081   int i;
6082   location_t loc = DECL_SOURCE_LOCATION (udr);
6083 
6084   if (type == error_mark_node)
6085     return false;
6086   if (ARITHMETIC_TYPE_P (type))
6087     {
6088       static enum tree_code predef_codes[]
6089           = { PLUS_EXPR, MULT_EXPR, MINUS_EXPR, BIT_AND_EXPR, BIT_XOR_EXPR,
6090               BIT_IOR_EXPR, TRUTH_ANDIF_EXPR, TRUTH_ORIF_EXPR };
6091       for (i = 0; i < 8; i++)
6092           {
6093             tree id = omp_reduction_id (predef_codes[i], NULL_TREE, NULL_TREE);
6094             const char *n1 = IDENTIFIER_POINTER (DECL_NAME (udr));
6095             const char *n2 = IDENTIFIER_POINTER (id);
6096             if (strncmp (n1, n2, IDENTIFIER_LENGTH (id)) == 0
6097                 && (n1[IDENTIFIER_LENGTH (id)] == '~'
6098                       || n1[IDENTIFIER_LENGTH (id)] == '\0'))
6099               break;
6100           }
6101 
6102       if (i == 8
6103             && TREE_CODE (type) != COMPLEX_EXPR)
6104           {
6105             const char prefix_minmax[] = "omp declare reduction m";
6106             size_t prefix_size = sizeof (prefix_minmax) - 1;
6107             const char *n = IDENTIFIER_POINTER (DECL_NAME (udr));
6108             if (strncmp (IDENTIFIER_POINTER (DECL_NAME (udr)),
6109                            prefix_minmax, prefix_size) == 0
6110                 && ((n[prefix_size] == 'i' && n[prefix_size + 1] == 'n')
6111                       || (n[prefix_size] == 'a' && n[prefix_size + 1] == 'x'))
6112                 && (n[prefix_size + 2] == '~' || n[prefix_size + 2] == '\0'))
6113               i = 0;
6114           }
6115       if (i < 8)
6116           {
6117             error_at (loc, "predeclared arithmetic type %qT in "
6118                                "%<#pragma omp declare reduction%>", type);
6119             return false;
6120           }
6121     }
6122   else if (FUNC_OR_METHOD_TYPE_P (type)
6123              || TREE_CODE (type) == ARRAY_TYPE)
6124     {
6125       error_at (loc, "function or array type %qT in "
6126                          "%<#pragma omp declare reduction%>", type);
6127       return false;
6128     }
6129   else if (TYPE_REF_P (type))
6130     {
6131       error_at (loc, "reference type %qT in %<#pragma omp declare reduction%>",
6132                     type);
6133       return false;
6134     }
6135   else if (TYPE_QUALS_NO_ADDR_SPACE (type))
6136     {
6137       error_at (loc, "%<const%>, %<volatile%> or %<__restrict%>-qualified "
6138                     "type %qT in %<#pragma omp declare reduction%>", type);
6139       return false;
6140     }
6141 
6142   tree body = DECL_SAVED_TREE (udr);
6143   if (body == NULL_TREE || TREE_CODE (body) != STATEMENT_LIST)
6144     return true;
6145 
6146   tree_stmt_iterator tsi;
6147   struct cp_check_omp_declare_reduction_data data;
6148   memset (data.stmts, 0, sizeof data.stmts);
6149   for (i = 0, tsi = tsi_start (body);
6150        i < 7 && !tsi_end_p (tsi);
6151        i++, tsi_next (&tsi))
6152     data.stmts[i] = tsi_stmt (tsi);
6153   data.loc = loc;
6154   gcc_assert (tsi_end_p (tsi));
6155   if (i >= 3)
6156     {
6157       gcc_assert (TREE_CODE (data.stmts[0]) == DECL_EXPR
6158                       && TREE_CODE (data.stmts[1]) == DECL_EXPR);
6159       if (warning_suppressed_p (DECL_EXPR_DECL (data.stmts[0]) /* What warning? */))
6160           return true;
6161       data.combiner_p = true;
6162       if (cp_walk_tree (&data.stmts[2], cp_check_omp_declare_reduction_r,
6163                               &data, NULL))
6164           suppress_warning (DECL_EXPR_DECL (data.stmts[0]) /* What warning? */);
6165     }
6166   if (i >= 6)
6167     {
6168       gcc_assert (TREE_CODE (data.stmts[3]) == DECL_EXPR
6169                       && TREE_CODE (data.stmts[4]) == DECL_EXPR);
6170       data.combiner_p = false;
6171       if (cp_walk_tree (&data.stmts[5], cp_check_omp_declare_reduction_r,
6172                               &data, NULL)
6173             || cp_walk_tree (&DECL_INITIAL (DECL_EXPR_DECL (data.stmts[3])),
6174                                  cp_check_omp_declare_reduction_r, &data, NULL))
6175           suppress_warning (DECL_EXPR_DECL (data.stmts[0])  /* Wat warning? */);
6176       if (i == 7)
6177           gcc_assert (TREE_CODE (data.stmts[6]) == DECL_EXPR);
6178     }
6179   return true;
6180 }
6181 
6182 /* Helper function of finish_omp_clauses.  Clone STMT as if we were making
6183    an inline call.  But, remap
6184    the OMP_DECL1 VAR_DECL (omp_out resp. omp_orig) to PLACEHOLDER
6185    and OMP_DECL2 VAR_DECL (omp_in resp. omp_priv) to DECL.  */
6186 
6187 static tree
clone_omp_udr(tree stmt,tree omp_decl1,tree omp_decl2,tree decl,tree placeholder)6188 clone_omp_udr (tree stmt, tree omp_decl1, tree omp_decl2,
6189                  tree decl, tree placeholder)
6190 {
6191   copy_body_data id;
6192   hash_map<tree, tree> decl_map;
6193 
6194   decl_map.put (omp_decl1, placeholder);
6195   decl_map.put (omp_decl2, decl);
6196   memset (&id, 0, sizeof (id));
6197   id.src_fn = DECL_CONTEXT (omp_decl1);
6198   id.dst_fn = current_function_decl;
6199   id.src_cfun = DECL_STRUCT_FUNCTION (id.src_fn);
6200   id.decl_map = &decl_map;
6201 
6202   id.copy_decl = copy_decl_no_change;
6203   id.transform_call_graph_edges = CB_CGE_DUPLICATE;
6204   id.transform_new_cfg = true;
6205   id.transform_return_to_modify = false;
6206   id.eh_lp_nr = 0;
6207   walk_tree (&stmt, copy_tree_body_r, &id, NULL);
6208   return stmt;
6209 }
6210 
6211 /* Helper function of finish_omp_clauses, called via cp_walk_tree.
6212    Find OMP_CLAUSE_PLACEHOLDER (passed in DATA) in *TP.  */
6213 
6214 static tree
find_omp_placeholder_r(tree * tp,int *,void * data)6215 find_omp_placeholder_r (tree *tp, int *, void *data)
6216 {
6217   if (*tp == (tree) data)
6218     return *tp;
6219   return NULL_TREE;
6220 }
6221 
6222 /* Helper function of finish_omp_clauses.  Handle OMP_CLAUSE_REDUCTION C.
6223    Return true if there is some error and the clause should be removed.  */
6224 
6225 static bool
finish_omp_reduction_clause(tree c,bool * need_default_ctor,bool * need_dtor)6226 finish_omp_reduction_clause (tree c, bool *need_default_ctor, bool *need_dtor)
6227 {
6228   tree t = OMP_CLAUSE_DECL (c);
6229   bool predefined = false;
6230   if (TREE_CODE (t) == TREE_LIST)
6231     {
6232       gcc_assert (processing_template_decl);
6233       return false;
6234     }
6235   tree type = TREE_TYPE (t);
6236   if (TREE_CODE (t) == MEM_REF)
6237     type = TREE_TYPE (type);
6238   if (TYPE_REF_P (type))
6239     type = TREE_TYPE (type);
6240   if (TREE_CODE (type) == ARRAY_TYPE)
6241     {
6242       tree oatype = type;
6243       gcc_assert (TREE_CODE (t) != MEM_REF);
6244       while (TREE_CODE (type) == ARRAY_TYPE)
6245           type = TREE_TYPE (type);
6246       if (!processing_template_decl)
6247           {
6248             t = require_complete_type (t);
6249             if (t == error_mark_node
6250                 || !complete_type_or_else (oatype, NULL_TREE))
6251               return true;
6252             tree size = size_binop (EXACT_DIV_EXPR, TYPE_SIZE_UNIT (oatype),
6253                                           TYPE_SIZE_UNIT (type));
6254             if (integer_zerop (size))
6255               {
6256                 error_at (OMP_CLAUSE_LOCATION (c),
6257                               "%qE in %<reduction%> clause is a zero size array",
6258                               omp_clause_printable_decl (t));
6259                 return true;
6260               }
6261             size = size_binop (MINUS_EXPR, size, size_one_node);
6262             size = save_expr (size);
6263             tree index_type = build_index_type (size);
6264             tree atype = build_array_type (type, index_type);
6265             tree ptype = build_pointer_type (type);
6266             if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
6267               t = build_fold_addr_expr (t);
6268             t = build2 (MEM_REF, atype, t, build_int_cst (ptype, 0));
6269             OMP_CLAUSE_DECL (c) = t;
6270           }
6271     }
6272   if (type == error_mark_node)
6273     return true;
6274   else if (ARITHMETIC_TYPE_P (type))
6275     switch (OMP_CLAUSE_REDUCTION_CODE (c))
6276       {
6277       case PLUS_EXPR:
6278       case MULT_EXPR:
6279       case MINUS_EXPR:
6280       case TRUTH_ANDIF_EXPR:
6281       case TRUTH_ORIF_EXPR:
6282           predefined = true;
6283           break;
6284       case MIN_EXPR:
6285       case MAX_EXPR:
6286           if (TREE_CODE (type) == COMPLEX_TYPE)
6287             break;
6288           predefined = true;
6289           break;
6290       case BIT_AND_EXPR:
6291       case BIT_IOR_EXPR:
6292       case BIT_XOR_EXPR:
6293           if (FLOAT_TYPE_P (type) || TREE_CODE (type) == COMPLEX_TYPE)
6294             break;
6295           predefined = true;
6296           break;
6297       default:
6298           break;
6299       }
6300   else if (TYPE_READONLY (type))
6301     {
6302       error_at (OMP_CLAUSE_LOCATION (c),
6303                     "%qE has const type for %<reduction%>",
6304                     omp_clause_printable_decl (t));
6305       return true;
6306     }
6307   else if (!processing_template_decl)
6308     {
6309       t = require_complete_type (t);
6310       if (t == error_mark_node)
6311           return true;
6312       OMP_CLAUSE_DECL (c) = t;
6313     }
6314 
6315   if (predefined)
6316     {
6317       OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) = NULL_TREE;
6318       return false;
6319     }
6320   else if (processing_template_decl)
6321     {
6322       if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) == error_mark_node)
6323           return true;
6324       return false;
6325     }
6326 
6327   tree id = OMP_CLAUSE_REDUCTION_PLACEHOLDER (c);
6328 
6329   type = TYPE_MAIN_VARIANT (type);
6330   OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) = NULL_TREE;
6331   if (id == NULL_TREE)
6332     id = omp_reduction_id (OMP_CLAUSE_REDUCTION_CODE (c),
6333                                  NULL_TREE, NULL_TREE);
6334   id = omp_reduction_lookup (OMP_CLAUSE_LOCATION (c), id, type, NULL, NULL);
6335   if (id)
6336     {
6337       if (id == error_mark_node)
6338           return true;
6339       mark_used (id);
6340       tree body = DECL_SAVED_TREE (id);
6341       if (!body)
6342           return true;
6343       if (TREE_CODE (body) == STATEMENT_LIST)
6344           {
6345             tree_stmt_iterator tsi;
6346             tree placeholder = NULL_TREE, decl_placeholder = NULL_TREE;
6347             int i;
6348             tree stmts[7];
6349             tree atype = TREE_VALUE (TYPE_ARG_TYPES (TREE_TYPE (id)));
6350             atype = TREE_TYPE (atype);
6351             bool need_static_cast = !same_type_p (type, atype);
6352             memset (stmts, 0, sizeof stmts);
6353             for (i = 0, tsi = tsi_start (body);
6354                  i < 7 && !tsi_end_p (tsi);
6355                  i++, tsi_next (&tsi))
6356               stmts[i] = tsi_stmt (tsi);
6357             gcc_assert (tsi_end_p (tsi));
6358 
6359             if (i >= 3)
6360               {
6361                 gcc_assert (TREE_CODE (stmts[0]) == DECL_EXPR
6362                                 && TREE_CODE (stmts[1]) == DECL_EXPR);
6363                 placeholder = build_lang_decl (VAR_DECL, NULL_TREE, type);
6364                 DECL_ARTIFICIAL (placeholder) = 1;
6365                 DECL_IGNORED_P (placeholder) = 1;
6366                 OMP_CLAUSE_REDUCTION_PLACEHOLDER (c) = placeholder;
6367                 if (TREE_CODE (t) == MEM_REF)
6368                     {
6369                       decl_placeholder = build_lang_decl (VAR_DECL, NULL_TREE,
6370                                                                   type);
6371                       DECL_ARTIFICIAL (decl_placeholder) = 1;
6372                       DECL_IGNORED_P (decl_placeholder) = 1;
6373                       OMP_CLAUSE_REDUCTION_DECL_PLACEHOLDER (c) = decl_placeholder;
6374                     }
6375                 if (TREE_ADDRESSABLE (DECL_EXPR_DECL (stmts[0])))
6376                     cxx_mark_addressable (placeholder);
6377                 if (TREE_ADDRESSABLE (DECL_EXPR_DECL (stmts[1]))
6378                       && (decl_placeholder
6379                           || !TYPE_REF_P (TREE_TYPE (OMP_CLAUSE_DECL (c)))))
6380                     cxx_mark_addressable (decl_placeholder ? decl_placeholder
6381                                               : OMP_CLAUSE_DECL (c));
6382                 tree omp_out = placeholder;
6383                 tree omp_in = decl_placeholder ? decl_placeholder
6384                                   : convert_from_reference (OMP_CLAUSE_DECL (c));
6385                 if (need_static_cast)
6386                     {
6387                       tree rtype = build_reference_type (atype);
6388                       omp_out = build_static_cast (input_location,
6389                                                          rtype, omp_out,
6390                                                          tf_warning_or_error);
6391                       omp_in = build_static_cast (input_location,
6392                                                         rtype, omp_in,
6393                                                         tf_warning_or_error);
6394                       if (omp_out == error_mark_node || omp_in == error_mark_node)
6395                         return true;
6396                       omp_out = convert_from_reference (omp_out);
6397                       omp_in = convert_from_reference (omp_in);
6398                     }
6399                 OMP_CLAUSE_REDUCTION_MERGE (c)
6400                     = clone_omp_udr (stmts[2], DECL_EXPR_DECL (stmts[0]),
6401                                          DECL_EXPR_DECL (stmts[1]), omp_in, omp_out);
6402               }
6403             if (i >= 6)
6404               {
6405                 gcc_assert (TREE_CODE (stmts[3]) == DECL_EXPR
6406                                 && TREE_CODE (stmts[4]) == DECL_EXPR);
6407                 if (TREE_ADDRESSABLE (DECL_EXPR_DECL (stmts[3]))
6408                       && (decl_placeholder
6409                           || !TYPE_REF_P (TREE_TYPE (OMP_CLAUSE_DECL (c)))))
6410                     cxx_mark_addressable (decl_placeholder ? decl_placeholder
6411                                               : OMP_CLAUSE_DECL (c));
6412                 if (TREE_ADDRESSABLE (DECL_EXPR_DECL (stmts[4])))
6413                     cxx_mark_addressable (placeholder);
6414                 tree omp_priv = decl_placeholder ? decl_placeholder
6415                                     : convert_from_reference (OMP_CLAUSE_DECL (c));
6416                 tree omp_orig = placeholder;
6417                 if (need_static_cast)
6418                     {
6419                       if (i == 7)
6420                         {
6421                           error_at (OMP_CLAUSE_LOCATION (c),
6422                                         "user defined reduction with constructor "
6423                                         "initializer for base class %qT", atype);
6424                           return true;
6425                         }
6426                       tree rtype = build_reference_type (atype);
6427                       omp_priv = build_static_cast (input_location,
6428                                                             rtype, omp_priv,
6429                                                             tf_warning_or_error);
6430                       omp_orig = build_static_cast (input_location,
6431                                                             rtype, omp_orig,
6432                                                             tf_warning_or_error);
6433                       if (omp_priv == error_mark_node
6434                           || omp_orig == error_mark_node)
6435                         return true;
6436                       omp_priv = convert_from_reference (omp_priv);
6437                       omp_orig = convert_from_reference (omp_orig);
6438                     }
6439                 if (i == 6)
6440                     *need_default_ctor = true;
6441                 OMP_CLAUSE_REDUCTION_INIT (c)
6442                     = clone_omp_udr (stmts[5], DECL_EXPR_DECL (stmts[4]),
6443                                          DECL_EXPR_DECL (stmts[3]),
6444                                          omp_priv, omp_orig);
6445                 if (cp_walk_tree (&OMP_CLAUSE_REDUCTION_INIT (c),
6446                                         find_omp_placeholder_r, placeholder, NULL))
6447                     OMP_CLAUSE_REDUCTION_OMP_ORIG_REF (c) = 1;
6448               }
6449             else if (i >= 3)
6450               {
6451                 if (CLASS_TYPE_P (type) && !pod_type_p (type))
6452                     *need_default_ctor = true;
6453                 else
6454                     {
6455                       tree init;
6456                       tree v = decl_placeholder ? decl_placeholder
6457                                  : convert_from_reference (t);
6458                       if (AGGREGATE_TYPE_P (TREE_TYPE (v)))
6459                         init = build_constructor (TREE_TYPE (v), NULL);
6460                       else
6461                         init = fold_convert (TREE_TYPE (v), integer_zero_node);
6462                       OMP_CLAUSE_REDUCTION_INIT (c)
6463                         = build2 (INIT_EXPR, TREE_TYPE (v), v, init);
6464                     }
6465               }
6466           }
6467     }
6468   if (OMP_CLAUSE_REDUCTION_PLACEHOLDER (c))
6469     *need_dtor = true;
6470   else
6471     {
6472       error_at (OMP_CLAUSE_LOCATION (c),
6473                     "user defined reduction not found for %qE",
6474                     omp_clause_printable_decl (t));
6475       return true;
6476     }
6477   if (TREE_CODE (OMP_CLAUSE_DECL (c)) == MEM_REF)
6478     gcc_assert (TYPE_SIZE_UNIT (type)
6479                     && TREE_CODE (TYPE_SIZE_UNIT (type)) == INTEGER_CST);
6480   return false;
6481 }
6482 
6483 /* Called from finish_struct_1.  linear(this) or linear(this:step)
6484    clauses might not be finalized yet because the class has been incomplete
6485    when parsing #pragma omp declare simd methods.  Fix those up now.  */
6486 
6487 void
finish_omp_declare_simd_methods(tree t)6488 finish_omp_declare_simd_methods (tree t)
6489 {
6490   if (processing_template_decl)
6491     return;
6492 
6493   for (tree x = TYPE_FIELDS (t); x; x = DECL_CHAIN (x))
6494     {
6495       if (TREE_CODE (x) == USING_DECL
6496             || !DECL_NONSTATIC_MEMBER_FUNCTION_P (x))
6497           continue;
6498       tree ods = lookup_attribute ("omp declare simd", DECL_ATTRIBUTES (x));
6499       if (!ods || !TREE_VALUE (ods))
6500           continue;
6501       for (tree c = TREE_VALUE (TREE_VALUE (ods)); c; c = OMP_CLAUSE_CHAIN (c))
6502           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LINEAR
6503               && integer_zerop (OMP_CLAUSE_DECL (c))
6504               && OMP_CLAUSE_LINEAR_STEP (c)
6505               && TYPE_PTR_P (TREE_TYPE (OMP_CLAUSE_LINEAR_STEP (c))))
6506             {
6507               tree s = OMP_CLAUSE_LINEAR_STEP (c);
6508               s = fold_convert_loc (OMP_CLAUSE_LOCATION (c), sizetype, s);
6509               s = fold_build2_loc (OMP_CLAUSE_LOCATION (c), MULT_EXPR,
6510                                          sizetype, s, TYPE_SIZE_UNIT (t));
6511               OMP_CLAUSE_LINEAR_STEP (c) = s;
6512             }
6513     }
6514 }
6515 
6516 /* Adjust sink depend clause to take into account pointer offsets.
6517 
6518    Return TRUE if there was a problem processing the offset, and the
6519    whole clause should be removed.  */
6520 
6521 static bool
cp_finish_omp_clause_depend_sink(tree sink_clause)6522 cp_finish_omp_clause_depend_sink (tree sink_clause)
6523 {
6524   tree t = OMP_CLAUSE_DECL (sink_clause);
6525   gcc_assert (TREE_CODE (t) == TREE_LIST);
6526 
6527   /* Make sure we don't adjust things twice for templates.  */
6528   if (processing_template_decl)
6529     return false;
6530 
6531   for (; t; t = TREE_CHAIN (t))
6532     {
6533       tree decl = TREE_VALUE (t);
6534       if (TYPE_PTR_P (TREE_TYPE (decl)))
6535           {
6536             tree offset = TREE_PURPOSE (t);
6537             bool neg = wi::neg_p (wi::to_wide (offset));
6538             offset = fold_unary (ABS_EXPR, TREE_TYPE (offset), offset);
6539             decl = mark_rvalue_use (decl);
6540             decl = convert_from_reference (decl);
6541             tree t2 = pointer_int_sum (OMP_CLAUSE_LOCATION (sink_clause),
6542                                              neg ? MINUS_EXPR : PLUS_EXPR,
6543                                              decl, offset);
6544             t2 = fold_build2_loc (OMP_CLAUSE_LOCATION (sink_clause),
6545                                         MINUS_EXPR, sizetype,
6546                                         fold_convert (sizetype, t2),
6547                                         fold_convert (sizetype, decl));
6548             if (t2 == error_mark_node)
6549               return true;
6550             TREE_PURPOSE (t) = t2;
6551           }
6552     }
6553   return false;
6554 }
6555 
6556 /* Finish OpenMP iterators ITER.  Return true if they are errorneous
6557    and clauses containing them should be removed.  */
6558 
6559 static bool
cp_omp_finish_iterators(tree iter)6560 cp_omp_finish_iterators (tree iter)
6561 {
6562   bool ret = false;
6563   for (tree it = iter; it; it = TREE_CHAIN (it))
6564     {
6565       tree var = TREE_VEC_ELT (it, 0);
6566       tree begin = TREE_VEC_ELT (it, 1);
6567       tree end = TREE_VEC_ELT (it, 2);
6568       tree step = TREE_VEC_ELT (it, 3);
6569       tree orig_step;
6570       tree type = TREE_TYPE (var);
6571       location_t loc = DECL_SOURCE_LOCATION (var);
6572       if (type == error_mark_node)
6573           {
6574             ret = true;
6575             continue;
6576           }
6577       if (type_dependent_expression_p (var))
6578           continue;
6579       if (!INTEGRAL_TYPE_P (type) && !POINTER_TYPE_P (type))
6580           {
6581             error_at (loc, "iterator %qD has neither integral nor pointer type",
6582                         var);
6583             ret = true;
6584             continue;
6585           }
6586       else if (TYPE_READONLY (type))
6587           {
6588             error_at (loc, "iterator %qD has const qualified type", var);
6589             ret = true;
6590             continue;
6591           }
6592       if (type_dependent_expression_p (begin)
6593             || type_dependent_expression_p (end)
6594             || type_dependent_expression_p (step))
6595           continue;
6596       else if (error_operand_p (step))
6597           {
6598             ret = true;
6599             continue;
6600           }
6601       else if (!INTEGRAL_TYPE_P (TREE_TYPE (step)))
6602           {
6603             error_at (EXPR_LOC_OR_LOC (step, loc),
6604                         "iterator step with non-integral type");
6605             ret = true;
6606             continue;
6607           }
6608 
6609       begin = mark_rvalue_use (begin);
6610       end = mark_rvalue_use (end);
6611       step = mark_rvalue_use (step);
6612       begin = cp_build_c_cast (input_location, type, begin,
6613                                      tf_warning_or_error);
6614       end = cp_build_c_cast (input_location, type, end,
6615                                    tf_warning_or_error);
6616       orig_step = step;
6617       if (!processing_template_decl)
6618           step = orig_step = save_expr (step);
6619       tree stype = POINTER_TYPE_P (type) ? sizetype : type;
6620       step = cp_build_c_cast (input_location, stype, step,
6621                                     tf_warning_or_error);
6622       if (POINTER_TYPE_P (type) && !processing_template_decl)
6623           {
6624             begin = save_expr (begin);
6625             step = pointer_int_sum (loc, PLUS_EXPR, begin, step);
6626             step = fold_build2_loc (loc, MINUS_EXPR, sizetype,
6627                                           fold_convert (sizetype, step),
6628                                           fold_convert (sizetype, begin));
6629             step = fold_convert (ssizetype, step);
6630           }
6631       if (!processing_template_decl)
6632           {
6633             begin = maybe_constant_value (begin);
6634             end = maybe_constant_value (end);
6635             step = maybe_constant_value (step);
6636             orig_step = maybe_constant_value (orig_step);
6637           }
6638       if (integer_zerop (step))
6639           {
6640             error_at (loc, "iterator %qD has zero step", var);
6641             ret = true;
6642             continue;
6643           }
6644 
6645       if (begin == error_mark_node
6646             || end == error_mark_node
6647             || step == error_mark_node
6648             || orig_step == error_mark_node)
6649           {
6650             ret = true;
6651             continue;
6652           }
6653 
6654       if (!processing_template_decl)
6655           {
6656             begin = fold_build_cleanup_point_expr (TREE_TYPE (begin), begin);
6657             end = fold_build_cleanup_point_expr (TREE_TYPE (end), end);
6658             step = fold_build_cleanup_point_expr (TREE_TYPE (step), step);
6659             orig_step = fold_build_cleanup_point_expr (TREE_TYPE (orig_step),
6660                                                                  orig_step);
6661           }
6662       hash_set<tree> pset;
6663       tree it2;
6664       for (it2 = TREE_CHAIN (it); it2; it2 = TREE_CHAIN (it2))
6665           {
6666             tree var2 = TREE_VEC_ELT (it2, 0);
6667             tree begin2 = TREE_VEC_ELT (it2, 1);
6668             tree end2 = TREE_VEC_ELT (it2, 2);
6669             tree step2 = TREE_VEC_ELT (it2, 3);
6670             location_t loc2 = DECL_SOURCE_LOCATION (var2);
6671             if (cp_walk_tree (&begin2, find_omp_placeholder_r, var, &pset))
6672               {
6673                 error_at (EXPR_LOC_OR_LOC (begin2, loc2),
6674                               "begin expression refers to outer iterator %qD", var);
6675                 break;
6676               }
6677             else if (cp_walk_tree (&end2, find_omp_placeholder_r, var, &pset))
6678               {
6679                 error_at (EXPR_LOC_OR_LOC (end2, loc2),
6680                               "end expression refers to outer iterator %qD", var);
6681                 break;
6682               }
6683             else if (cp_walk_tree (&step2, find_omp_placeholder_r, var, &pset))
6684               {
6685                 error_at (EXPR_LOC_OR_LOC (step2, loc2),
6686                               "step expression refers to outer iterator %qD", var);
6687                 break;
6688               }
6689           }
6690       if (it2)
6691           {
6692             ret = true;
6693             continue;
6694           }
6695       TREE_VEC_ELT (it, 1) = begin;
6696       TREE_VEC_ELT (it, 2) = end;
6697       if (processing_template_decl)
6698           TREE_VEC_ELT (it, 3) = orig_step;
6699       else
6700           {
6701             TREE_VEC_ELT (it, 3) = step;
6702             TREE_VEC_ELT (it, 4) = orig_step;
6703           }
6704     }
6705   return ret;
6706 }
6707 
6708 /* Ensure that pointers are used in OpenACC attach and detach clauses.
6709    Return true if an error has been detected.  */
6710 
6711 static bool
cp_oacc_check_attachments(tree c)6712 cp_oacc_check_attachments (tree c)
6713 {
6714   if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
6715     return false;
6716 
6717   /* OpenACC attach / detach clauses must be pointers.  */
6718   if (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH
6719       || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_DETACH)
6720     {
6721       tree t = OMP_CLAUSE_DECL (c);
6722       tree type;
6723 
6724       while (TREE_CODE (t) == TREE_LIST)
6725           t = TREE_CHAIN (t);
6726 
6727       type = TREE_TYPE (t);
6728 
6729       if (TREE_CODE (type) == REFERENCE_TYPE)
6730           type = TREE_TYPE (type);
6731 
6732       if (TREE_CODE (type) != POINTER_TYPE)
6733           {
6734             error_at (OMP_CLAUSE_LOCATION (c), "expected pointer in %qs clause",
6735                         user_omp_clause_code_name (c, true));
6736             return true;
6737           }
6738     }
6739 
6740   return false;
6741 }
6742 
6743 /* For all elements of CLAUSES, validate them vs OpenMP constraints.
6744    Remove any elements from the list that are invalid.  */
6745 
6746 tree
finish_omp_clauses(tree clauses,enum c_omp_region_type ort)6747 finish_omp_clauses (tree clauses, enum c_omp_region_type ort)
6748 {
6749   bitmap_head generic_head, firstprivate_head, lastprivate_head;
6750   bitmap_head aligned_head, map_head, map_field_head, map_firstprivate_head;
6751   bitmap_head oacc_reduction_head, is_on_device_head;
6752   tree c, t, *pc;
6753   tree safelen = NULL_TREE;
6754   bool branch_seen = false;
6755   bool copyprivate_seen = false;
6756   bool ordered_seen = false;
6757   bool order_seen = false;
6758   bool schedule_seen = false;
6759   bool oacc_async = false;
6760   bool indir_component_ref_p = false;
6761   tree last_iterators = NULL_TREE;
6762   bool last_iterators_remove = false;
6763   /* 1 if normal/task reduction has been seen, -1 if inscan reduction
6764      has been seen, -2 if mixed inscan/normal reduction diagnosed.  */
6765   int reduction_seen = 0;
6766   bool allocate_seen = false;
6767   tree detach_seen = NULL_TREE;
6768   bool mergeable_seen = false;
6769   bool implicit_moved = false;
6770   bool target_in_reduction_seen = false;
6771 
6772   bitmap_obstack_initialize (NULL);
6773   bitmap_initialize (&generic_head, &bitmap_default_obstack);
6774   bitmap_initialize (&firstprivate_head, &bitmap_default_obstack);
6775   bitmap_initialize (&lastprivate_head, &bitmap_default_obstack);
6776   bitmap_initialize (&aligned_head, &bitmap_default_obstack);
6777   /* If ort == C_ORT_OMP_DECLARE_SIMD used as uniform_head instead.  */
6778   bitmap_initialize (&map_head, &bitmap_default_obstack);
6779   bitmap_initialize (&map_field_head, &bitmap_default_obstack);
6780   bitmap_initialize (&map_firstprivate_head, &bitmap_default_obstack);
6781   /* If ort == C_ORT_OMP used as nontemporal_head or use_device_xxx_head
6782      instead and for ort == C_ORT_OMP_TARGET used as in_reduction_head.  */
6783   bitmap_initialize (&oacc_reduction_head, &bitmap_default_obstack);
6784   bitmap_initialize (&is_on_device_head, &bitmap_default_obstack);
6785 
6786   if (ort & C_ORT_ACC)
6787     for (c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
6788       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_ASYNC)
6789           {
6790             oacc_async = true;
6791             break;
6792           }
6793 
6794   for (pc = &clauses, c = clauses; c ; c = *pc)
6795     {
6796       bool remove = false;
6797       bool field_ok = false;
6798 
6799       switch (OMP_CLAUSE_CODE (c))
6800           {
6801           case OMP_CLAUSE_SHARED:
6802             field_ok = ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP);
6803             goto check_dup_generic;
6804           case OMP_CLAUSE_PRIVATE:
6805             field_ok = ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP);
6806             goto check_dup_generic;
6807           case OMP_CLAUSE_REDUCTION:
6808             if (reduction_seen == 0)
6809               reduction_seen = OMP_CLAUSE_REDUCTION_INSCAN (c) ? -1 : 1;
6810             else if (reduction_seen != -2
6811                        && reduction_seen != (OMP_CLAUSE_REDUCTION_INSCAN (c)
6812                                                    ? -1 : 1))
6813               {
6814                 error_at (OMP_CLAUSE_LOCATION (c),
6815                               "%<inscan%> and non-%<inscan%> %<reduction%> clauses "
6816                               "on the same construct");
6817                 reduction_seen = -2;
6818               }
6819             /* FALLTHRU */
6820           case OMP_CLAUSE_IN_REDUCTION:
6821           case OMP_CLAUSE_TASK_REDUCTION:
6822             field_ok = ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP);
6823             t = OMP_CLAUSE_DECL (c);
6824             if (TREE_CODE (t) == TREE_LIST)
6825               {
6826                 if (handle_omp_array_sections (c, ort))
6827                     {
6828                       remove = true;
6829                       break;
6830                     }
6831                 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
6832                       && OMP_CLAUSE_REDUCTION_INSCAN (c))
6833                     {
6834                       error_at (OMP_CLAUSE_LOCATION (c),
6835                                   "%<inscan%> %<reduction%> clause with array "
6836                                   "section");
6837                       remove = true;
6838                       break;
6839                     }
6840                 if (TREE_CODE (t) == TREE_LIST)
6841                     {
6842                       while (TREE_CODE (t) == TREE_LIST)
6843                         t = TREE_CHAIN (t);
6844                     }
6845                 else
6846                     {
6847                       gcc_assert (TREE_CODE (t) == MEM_REF);
6848                       t = TREE_OPERAND (t, 0);
6849                       if (TREE_CODE (t) == POINTER_PLUS_EXPR)
6850                         t = TREE_OPERAND (t, 0);
6851                       if (TREE_CODE (t) == ADDR_EXPR
6852                           || INDIRECT_REF_P (t))
6853                         t = TREE_OPERAND (t, 0);
6854                     }
6855                 tree n = omp_clause_decl_field (t);
6856                 if (n)
6857                     t = n;
6858                 goto check_dup_generic_t;
6859               }
6860             if (oacc_async)
6861               cxx_mark_addressable (t);
6862             goto check_dup_generic;
6863           case OMP_CLAUSE_COPYPRIVATE:
6864             copyprivate_seen = true;
6865             field_ok = ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP);
6866             goto check_dup_generic;
6867           case OMP_CLAUSE_COPYIN:
6868             goto check_dup_generic;
6869           case OMP_CLAUSE_LINEAR:
6870             field_ok = ((ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP);
6871             t = OMP_CLAUSE_DECL (c);
6872             if (ort != C_ORT_OMP_DECLARE_SIMD
6873                 && OMP_CLAUSE_LINEAR_KIND (c) != OMP_CLAUSE_LINEAR_DEFAULT)
6874               {
6875                 error_at (OMP_CLAUSE_LOCATION (c),
6876                               "modifier should not be specified in %<linear%> "
6877                               "clause on %<simd%> or %<for%> constructs");
6878                 OMP_CLAUSE_LINEAR_KIND (c) = OMP_CLAUSE_LINEAR_DEFAULT;
6879               }
6880             if ((VAR_P (t) || TREE_CODE (t) == PARM_DECL)
6881                 && !type_dependent_expression_p (t))
6882               {
6883                 tree type = TREE_TYPE (t);
6884                 if ((OMP_CLAUSE_LINEAR_KIND (c) == OMP_CLAUSE_LINEAR_REF
6885                        || OMP_CLAUSE_LINEAR_KIND (c) == OMP_CLAUSE_LINEAR_UVAL)
6886                       && !TYPE_REF_P (type))
6887                     {
6888                       error_at (OMP_CLAUSE_LOCATION (c),
6889                                   "linear clause with %qs modifier applied to "
6890                                   "non-reference variable with %qT type",
6891                                   OMP_CLAUSE_LINEAR_KIND (c) == OMP_CLAUSE_LINEAR_REF
6892                                   ? "ref" : "uval", TREE_TYPE (t));
6893                       remove = true;
6894                       break;
6895                     }
6896                 if (TYPE_REF_P (type))
6897                     type = TREE_TYPE (type);
6898                 if (OMP_CLAUSE_LINEAR_KIND (c) != OMP_CLAUSE_LINEAR_REF)
6899                     {
6900                       if (!INTEGRAL_TYPE_P (type)
6901                           && !TYPE_PTR_P (type))
6902                         {
6903                           error_at (OMP_CLAUSE_LOCATION (c),
6904                                         "linear clause applied to non-integral "
6905                                         "non-pointer variable with %qT type",
6906                                         TREE_TYPE (t));
6907                           remove = true;
6908                           break;
6909                         }
6910                     }
6911               }
6912             t = OMP_CLAUSE_LINEAR_STEP (c);
6913             if (t == NULL_TREE)
6914               t = integer_one_node;
6915             if (t == error_mark_node)
6916               {
6917                 remove = true;
6918                 break;
6919               }
6920             else if (!type_dependent_expression_p (t)
6921                        && !INTEGRAL_TYPE_P (TREE_TYPE (t))
6922                        && (ort != C_ORT_OMP_DECLARE_SIMD
6923                            || TREE_CODE (t) != PARM_DECL
6924                            || !TYPE_REF_P (TREE_TYPE (t))
6925                            || !INTEGRAL_TYPE_P (TREE_TYPE (TREE_TYPE (t)))))
6926               {
6927                 error_at (OMP_CLAUSE_LOCATION (c),
6928                               "linear step expression must be integral");
6929                 remove = true;
6930                 break;
6931               }
6932             else
6933               {
6934                 t = mark_rvalue_use (t);
6935                 if (ort == C_ORT_OMP_DECLARE_SIMD && TREE_CODE (t) == PARM_DECL)
6936                     {
6937                       OMP_CLAUSE_LINEAR_VARIABLE_STRIDE (c) = 1;
6938                       goto check_dup_generic;
6939                     }
6940                 if (!processing_template_decl
6941                       && (VAR_P (OMP_CLAUSE_DECL (c))
6942                           || TREE_CODE (OMP_CLAUSE_DECL (c)) == PARM_DECL))
6943                     {
6944                       if (ort == C_ORT_OMP_DECLARE_SIMD)
6945                         {
6946                           t = maybe_constant_value (t);
6947                           if (TREE_CODE (t) != INTEGER_CST)
6948                               {
6949                                 error_at (OMP_CLAUSE_LOCATION (c),
6950                                             "%<linear%> clause step %qE is neither "
6951                                              "constant nor a parameter", t);
6952                                 remove = true;
6953                                 break;
6954                               }
6955                         }
6956                       t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
6957                       tree type = TREE_TYPE (OMP_CLAUSE_DECL (c));
6958                       if (TYPE_REF_P (type))
6959                         type = TREE_TYPE (type);
6960                       if (OMP_CLAUSE_LINEAR_KIND (c) == OMP_CLAUSE_LINEAR_REF)
6961                         {
6962                           type = build_pointer_type (type);
6963                           tree d = fold_convert (type, OMP_CLAUSE_DECL (c));
6964                           t = pointer_int_sum (OMP_CLAUSE_LOCATION (c), PLUS_EXPR,
6965                                                      d, t);
6966                           t = fold_build2_loc (OMP_CLAUSE_LOCATION (c),
6967                                                      MINUS_EXPR, sizetype,
6968                                                      fold_convert (sizetype, t),
6969                                                      fold_convert (sizetype, d));
6970                           if (t == error_mark_node)
6971                               {
6972                                 remove = true;
6973                                 break;
6974                               }
6975                         }
6976                       else if (TYPE_PTR_P (type)
6977                                  /* Can't multiply the step yet if *this
6978                                     is still incomplete type.  */
6979                                  && (ort != C_ORT_OMP_DECLARE_SIMD
6980                                      || TREE_CODE (OMP_CLAUSE_DECL (c)) != PARM_DECL
6981                                      || !DECL_ARTIFICIAL (OMP_CLAUSE_DECL (c))
6982                                      || DECL_NAME (OMP_CLAUSE_DECL (c))
6983                                           != this_identifier
6984                                      || !TYPE_BEING_DEFINED (TREE_TYPE (type))))
6985                         {
6986                           tree d = convert_from_reference (OMP_CLAUSE_DECL (c));
6987                           t = pointer_int_sum (OMP_CLAUSE_LOCATION (c), PLUS_EXPR,
6988                                                      d, t);
6989                           t = fold_build2_loc (OMP_CLAUSE_LOCATION (c),
6990                                                      MINUS_EXPR, sizetype,
6991                                                      fold_convert (sizetype, t),
6992                                                      fold_convert (sizetype, d));
6993                           if (t == error_mark_node)
6994                               {
6995                                 remove = true;
6996                                 break;
6997                               }
6998                         }
6999                       else
7000                         t = fold_convert (type, t);
7001                     }
7002                 OMP_CLAUSE_LINEAR_STEP (c) = t;
7003               }
7004             goto check_dup_generic;
7005           check_dup_generic:
7006             t = omp_clause_decl_field (OMP_CLAUSE_DECL (c));
7007             if (t)
7008               {
7009                 if (!remove && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_SHARED)
7010                     omp_note_field_privatization (t, OMP_CLAUSE_DECL (c));
7011               }
7012             else
7013               t = OMP_CLAUSE_DECL (c);
7014           check_dup_generic_t:
7015             if (t == current_class_ptr
7016                 && ((ort != C_ORT_OMP_DECLARE_SIMD && ort != C_ORT_ACC)
7017                       || (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_LINEAR
7018                           && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_UNIFORM)))
7019               {
7020                 error_at (OMP_CLAUSE_LOCATION (c),
7021                               "%<this%> allowed in OpenMP only in %<declare simd%>"
7022                               " clauses");
7023                 remove = true;
7024                 break;
7025               }
7026             if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL
7027                 && (!field_ok || TREE_CODE (t) != FIELD_DECL))
7028               {
7029                 if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
7030                     break;
7031                 if (DECL_P (t))
7032                     error_at (OMP_CLAUSE_LOCATION (c),
7033                                 "%qD is not a variable in clause %qs", t,
7034                                 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
7035                 else
7036                     error_at (OMP_CLAUSE_LOCATION (c),
7037                                 "%qE is not a variable in clause %qs", t,
7038                                 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
7039                 remove = true;
7040               }
7041             else if ((ort == C_ORT_ACC
7042                         && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION)
7043                        || (ort == C_ORT_OMP
7044                            && (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_PTR
7045                                  || (OMP_CLAUSE_CODE (c)
7046                                      == OMP_CLAUSE_USE_DEVICE_ADDR)))
7047                        || (ort == C_ORT_OMP_TARGET
7048                            && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION))
7049               {
7050                 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION
7051                       && (bitmap_bit_p (&generic_head, DECL_UID (t))
7052                           || bitmap_bit_p (&firstprivate_head, DECL_UID (t))))
7053                     {
7054                       error_at (OMP_CLAUSE_LOCATION (c),
7055                                   "%qD appears more than once in data-sharing "
7056                                   "clauses", t);
7057                       remove = true;
7058                       break;
7059                     }
7060                 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION)
7061                     target_in_reduction_seen = true;
7062                 if (bitmap_bit_p (&oacc_reduction_head, DECL_UID (t)))
7063                     {
7064                       error_at (OMP_CLAUSE_LOCATION (c),
7065                                   ort == C_ORT_ACC
7066                                   ? "%qD appears more than once in reduction clauses"
7067                                   : "%qD appears more than once in data clauses",
7068                                   t);
7069                       remove = true;
7070                     }
7071                 else
7072                     bitmap_set_bit (&oacc_reduction_head, DECL_UID (t));
7073               }
7074             else if (bitmap_bit_p (&generic_head, DECL_UID (t))
7075                        || bitmap_bit_p (&firstprivate_head, DECL_UID (t))
7076                        || bitmap_bit_p (&lastprivate_head, DECL_UID (t))
7077                        || bitmap_bit_p (&map_firstprivate_head, DECL_UID (t)))
7078               {
7079                 error_at (OMP_CLAUSE_LOCATION (c),
7080                               "%qD appears more than once in data clauses", t);
7081                 remove = true;
7082               }
7083             else if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
7084                         || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_HAS_DEVICE_ADDR
7085                         || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IS_DEVICE_PTR)
7086                        && bitmap_bit_p (&map_head, DECL_UID (t)))
7087               {
7088                 if (ort == C_ORT_ACC)
7089                     error_at (OMP_CLAUSE_LOCATION (c),
7090                                 "%qD appears more than once in data clauses", t);
7091                 else
7092                     error_at (OMP_CLAUSE_LOCATION (c),
7093                                 "%qD appears both in data and map clauses", t);
7094                 remove = true;
7095               }
7096             else
7097               bitmap_set_bit (&generic_head, DECL_UID (t));
7098             if (!field_ok)
7099               break;
7100           handle_field_decl:
7101             if (!remove
7102                 && TREE_CODE (t) == FIELD_DECL
7103                 && t == OMP_CLAUSE_DECL (c))
7104               {
7105                 OMP_CLAUSE_DECL (c)
7106                     = omp_privatize_field (t, (OMP_CLAUSE_CODE (c)
7107                                                      == OMP_CLAUSE_SHARED));
7108                 if (OMP_CLAUSE_DECL (c) == error_mark_node)
7109                     remove = true;
7110               }
7111             break;
7112 
7113           case OMP_CLAUSE_FIRSTPRIVATE:
7114             if (OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c) && !implicit_moved)
7115               {
7116               move_implicit:
7117                 implicit_moved = true;
7118                 /* Move firstprivate and map clauses with
7119                      OMP_CLAUSE_{FIRSTPRIVATE,MAP}_IMPLICIT set to the end of
7120                      clauses chain.  */
7121                 tree cl1 = NULL_TREE, cl2 = NULL_TREE;
7122                 tree *pc1 = pc, *pc2 = &cl1, *pc3 = &cl2;
7123                 while (*pc1)
7124                     if (OMP_CLAUSE_CODE (*pc1) == OMP_CLAUSE_FIRSTPRIVATE
7125                         && OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (*pc1))
7126                       {
7127                         *pc3 = *pc1;
7128                         pc3 = &OMP_CLAUSE_CHAIN (*pc3);
7129                         *pc1 = OMP_CLAUSE_CHAIN (*pc1);
7130                       }
7131                     else if (OMP_CLAUSE_CODE (*pc1) == OMP_CLAUSE_MAP
7132                                && OMP_CLAUSE_MAP_IMPLICIT (*pc1))
7133                       {
7134                         *pc2 = *pc1;
7135                         pc2 = &OMP_CLAUSE_CHAIN (*pc2);
7136                         *pc1 = OMP_CLAUSE_CHAIN (*pc1);
7137                       }
7138                     else
7139                       pc1 = &OMP_CLAUSE_CHAIN (*pc1);
7140                 *pc3 = NULL;
7141                 *pc2 = cl2;
7142                 *pc1 = cl1;
7143                 continue;
7144               }
7145             t = omp_clause_decl_field (OMP_CLAUSE_DECL (c));
7146             if (t)
7147               omp_note_field_privatization (t, OMP_CLAUSE_DECL (c));
7148             else
7149               t = OMP_CLAUSE_DECL (c);
7150             if (ort != C_ORT_ACC && t == current_class_ptr)
7151               {
7152                 error_at (OMP_CLAUSE_LOCATION (c),
7153                               "%<this%> allowed in OpenMP only in %<declare simd%>"
7154                               " clauses");
7155                 remove = true;
7156                 break;
7157               }
7158             if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL
7159                 && ((ort & C_ORT_OMP_DECLARE_SIMD) != C_ORT_OMP
7160                       || TREE_CODE (t) != FIELD_DECL))
7161               {
7162                 if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
7163                     break;
7164                 if (DECL_P (t))
7165                     error_at (OMP_CLAUSE_LOCATION (c),
7166                                 "%qD is not a variable in clause %<firstprivate%>",
7167                                 t);
7168                 else
7169                     error_at (OMP_CLAUSE_LOCATION (c),
7170                                 "%qE is not a variable in clause %<firstprivate%>",
7171                                 t);
7172                 remove = true;
7173               }
7174             else if (OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c)
7175                        && !OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT_TARGET (c)
7176                        && bitmap_bit_p (&map_firstprivate_head, DECL_UID (t)))
7177               remove = true;
7178             else if (bitmap_bit_p (&generic_head, DECL_UID (t))
7179                        || bitmap_bit_p (&firstprivate_head, DECL_UID (t))
7180                        || bitmap_bit_p (&map_firstprivate_head, DECL_UID (t)))
7181               {
7182                 error_at (OMP_CLAUSE_LOCATION (c),
7183                               "%qD appears more than once in data clauses", t);
7184                 remove = true;
7185               }
7186             else if (bitmap_bit_p (&map_head, DECL_UID (t)))
7187               {
7188                 if (ort == C_ORT_ACC)
7189                     error_at (OMP_CLAUSE_LOCATION (c),
7190                                 "%qD appears more than once in data clauses", t);
7191                 else if (OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT (c)
7192                            && !OMP_CLAUSE_FIRSTPRIVATE_IMPLICIT_TARGET (c))
7193                     /* Silently drop the clause.  */;
7194                 else
7195                     error_at (OMP_CLAUSE_LOCATION (c),
7196                                 "%qD appears both in data and map clauses", t);
7197                 remove = true;
7198               }
7199             else
7200               bitmap_set_bit (&firstprivate_head, DECL_UID (t));
7201             goto handle_field_decl;
7202 
7203           case OMP_CLAUSE_LASTPRIVATE:
7204             t = omp_clause_decl_field (OMP_CLAUSE_DECL (c));
7205             if (t)
7206               omp_note_field_privatization (t, OMP_CLAUSE_DECL (c));
7207             else
7208               t = OMP_CLAUSE_DECL (c);
7209             if (ort != C_ORT_ACC && t == current_class_ptr)
7210               {
7211                 error_at (OMP_CLAUSE_LOCATION (c),
7212                               "%<this%> allowed in OpenMP only in %<declare simd%>"
7213                               " clauses");
7214                 remove = true;
7215                 break;
7216               }
7217             if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL
7218                 && ((ort & C_ORT_OMP_DECLARE_SIMD) != C_ORT_OMP
7219                       || TREE_CODE (t) != FIELD_DECL))
7220               {
7221                 if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
7222                     break;
7223                 if (DECL_P (t))
7224                     error_at (OMP_CLAUSE_LOCATION (c),
7225                                 "%qD is not a variable in clause %<lastprivate%>",
7226                                 t);
7227                 else
7228                     error_at (OMP_CLAUSE_LOCATION (c),
7229                                 "%qE is not a variable in clause %<lastprivate%>",
7230                                 t);
7231                 remove = true;
7232               }
7233             else if (bitmap_bit_p (&generic_head, DECL_UID (t))
7234                        || bitmap_bit_p (&lastprivate_head, DECL_UID (t)))
7235               {
7236                 error_at (OMP_CLAUSE_LOCATION (c),
7237                               "%qD appears more than once in data clauses", t);
7238                 remove = true;
7239               }
7240             else
7241               bitmap_set_bit (&lastprivate_head, DECL_UID (t));
7242             goto handle_field_decl;
7243 
7244           case OMP_CLAUSE_IF:
7245             t = OMP_CLAUSE_IF_EXPR (c);
7246             t = maybe_convert_cond (t);
7247             if (t == error_mark_node)
7248               remove = true;
7249             else if (!processing_template_decl)
7250               t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7251             OMP_CLAUSE_IF_EXPR (c) = t;
7252             break;
7253 
7254           case OMP_CLAUSE_FINAL:
7255             t = OMP_CLAUSE_FINAL_EXPR (c);
7256             t = maybe_convert_cond (t);
7257             if (t == error_mark_node)
7258               remove = true;
7259             else if (!processing_template_decl)
7260               t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7261             OMP_CLAUSE_FINAL_EXPR (c) = t;
7262             break;
7263 
7264           case OMP_CLAUSE_GANG:
7265             /* Operand 1 is the gang static: argument.  */
7266             t = OMP_CLAUSE_OPERAND (c, 1);
7267             if (t != NULL_TREE)
7268               {
7269                 if (t == error_mark_node)
7270                     remove = true;
7271                 else if (!type_dependent_expression_p (t)
7272                            && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7273                     {
7274                       error_at (OMP_CLAUSE_LOCATION (c),
7275                                   "%<gang%> static expression must be integral");
7276                       remove = true;
7277                     }
7278                 else
7279                     {
7280                       t = mark_rvalue_use (t);
7281                       if (!processing_template_decl)
7282                         {
7283                           t = maybe_constant_value (t);
7284                           if (TREE_CODE (t) == INTEGER_CST
7285                                 && tree_int_cst_sgn (t) != 1
7286                                 && t != integer_minus_one_node)
7287                               {
7288                                 warning_at (OMP_CLAUSE_LOCATION (c), 0,
7289                                               "%<gang%> static value must be "
7290                                               "positive");
7291                                 t = integer_one_node;
7292                               }
7293                           t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7294                         }
7295                     }
7296                 OMP_CLAUSE_OPERAND (c, 1) = t;
7297               }
7298             /* Check operand 0, the num argument.  */
7299             /* FALLTHRU */
7300 
7301           case OMP_CLAUSE_WORKER:
7302           case OMP_CLAUSE_VECTOR:
7303             if (OMP_CLAUSE_OPERAND (c, 0) == NULL_TREE)
7304               break;
7305             /* FALLTHRU */
7306 
7307           case OMP_CLAUSE_NUM_TASKS:
7308           case OMP_CLAUSE_NUM_TEAMS:
7309           case OMP_CLAUSE_NUM_THREADS:
7310           case OMP_CLAUSE_NUM_GANGS:
7311           case OMP_CLAUSE_NUM_WORKERS:
7312           case OMP_CLAUSE_VECTOR_LENGTH:
7313             t = OMP_CLAUSE_OPERAND (c, 0);
7314             if (t == error_mark_node)
7315               remove = true;
7316             else if (!type_dependent_expression_p (t)
7317                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7318               {
7319                switch (OMP_CLAUSE_CODE (c))
7320                     {
7321                     case OMP_CLAUSE_GANG:
7322                       error_at (OMP_CLAUSE_LOCATION (c),
7323                                   "%<gang%> num expression must be integral"); break;
7324                     case OMP_CLAUSE_VECTOR:
7325                       error_at (OMP_CLAUSE_LOCATION (c),
7326                                   "%<vector%> length expression must be integral");
7327                       break;
7328                     case OMP_CLAUSE_WORKER:
7329                       error_at (OMP_CLAUSE_LOCATION (c),
7330                                   "%<worker%> num expression must be integral");
7331                       break;
7332                     default:
7333                       error_at (OMP_CLAUSE_LOCATION (c),
7334                                   "%qs expression must be integral",
7335                                   omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
7336                     }
7337                 remove = true;
7338               }
7339             else
7340               {
7341                 t = mark_rvalue_use (t);
7342                 if (!processing_template_decl)
7343                     {
7344                       t = maybe_constant_value (t);
7345                       if (TREE_CODE (t) == INTEGER_CST
7346                           && tree_int_cst_sgn (t) != 1)
7347                         {
7348                           switch (OMP_CLAUSE_CODE (c))
7349                               {
7350                               case OMP_CLAUSE_GANG:
7351                                 warning_at (OMP_CLAUSE_LOCATION (c), 0,
7352                                               "%<gang%> num value must be positive");
7353                                 break;
7354                               case OMP_CLAUSE_VECTOR:
7355                                 warning_at (OMP_CLAUSE_LOCATION (c), 0,
7356                                               "%<vector%> length value must be "
7357                                               "positive");
7358                                 break;
7359                               case OMP_CLAUSE_WORKER:
7360                                 warning_at (OMP_CLAUSE_LOCATION (c), 0,
7361                                               "%<worker%> num value must be "
7362                                               "positive");
7363                                 break;
7364                               default:
7365                                 warning_at (OMP_CLAUSE_LOCATION (c), 0,
7366                                               "%qs value must be positive",
7367                                               omp_clause_code_name
7368                                               [OMP_CLAUSE_CODE (c)]);
7369                               }
7370                           t = integer_one_node;
7371                         }
7372                       t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7373                     }
7374                 OMP_CLAUSE_OPERAND (c, 0) = t;
7375               }
7376             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_NUM_TEAMS
7377                 && OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (c)
7378                 && !remove)
7379               {
7380                 t = OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (c);
7381                 if (t == error_mark_node)
7382                     remove = true;
7383                 else if (!type_dependent_expression_p (t)
7384                            && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7385                     {
7386                       error_at (OMP_CLAUSE_LOCATION (c),
7387                                   "%qs expression must be integral",
7388                                   omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
7389                       remove = true;
7390                     }
7391                 else
7392                     {
7393                       t = mark_rvalue_use (t);
7394                       if (!processing_template_decl)
7395                         {
7396                           t = maybe_constant_value (t);
7397                           if (TREE_CODE (t) == INTEGER_CST
7398                                 && tree_int_cst_sgn (t) != 1)
7399                               {
7400                                 warning_at (OMP_CLAUSE_LOCATION (c), 0,
7401                                               "%qs value must be positive",
7402                                               omp_clause_code_name
7403                                               [OMP_CLAUSE_CODE (c)]);
7404                                 t = NULL_TREE;
7405                               }
7406                           else
7407                               t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7408                           tree upper = OMP_CLAUSE_NUM_TEAMS_UPPER_EXPR (c);
7409                           if (t
7410                                 && TREE_CODE (t) == INTEGER_CST
7411                                 && TREE_CODE (upper) == INTEGER_CST
7412                                 && tree_int_cst_lt (upper, t))
7413                               {
7414                                 warning_at (OMP_CLAUSE_LOCATION (c), 0,
7415                                               "%<num_teams%> lower bound %qE bigger "
7416                                               "than upper bound %qE", t, upper);
7417                                 t = NULL_TREE;
7418                               }
7419                         }
7420                       OMP_CLAUSE_NUM_TEAMS_LOWER_EXPR (c) = t;
7421                     }
7422               }
7423             break;
7424 
7425           case OMP_CLAUSE_SCHEDULE:
7426             t = OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c);
7427             if (t == NULL)
7428               ;
7429             else if (t == error_mark_node)
7430               remove = true;
7431             else if (!type_dependent_expression_p (t)
7432                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7433               {
7434                 error_at (OMP_CLAUSE_LOCATION (c),
7435                               "schedule chunk size expression must be integral");
7436                 remove = true;
7437               }
7438             else
7439               {
7440                 t = mark_rvalue_use (t);
7441                 if (!processing_template_decl)
7442                     {
7443                       t = maybe_constant_value (t);
7444                       if (TREE_CODE (t) == INTEGER_CST
7445                           && tree_int_cst_sgn (t) != 1)
7446                       {
7447                         warning_at (OMP_CLAUSE_LOCATION (c), 0,
7448                                     "chunk size value must be positive");
7449                         t = integer_one_node;
7450                       }
7451                       t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7452                     }
7453                 OMP_CLAUSE_SCHEDULE_CHUNK_EXPR (c) = t;
7454               }
7455             if (!remove)
7456               schedule_seen = true;
7457             break;
7458 
7459           case OMP_CLAUSE_SIMDLEN:
7460           case OMP_CLAUSE_SAFELEN:
7461             t = OMP_CLAUSE_OPERAND (c, 0);
7462             if (t == error_mark_node)
7463               remove = true;
7464             else if (!type_dependent_expression_p (t)
7465                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7466               {
7467                 error_at (OMP_CLAUSE_LOCATION (c),
7468                               "%qs length expression must be integral",
7469                               omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
7470                 remove = true;
7471               }
7472             else
7473               {
7474                 t = mark_rvalue_use (t);
7475                 if (!processing_template_decl)
7476                     {
7477                       t = maybe_constant_value (t);
7478                       if (TREE_CODE (t) != INTEGER_CST
7479                           || tree_int_cst_sgn (t) != 1)
7480                         {
7481                           error_at (OMP_CLAUSE_LOCATION (c),
7482                                         "%qs length expression must be positive "
7483                                         "constant integer expression",
7484                                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
7485                           remove = true;
7486                         }
7487                     }
7488                 OMP_CLAUSE_OPERAND (c, 0) = t;
7489                 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SAFELEN)
7490                     safelen = c;
7491               }
7492             break;
7493 
7494           case OMP_CLAUSE_ASYNC:
7495             t = OMP_CLAUSE_ASYNC_EXPR (c);
7496             if (t == error_mark_node)
7497               remove = true;
7498             else if (!type_dependent_expression_p (t)
7499                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7500               {
7501                 error_at (OMP_CLAUSE_LOCATION (c),
7502                               "%<async%> expression must be integral");
7503                 remove = true;
7504               }
7505             else
7506               {
7507                 t = mark_rvalue_use (t);
7508                 if (!processing_template_decl)
7509                     t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7510                 OMP_CLAUSE_ASYNC_EXPR (c) = t;
7511               }
7512             break;
7513 
7514           case OMP_CLAUSE_WAIT:
7515             t = OMP_CLAUSE_WAIT_EXPR (c);
7516             if (t == error_mark_node)
7517               remove = true;
7518             else if (!processing_template_decl)
7519               t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7520             OMP_CLAUSE_WAIT_EXPR (c) = t;
7521             break;
7522 
7523           case OMP_CLAUSE_THREAD_LIMIT:
7524             t = OMP_CLAUSE_THREAD_LIMIT_EXPR (c);
7525             if (t == error_mark_node)
7526               remove = true;
7527             else if (!type_dependent_expression_p (t)
7528                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7529               {
7530                 error_at (OMP_CLAUSE_LOCATION (c),
7531                               "%<thread_limit%> expression must be integral");
7532                 remove = true;
7533               }
7534             else
7535               {
7536                 t = mark_rvalue_use (t);
7537                 if (!processing_template_decl)
7538                     {
7539                       t = maybe_constant_value (t);
7540                       if (TREE_CODE (t) == INTEGER_CST
7541                           && tree_int_cst_sgn (t) != 1)
7542                         {
7543                           warning_at (OMP_CLAUSE_LOCATION (c), 0,
7544                                           "%<thread_limit%> value must be positive");
7545                           t = integer_one_node;
7546                         }
7547                       t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7548                     }
7549                 OMP_CLAUSE_THREAD_LIMIT_EXPR (c) = t;
7550               }
7551             break;
7552 
7553           case OMP_CLAUSE_DEVICE:
7554             t = OMP_CLAUSE_DEVICE_ID (c);
7555             if (t == error_mark_node)
7556               remove = true;
7557             else if (!type_dependent_expression_p (t)
7558                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7559               {
7560                 error_at (OMP_CLAUSE_LOCATION (c),
7561                               "%<device%> id must be integral");
7562                 remove = true;
7563               }
7564             else if (OMP_CLAUSE_DEVICE_ANCESTOR (c)
7565                        && TREE_CODE (t) == INTEGER_CST
7566                        && !integer_onep (t))
7567               {
7568                 error_at (OMP_CLAUSE_LOCATION (c),
7569                               "the %<device%> clause expression must evaluate to "
7570                               "%<1%>");
7571                 remove = true;
7572               }
7573             else
7574               {
7575                 t = mark_rvalue_use (t);
7576                 if (!processing_template_decl)
7577                     t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7578                 OMP_CLAUSE_DEVICE_ID (c) = t;
7579               }
7580             break;
7581 
7582           case OMP_CLAUSE_DIST_SCHEDULE:
7583             t = OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (c);
7584             if (t == NULL)
7585               ;
7586             else if (t == error_mark_node)
7587               remove = true;
7588             else if (!type_dependent_expression_p (t)
7589                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7590               {
7591                 error_at (OMP_CLAUSE_LOCATION (c),
7592                               "%<dist_schedule%> chunk size expression must be "
7593                               "integral");
7594                 remove = true;
7595               }
7596             else
7597               {
7598                 t = mark_rvalue_use (t);
7599                 if (!processing_template_decl)
7600                     t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7601                 OMP_CLAUSE_DIST_SCHEDULE_CHUNK_EXPR (c) = t;
7602               }
7603             break;
7604 
7605           case OMP_CLAUSE_ALIGNED:
7606             t = OMP_CLAUSE_DECL (c);
7607             if (t == current_class_ptr && ort != C_ORT_OMP_DECLARE_SIMD)
7608               {
7609                 error_at (OMP_CLAUSE_LOCATION (c),
7610                               "%<this%> allowed in OpenMP only in %<declare simd%>"
7611                               " clauses");
7612                 remove = true;
7613                 break;
7614               }
7615             if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
7616               {
7617                 if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
7618                     break;
7619                 if (DECL_P (t))
7620                     error_at (OMP_CLAUSE_LOCATION (c),
7621                                 "%qD is not a variable in %<aligned%> clause", t);
7622                 else
7623                     error_at (OMP_CLAUSE_LOCATION (c),
7624                                 "%qE is not a variable in %<aligned%> clause", t);
7625                 remove = true;
7626               }
7627             else if (!type_dependent_expression_p (t)
7628                        && !TYPE_PTR_P (TREE_TYPE (t))
7629                        && TREE_CODE (TREE_TYPE (t)) != ARRAY_TYPE
7630                        && (!TYPE_REF_P (TREE_TYPE (t))
7631                            || (!INDIRECT_TYPE_P (TREE_TYPE (TREE_TYPE (t)))
7632                                  && (TREE_CODE (TREE_TYPE (TREE_TYPE (t)))
7633                                      != ARRAY_TYPE))))
7634               {
7635                 error_at (OMP_CLAUSE_LOCATION (c),
7636                               "%qE in %<aligned%> clause is neither a pointer nor "
7637                               "an array nor a reference to pointer or array", t);
7638                 remove = true;
7639               }
7640             else if (bitmap_bit_p (&aligned_head, DECL_UID (t)))
7641               {
7642                 error_at (OMP_CLAUSE_LOCATION (c),
7643                               "%qD appears more than once in %<aligned%> clauses",
7644                               t);
7645                 remove = true;
7646               }
7647             else
7648               bitmap_set_bit (&aligned_head, DECL_UID (t));
7649             t = OMP_CLAUSE_ALIGNED_ALIGNMENT (c);
7650             if (t == error_mark_node)
7651               remove = true;
7652             else if (t == NULL_TREE)
7653               break;
7654             else if (!type_dependent_expression_p (t)
7655                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
7656               {
7657                 error_at (OMP_CLAUSE_LOCATION (c),
7658                               "%<aligned%> clause alignment expression must "
7659                               "be integral");
7660                 remove = true;
7661               }
7662             else
7663               {
7664                 t = mark_rvalue_use (t);
7665                 if (!processing_template_decl)
7666                     {
7667                       t = maybe_constant_value (t);
7668                       if (TREE_CODE (t) != INTEGER_CST
7669                           || tree_int_cst_sgn (t) != 1)
7670                         {
7671                           error_at (OMP_CLAUSE_LOCATION (c),
7672                                         "%<aligned%> clause alignment expression must "
7673                                         "be positive constant integer expression");
7674                           remove = true;
7675                         }
7676                       else
7677                         t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
7678                     }
7679                 OMP_CLAUSE_ALIGNED_ALIGNMENT (c) = t;
7680               }
7681             break;
7682 
7683           case OMP_CLAUSE_NONTEMPORAL:
7684             t = OMP_CLAUSE_DECL (c);
7685             if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
7686               {
7687                 if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
7688                     break;
7689                 if (DECL_P (t))
7690                     error_at (OMP_CLAUSE_LOCATION (c),
7691                                 "%qD is not a variable in %<nontemporal%> clause",
7692                                 t);
7693                 else
7694                     error_at (OMP_CLAUSE_LOCATION (c),
7695                                 "%qE is not a variable in %<nontemporal%> clause",
7696                                 t);
7697                 remove = true;
7698               }
7699             else if (bitmap_bit_p (&oacc_reduction_head, DECL_UID (t)))
7700               {
7701                 error_at (OMP_CLAUSE_LOCATION (c),
7702                               "%qD appears more than once in %<nontemporal%> "
7703                               "clauses", t);
7704                 remove = true;
7705               }
7706             else
7707               bitmap_set_bit (&oacc_reduction_head, DECL_UID (t));
7708             break;
7709 
7710           case OMP_CLAUSE_ALLOCATE:
7711             t = omp_clause_decl_field (OMP_CLAUSE_DECL (c));
7712             if (t)
7713               omp_note_field_privatization (t, OMP_CLAUSE_DECL (c));
7714             else
7715               t = OMP_CLAUSE_DECL (c);
7716             if (t == current_class_ptr)
7717               {
7718                 error_at (OMP_CLAUSE_LOCATION (c),
7719                               "%<this%> not allowed in %<allocate%> clause");
7720                 remove = true;
7721                 break;
7722               }
7723             if (!VAR_P (t)
7724                 && TREE_CODE (t) != PARM_DECL
7725                 && TREE_CODE (t) != FIELD_DECL)
7726               {
7727                 if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
7728                     break;
7729                 if (DECL_P (t))
7730                     error_at (OMP_CLAUSE_LOCATION (c),
7731                                 "%qD is not a variable in %<allocate%> clause", t);
7732                 else
7733                     error_at (OMP_CLAUSE_LOCATION (c),
7734                                 "%qE is not a variable in %<allocate%> clause", t);
7735                 remove = true;
7736               }
7737             else if (bitmap_bit_p (&aligned_head, DECL_UID (t)))
7738               {
7739                 warning_at (OMP_CLAUSE_LOCATION (c), 0,
7740                               "%qD appears more than once in %<allocate%> clauses",
7741                               t);
7742                 remove = true;
7743               }
7744             else
7745               {
7746                 bitmap_set_bit (&aligned_head, DECL_UID (t));
7747                 allocate_seen = true;
7748               }
7749             tree allocator, align;
7750             align = OMP_CLAUSE_ALLOCATE_ALIGN (c);
7751             if (error_operand_p (align))
7752               {
7753                 remove = true;
7754                 break;
7755               }
7756             if (align)
7757               {
7758                 if (!type_dependent_expression_p (align)
7759                       && !INTEGRAL_TYPE_P (TREE_TYPE (align)))
7760                     {
7761                       error_at (OMP_CLAUSE_LOCATION (c),
7762                                   "%<allocate%> clause %<align%> modifier "
7763                                   "argument needs to be positive constant "
7764                                   "power of two integer expression");
7765                       remove = true;
7766                     }
7767                 else
7768                     {
7769                       align = mark_rvalue_use (align);
7770                       if (!processing_template_decl)
7771                         {
7772                           align = maybe_constant_value (align);
7773                           if (TREE_CODE (align) != INTEGER_CST
7774                                 || !tree_fits_uhwi_p (align)
7775                                 || !integer_pow2p (align))
7776                               {
7777                                 error_at (OMP_CLAUSE_LOCATION (c),
7778                                             "%<allocate%> clause %<align%> modifier "
7779                                             "argument needs to be positive constant "
7780                                             "power of two integer expression");
7781                                 remove = true;
7782                               }
7783                         }
7784                     }
7785                 OMP_CLAUSE_ALLOCATE_ALIGN (c) = align;
7786               }
7787             allocator = OMP_CLAUSE_ALLOCATE_ALLOCATOR (c);
7788             if (error_operand_p (allocator))
7789               {
7790                 remove = true;
7791                 break;
7792               }
7793             if (allocator == NULL_TREE)
7794               goto handle_field_decl;
7795             tree allocatort;
7796             allocatort = TYPE_MAIN_VARIANT (TREE_TYPE (allocator));
7797             if (!type_dependent_expression_p (allocator)
7798                 && (TREE_CODE (allocatort) != ENUMERAL_TYPE
7799                       || TYPE_NAME (allocatort) == NULL_TREE
7800                       || TREE_CODE (TYPE_NAME (allocatort)) != TYPE_DECL
7801                       || (DECL_NAME (TYPE_NAME (allocatort))
7802                           != get_identifier ("omp_allocator_handle_t"))
7803                       || (TYPE_CONTEXT (allocatort)
7804                           != DECL_CONTEXT (global_namespace))))
7805               {
7806                 error_at (OMP_CLAUSE_LOCATION (c),
7807                               "%<allocate%> clause allocator expression has "
7808                               "type %qT rather than %<omp_allocator_handle_t%>",
7809                               TREE_TYPE (allocator));
7810                 remove = true;
7811                 break;
7812               }
7813             else
7814               {
7815                 allocator = mark_rvalue_use (allocator);
7816                 if (!processing_template_decl)
7817                     allocator = maybe_constant_value (allocator);
7818                 OMP_CLAUSE_ALLOCATE_ALLOCATOR (c) = allocator;
7819               }
7820             goto handle_field_decl;
7821 
7822           case OMP_CLAUSE_DEPEND:
7823             t = OMP_CLAUSE_DECL (c);
7824             if (t == NULL_TREE)
7825               {
7826                 gcc_assert (OMP_CLAUSE_DEPEND_KIND (c)
7827                                 == OMP_CLAUSE_DEPEND_SOURCE);
7828                 break;
7829               }
7830             if (OMP_CLAUSE_DEPEND_KIND (c) == OMP_CLAUSE_DEPEND_SINK)
7831               {
7832                 if (cp_finish_omp_clause_depend_sink (c))
7833                     remove = true;
7834                 break;
7835               }
7836             /* FALLTHRU */
7837           case OMP_CLAUSE_AFFINITY:
7838             t = OMP_CLAUSE_DECL (c);
7839             if (TREE_CODE (t) == TREE_LIST
7840                 && TREE_PURPOSE (t)
7841                 && TREE_CODE (TREE_PURPOSE (t)) == TREE_VEC)
7842               {
7843                 if (TREE_PURPOSE (t) != last_iterators)
7844                     last_iterators_remove
7845                       = cp_omp_finish_iterators (TREE_PURPOSE (t));
7846                 last_iterators = TREE_PURPOSE (t);
7847                 t = TREE_VALUE (t);
7848                 if (last_iterators_remove)
7849                     t = error_mark_node;
7850               }
7851             else
7852               last_iterators = NULL_TREE;
7853 
7854             if (TREE_CODE (t) == TREE_LIST)
7855               {
7856                 if (handle_omp_array_sections (c, ort))
7857                     remove = true;
7858                 else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND
7859                            && (OMP_CLAUSE_DEPEND_KIND (c)
7860                                  == OMP_CLAUSE_DEPEND_DEPOBJ))
7861                     {
7862                       error_at (OMP_CLAUSE_LOCATION (c),
7863                                   "%<depend%> clause with %<depobj%> dependence "
7864                                   "type on array section");
7865                       remove = true;
7866                     }
7867                 break;
7868               }
7869             if (t == error_mark_node)
7870               remove = true;
7871             else if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
7872               break;
7873             else if (!lvalue_p (t))
7874               {
7875                 if (DECL_P (t))
7876                     error_at (OMP_CLAUSE_LOCATION (c),
7877                                 "%qD is not lvalue expression nor array section "
7878                                 "in %qs clause", t,
7879                                 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
7880                 else
7881                     error_at (OMP_CLAUSE_LOCATION (c),
7882                                 "%qE is not lvalue expression nor array section "
7883                                 "in %qs clause", t,
7884                                 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
7885                 remove = true;
7886               }
7887             else if (TREE_CODE (t) == COMPONENT_REF
7888                        && TREE_CODE (TREE_OPERAND (t, 1)) == FIELD_DECL
7889                        && DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
7890               {
7891                 error_at (OMP_CLAUSE_LOCATION (c),
7892                               "bit-field %qE in %qs clause", t,
7893                               omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
7894                 remove = true;
7895               }
7896             else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND
7897                        && OMP_CLAUSE_DEPEND_KIND (c) == OMP_CLAUSE_DEPEND_DEPOBJ)
7898               {
7899                 if (!c_omp_depend_t_p (TYPE_REF_P (TREE_TYPE (t))
7900                                              ? TREE_TYPE (TREE_TYPE (t))
7901                                              : TREE_TYPE (t)))
7902                     {
7903                       error_at (OMP_CLAUSE_LOCATION (c),
7904                                   "%qE does not have %<omp_depend_t%> type in "
7905                                   "%<depend%> clause with %<depobj%> dependence "
7906                                   "type", t);
7907                       remove = true;
7908                     }
7909               }
7910             else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_DEPEND
7911                        && c_omp_depend_t_p (TYPE_REF_P (TREE_TYPE (t))
7912                                                   ? TREE_TYPE (TREE_TYPE (t))
7913                                                   : TREE_TYPE (t)))
7914               {
7915                 error_at (OMP_CLAUSE_LOCATION (c),
7916                               "%qE should not have %<omp_depend_t%> type in "
7917                               "%<depend%> clause with dependence type other than "
7918                               "%<depobj%>", t);
7919                 remove = true;
7920               }
7921             if (!remove)
7922               {
7923                 tree addr = cp_build_addr_expr (t, tf_warning_or_error);
7924                 if (addr == error_mark_node)
7925                     remove = true;
7926                 else
7927                     {
7928                       t = cp_build_indirect_ref (OMP_CLAUSE_LOCATION (c),
7929                                                        addr, RO_UNARY_STAR,
7930                                                        tf_warning_or_error);
7931                       if (t == error_mark_node)
7932                         remove = true;
7933                       else if (TREE_CODE (OMP_CLAUSE_DECL (c)) == TREE_LIST
7934                                  && TREE_PURPOSE (OMP_CLAUSE_DECL (c))
7935                                  && (TREE_CODE (TREE_PURPOSE (OMP_CLAUSE_DECL (c)))
7936                                      == TREE_VEC))
7937                         TREE_VALUE (OMP_CLAUSE_DECL (c)) = t;
7938                       else
7939                         OMP_CLAUSE_DECL (c) = t;
7940                     }
7941               }
7942             break;
7943           case OMP_CLAUSE_DETACH:
7944             t = OMP_CLAUSE_DECL (c);
7945             if (detach_seen)
7946               {
7947                 error_at (OMP_CLAUSE_LOCATION (c),
7948                               "too many %qs clauses on a task construct",
7949                               "detach");
7950                 remove = true;
7951                 break;
7952               }
7953             else if (error_operand_p (t))
7954               {
7955                 remove = true;
7956                 break;
7957               }
7958             else
7959               {
7960                 tree type = TYPE_MAIN_VARIANT (TREE_TYPE (t));
7961                 if (!type_dependent_expression_p (t)
7962                       && (!INTEGRAL_TYPE_P (type)
7963                           || TREE_CODE (type) != ENUMERAL_TYPE
7964                           || TYPE_NAME (type) == NULL_TREE
7965                           || (DECL_NAME (TYPE_NAME (type))
7966                                 != get_identifier ("omp_event_handle_t"))))
7967                     {
7968                       error_at (OMP_CLAUSE_LOCATION (c),
7969                                   "%<detach%> clause event handle "
7970                                   "has type %qT rather than "
7971                                   "%<omp_event_handle_t%>",
7972                                   type);
7973                       remove = true;
7974                     }
7975                 detach_seen = c;
7976                 cxx_mark_addressable (t);
7977               }
7978             break;
7979 
7980           case OMP_CLAUSE_MAP:
7981             if (OMP_CLAUSE_MAP_IMPLICIT (c) && !implicit_moved)
7982               goto move_implicit;
7983             /* FALLTHRU */
7984           case OMP_CLAUSE_TO:
7985           case OMP_CLAUSE_FROM:
7986           case OMP_CLAUSE__CACHE_:
7987             t = OMP_CLAUSE_DECL (c);
7988             if (TREE_CODE (t) == TREE_LIST)
7989               {
7990                 if (handle_omp_array_sections (c, ort))
7991                     remove = true;
7992                 else
7993                     {
7994                       t = OMP_CLAUSE_DECL (c);
7995                       if (TREE_CODE (t) != TREE_LIST
7996                           && !type_dependent_expression_p (t)
7997                           && !cp_omp_mappable_type (TREE_TYPE (t)))
7998                         {
7999                           error_at (OMP_CLAUSE_LOCATION (c),
8000                                         "array section does not have mappable type "
8001                                         "in %qs clause",
8002                                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8003                           cp_omp_emit_unmappable_type_notes (TREE_TYPE (t));
8004                           remove = true;
8005                         }
8006                       while (TREE_CODE (t) == ARRAY_REF)
8007                         t = TREE_OPERAND (t, 0);
8008                       if (TREE_CODE (t) == COMPONENT_REF
8009                           && TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE)
8010                         {
8011                           do
8012                               {
8013                                 t = TREE_OPERAND (t, 0);
8014                                 if (REFERENCE_REF_P (t))
8015                                   t = TREE_OPERAND (t, 0);
8016                                 if (TREE_CODE (t) == MEM_REF
8017                                     || TREE_CODE (t) == INDIRECT_REF)
8018                                   {
8019                                     t = TREE_OPERAND (t, 0);
8020                                     STRIP_NOPS (t);
8021                                     if (TREE_CODE (t) == POINTER_PLUS_EXPR)
8022                                         t = TREE_OPERAND (t, 0);
8023                                   }
8024                               }
8025                           while (TREE_CODE (t) == COMPONENT_REF
8026                                    || TREE_CODE (t) == ARRAY_REF);
8027 
8028                           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
8029                                 && OMP_CLAUSE_MAP_IMPLICIT (c)
8030                                 && (bitmap_bit_p (&map_head, DECL_UID (t))
8031                                     || bitmap_bit_p (&map_field_head, DECL_UID (t))
8032                                     || bitmap_bit_p (&map_firstprivate_head,
8033                                                          DECL_UID (t))))
8034                               {
8035                                 remove = true;
8036                                 break;
8037                               }
8038                           if (bitmap_bit_p (&map_field_head, DECL_UID (t)))
8039                               break;
8040                           if (bitmap_bit_p (&map_head, DECL_UID (t)))
8041                               {
8042                                 if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
8043                                   error_at (OMP_CLAUSE_LOCATION (c),
8044                                               "%qD appears more than once in motion"
8045                                               " clauses", t);
8046                                 else if (ort == C_ORT_ACC)
8047                                   error_at (OMP_CLAUSE_LOCATION (c),
8048                                               "%qD appears more than once in data"
8049                                               " clauses", t);
8050                                 else
8051                                   error_at (OMP_CLAUSE_LOCATION (c),
8052                                               "%qD appears more than once in map"
8053                                               " clauses", t);
8054                                 remove = true;
8055                               }
8056                           else
8057                               {
8058                                 bitmap_set_bit (&map_head, DECL_UID (t));
8059                                 bitmap_set_bit (&map_field_head, DECL_UID (t));
8060                               }
8061                         }
8062                     }
8063                 if (cp_oacc_check_attachments (c))
8064                     remove = true;
8065                 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
8066                       && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH
8067                           || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_DETACH))
8068                     /* In this case, we have a single array element which is a
8069                        pointer, and we already set OMP_CLAUSE_SIZE in
8070                        handle_omp_array_sections above.  For attach/detach clauses,
8071                        reset the OMP_CLAUSE_SIZE (representing a bias) to zero
8072                        here.  */
8073                     OMP_CLAUSE_SIZE (c) = size_zero_node;
8074                 break;
8075               }
8076             if (t == error_mark_node)
8077               {
8078                 remove = true;
8079                 break;
8080               }
8081             /* OpenACC attach / detach clauses must be pointers.  */
8082             if (cp_oacc_check_attachments (c))
8083               {
8084                 remove = true;
8085                 break;
8086               }
8087             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
8088                 && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH
8089                       || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_DETACH))
8090               /* For attach/detach clauses, set OMP_CLAUSE_SIZE (representing a
8091                  bias) to zero here, so it is not set erroneously to the pointer
8092                  size later on in gimplify.cc.  */
8093               OMP_CLAUSE_SIZE (c) = size_zero_node;
8094             if (REFERENCE_REF_P (t)
8095                 && TREE_CODE (TREE_OPERAND (t, 0)) == COMPONENT_REF)
8096               {
8097                 t = TREE_OPERAND (t, 0);
8098                 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
8099                       && OMP_CLAUSE_MAP_KIND (c) != GOMP_MAP_ATTACH_DETACH)
8100                     OMP_CLAUSE_DECL (c) = t;
8101               }
8102             while (TREE_CODE (t) == INDIRECT_REF
8103                      || TREE_CODE (t) == ARRAY_REF)
8104               {
8105                 t = TREE_OPERAND (t, 0);
8106                 STRIP_NOPS (t);
8107                 if (TREE_CODE (t) == POINTER_PLUS_EXPR)
8108                     t = TREE_OPERAND (t, 0);
8109               }
8110             while (TREE_CODE (t) == COMPOUND_EXPR)
8111               {
8112                 t = TREE_OPERAND (t, 1);
8113                 STRIP_NOPS (t);
8114               }
8115             indir_component_ref_p = false;
8116             if (TREE_CODE (t) == COMPONENT_REF
8117                 && (TREE_CODE (TREE_OPERAND (t, 0)) == INDIRECT_REF
8118                       || TREE_CODE (TREE_OPERAND (t, 0)) == ARRAY_REF))
8119               {
8120                 t = TREE_OPERAND (TREE_OPERAND (t, 0), 0);
8121                 indir_component_ref_p = true;
8122                 STRIP_NOPS (t);
8123                 if (TREE_CODE (t) == POINTER_PLUS_EXPR)
8124                     t = TREE_OPERAND (t, 0);
8125               }
8126             if (TREE_CODE (t) == COMPONENT_REF
8127                 && OMP_CLAUSE_CODE (c) != OMP_CLAUSE__CACHE_)
8128               {
8129                 if (type_dependent_expression_p (t))
8130                     break;
8131                 if (TREE_CODE (TREE_OPERAND (t, 1)) == FIELD_DECL
8132                       && DECL_BIT_FIELD (TREE_OPERAND (t, 1)))
8133                     {
8134                       error_at (OMP_CLAUSE_LOCATION (c),
8135                                   "bit-field %qE in %qs clause",
8136                                   t, omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8137                       remove = true;
8138                     }
8139                 else if (!cp_omp_mappable_type (TREE_TYPE (t)))
8140                     {
8141                       error_at (OMP_CLAUSE_LOCATION (c),
8142                                   "%qE does not have a mappable type in %qs clause",
8143                                   t, omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8144                       cp_omp_emit_unmappable_type_notes (TREE_TYPE (t));
8145                       remove = true;
8146                     }
8147                 while (TREE_CODE (t) == COMPONENT_REF)
8148                     {
8149                       if (TREE_TYPE (TREE_OPERAND (t, 0))
8150                           && (TREE_CODE (TREE_TYPE (TREE_OPERAND (t, 0)))
8151                                 == UNION_TYPE))
8152                         {
8153                           error_at (OMP_CLAUSE_LOCATION (c),
8154                                         "%qE is a member of a union", t);
8155                           remove = true;
8156                           break;
8157                         }
8158                       t = TREE_OPERAND (t, 0);
8159                       if (TREE_CODE (t) == MEM_REF)
8160                         {
8161                           if (maybe_ne (mem_ref_offset (t), 0))
8162                               error_at (OMP_CLAUSE_LOCATION (c),
8163                                           "cannot dereference %qE in %qs clause", t,
8164                                           omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8165                           else
8166                               t = TREE_OPERAND (t, 0);
8167                         }
8168                       while (TREE_CODE (t) == MEM_REF
8169                                || TREE_CODE (t) == INDIRECT_REF
8170                                || TREE_CODE (t) == ARRAY_REF)
8171                         {
8172                           t = TREE_OPERAND (t, 0);
8173                           STRIP_NOPS (t);
8174                           if (TREE_CODE (t) == POINTER_PLUS_EXPR)
8175                               t = TREE_OPERAND (t, 0);
8176                         }
8177                     }
8178                 if (remove)
8179                     break;
8180                 if (REFERENCE_REF_P (t))
8181                     t = TREE_OPERAND (t, 0);
8182                 if (VAR_P (t) || TREE_CODE (t) == PARM_DECL)
8183                     {
8184                       if (bitmap_bit_p (&map_field_head, DECL_UID (t))
8185                           || (ort != C_ORT_ACC
8186                                 && bitmap_bit_p (&map_head, DECL_UID (t))))
8187                         goto handle_map_references;
8188                     }
8189               }
8190             if (!processing_template_decl
8191                 && TREE_CODE (t) == FIELD_DECL)
8192               {
8193                 OMP_CLAUSE_DECL (c) = finish_non_static_data_member (t, NULL_TREE,
8194                                                                                    NULL_TREE);
8195                 break;
8196               }
8197             if (!VAR_P (t) && TREE_CODE (t) != PARM_DECL)
8198               {
8199                 if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
8200                     break;
8201                 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
8202                       && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER
8203                           || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ALWAYS_POINTER
8204                           || OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_ATTACH_DETACH))
8205                     break;
8206                 if (DECL_P (t))
8207                     error_at (OMP_CLAUSE_LOCATION (c),
8208                                 "%qD is not a variable in %qs clause", t,
8209                                 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8210                 else
8211                     error_at (OMP_CLAUSE_LOCATION (c),
8212                                 "%qE is not a variable in %qs clause", t,
8213                                 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8214                 remove = true;
8215               }
8216             else if (VAR_P (t) && CP_DECL_THREAD_LOCAL_P (t))
8217               {
8218                 error_at (OMP_CLAUSE_LOCATION (c),
8219                               "%qD is threadprivate variable in %qs clause", t,
8220                               omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8221                 remove = true;
8222               }
8223             else if (!processing_template_decl
8224                        && !TYPE_REF_P (TREE_TYPE (t))
8225                        && (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP
8226                            || (OMP_CLAUSE_MAP_KIND (c)
8227                                  != GOMP_MAP_FIRSTPRIVATE_POINTER))
8228                        && !indir_component_ref_p
8229                        && !cxx_mark_addressable (t))
8230               remove = true;
8231             else if (!(OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
8232                          && (OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_POINTER
8233                                || (OMP_CLAUSE_MAP_KIND (c)
8234                                    == GOMP_MAP_FIRSTPRIVATE_POINTER)))
8235                        && t == OMP_CLAUSE_DECL (c)
8236                        && !type_dependent_expression_p (t)
8237                        && !cp_omp_mappable_type (TYPE_REF_P (TREE_TYPE (t))
8238                                                        ? TREE_TYPE (TREE_TYPE (t))
8239                                                        : TREE_TYPE (t)))
8240               {
8241                 error_at (OMP_CLAUSE_LOCATION (c),
8242                               "%qD does not have a mappable type in %qs clause", t,
8243                               omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8244                 cp_omp_emit_unmappable_type_notes (TREE_TYPE (t));
8245                 remove = true;
8246               }
8247             else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
8248                        && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FORCE_DEVICEPTR
8249                        && !type_dependent_expression_p (t)
8250                        && !INDIRECT_TYPE_P (TREE_TYPE (t)))
8251               {
8252                 error_at (OMP_CLAUSE_LOCATION (c),
8253                               "%qD is not a pointer variable", t);
8254                 remove = true;
8255               }
8256             else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
8257                        && OMP_CLAUSE_MAP_IMPLICIT (c)
8258                        && (bitmap_bit_p (&map_head, DECL_UID (t))
8259                            || bitmap_bit_p (&map_field_head, DECL_UID (t))
8260                            || bitmap_bit_p (&map_firstprivate_head,
8261                                                   DECL_UID (t))))
8262               remove = true;
8263             else if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP
8264                        && OMP_CLAUSE_MAP_KIND (c) == GOMP_MAP_FIRSTPRIVATE_POINTER)
8265               {
8266                 if (bitmap_bit_p (&generic_head, DECL_UID (t))
8267                       || bitmap_bit_p (&firstprivate_head, DECL_UID (t))
8268                       || bitmap_bit_p (&map_firstprivate_head, DECL_UID (t)))
8269                     {
8270                       error_at (OMP_CLAUSE_LOCATION (c),
8271                                   "%qD appears more than once in data clauses", t);
8272                       remove = true;
8273                     }
8274                 else if (bitmap_bit_p (&map_head, DECL_UID (t))
8275                            && !bitmap_bit_p (&map_field_head, DECL_UID (t)))
8276                     {
8277                       if (ort == C_ORT_ACC)
8278                         error_at (OMP_CLAUSE_LOCATION (c),
8279                                     "%qD appears more than once in data clauses", t);
8280                       else
8281                         error_at (OMP_CLAUSE_LOCATION (c),
8282                                     "%qD appears both in data and map clauses", t);
8283                       remove = true;
8284                     }
8285                 else
8286                     bitmap_set_bit (&map_firstprivate_head, DECL_UID (t));
8287               }
8288             else if (bitmap_bit_p (&map_head, DECL_UID (t))
8289                        && !bitmap_bit_p (&map_field_head, DECL_UID (t)))
8290               {
8291                 if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
8292                     error_at (OMP_CLAUSE_LOCATION (c),
8293                                 "%qD appears more than once in motion clauses", t);
8294                 else if (ort == C_ORT_ACC)
8295                     error_at (OMP_CLAUSE_LOCATION (c),
8296                                 "%qD appears more than once in data clauses", t);
8297                 else
8298                     error_at (OMP_CLAUSE_LOCATION (c),
8299                                 "%qD appears more than once in map clauses", t);
8300                 remove = true;
8301               }
8302             else if (ort == C_ORT_ACC
8303                        && bitmap_bit_p (&generic_head, DECL_UID (t)))
8304               {
8305                 error_at (OMP_CLAUSE_LOCATION (c),
8306                               "%qD appears more than once in data clauses", t);
8307                 remove = true;
8308               }
8309             else if (bitmap_bit_p (&firstprivate_head, DECL_UID (t))
8310                        || bitmap_bit_p (&is_on_device_head, DECL_UID (t)))
8311               {
8312                 if (ort == C_ORT_ACC)
8313                     error_at (OMP_CLAUSE_LOCATION (c),
8314                                 "%qD appears more than once in data clauses", t);
8315                 else
8316                     error_at (OMP_CLAUSE_LOCATION (c),
8317                                 "%qD appears both in data and map clauses", t);
8318                 remove = true;
8319               }
8320             else
8321               {
8322                 bitmap_set_bit (&map_head, DECL_UID (t));
8323 
8324                 tree decl = OMP_CLAUSE_DECL (c);
8325                 if (t != decl
8326                       && (TREE_CODE (decl) == COMPONENT_REF
8327                           || (INDIRECT_REF_P (decl)
8328                                 && TREE_CODE (TREE_OPERAND (decl, 0)) == COMPONENT_REF
8329                                 && TYPE_REF_P (TREE_TYPE (TREE_OPERAND (decl, 0))))))
8330                     bitmap_set_bit (&map_field_head, DECL_UID (t));
8331               }
8332           handle_map_references:
8333             if (!remove
8334                 && !processing_template_decl
8335                 && ort != C_ORT_DECLARE_SIMD
8336                 && TYPE_REF_P (TREE_TYPE (OMP_CLAUSE_DECL (c))))
8337               {
8338                 t = OMP_CLAUSE_DECL (c);
8339                 if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
8340                     {
8341                       OMP_CLAUSE_DECL (c) = build_simple_mem_ref (t);
8342                       if (OMP_CLAUSE_SIZE (c) == NULL_TREE)
8343                         OMP_CLAUSE_SIZE (c)
8344                           = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (t)));
8345                     }
8346                 else if (OMP_CLAUSE_MAP_KIND (c)
8347                            != GOMP_MAP_FIRSTPRIVATE_POINTER
8348                            && (OMP_CLAUSE_MAP_KIND (c)
8349                                  != GOMP_MAP_FIRSTPRIVATE_REFERENCE)
8350                            && (OMP_CLAUSE_MAP_KIND (c)
8351                                  != GOMP_MAP_ALWAYS_POINTER)
8352                            && (OMP_CLAUSE_MAP_KIND (c)
8353                                  != GOMP_MAP_ATTACH_DETACH))
8354                     {
8355                       tree c2 = build_omp_clause (OMP_CLAUSE_LOCATION (c),
8356                                                         OMP_CLAUSE_MAP);
8357                       if (TREE_CODE (t) == COMPONENT_REF)
8358                         OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_ALWAYS_POINTER);
8359                       else
8360                         OMP_CLAUSE_SET_MAP_KIND (c2,
8361                                                        GOMP_MAP_FIRSTPRIVATE_REFERENCE);
8362                       OMP_CLAUSE_DECL (c2) = t;
8363                       OMP_CLAUSE_SIZE (c2) = size_zero_node;
8364                       OMP_CLAUSE_CHAIN (c2) = OMP_CLAUSE_CHAIN (c);
8365                       OMP_CLAUSE_CHAIN (c) = c2;
8366                       OMP_CLAUSE_DECL (c) = build_simple_mem_ref (t);
8367                       if (OMP_CLAUSE_SIZE (c) == NULL_TREE)
8368                         OMP_CLAUSE_SIZE (c)
8369                           = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (t)));
8370                       c = c2;
8371                     }
8372               }
8373             break;
8374 
8375           case OMP_CLAUSE_TO_DECLARE:
8376           case OMP_CLAUSE_LINK:
8377             t = OMP_CLAUSE_DECL (c);
8378             if (TREE_CODE (t) == FUNCTION_DECL
8379                 && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO_DECLARE)
8380               ;
8381             else if (!VAR_P (t))
8382               {
8383                 if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TO_DECLARE)
8384                     {
8385                       if (TREE_CODE (t) == TEMPLATE_ID_EXPR)
8386                         error_at (OMP_CLAUSE_LOCATION (c),
8387                                     "template %qE in clause %qs", t,
8388                                     omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8389                       else if (really_overloaded_fn (t))
8390                         error_at (OMP_CLAUSE_LOCATION (c),
8391                                     "overloaded function name %qE in clause %qs", t,
8392                                     omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8393                       else
8394                         error_at (OMP_CLAUSE_LOCATION (c),
8395                                     "%qE is neither a variable nor a function name "
8396                                     "in clause %qs", t,
8397                                     omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8398                     }
8399                 else
8400                     error_at (OMP_CLAUSE_LOCATION (c),
8401                                 "%qE is not a variable in clause %qs", t,
8402                                 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8403                 remove = true;
8404               }
8405             else if (DECL_THREAD_LOCAL_P (t))
8406               {
8407                 error_at (OMP_CLAUSE_LOCATION (c),
8408                               "%qD is threadprivate variable in %qs clause", t,
8409                               omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8410                 remove = true;
8411               }
8412             else if (!cp_omp_mappable_type (TREE_TYPE (t)))
8413               {
8414                 error_at (OMP_CLAUSE_LOCATION (c),
8415                               "%qD does not have a mappable type in %qs clause", t,
8416                               omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8417                 cp_omp_emit_unmappable_type_notes (TREE_TYPE (t));
8418                 remove = true;
8419               }
8420             if (remove)
8421               break;
8422             if (bitmap_bit_p (&generic_head, DECL_UID (t)))
8423               {
8424                 error_at (OMP_CLAUSE_LOCATION (c),
8425                               "%qE appears more than once on the same "
8426                               "%<declare target%> directive", t);
8427                 remove = true;
8428               }
8429             else
8430               bitmap_set_bit (&generic_head, DECL_UID (t));
8431             break;
8432 
8433           case OMP_CLAUSE_UNIFORM:
8434             t = OMP_CLAUSE_DECL (c);
8435             if (TREE_CODE (t) != PARM_DECL)
8436               {
8437                 if (processing_template_decl)
8438                     break;
8439                 if (DECL_P (t))
8440                     error_at (OMP_CLAUSE_LOCATION (c),
8441                                 "%qD is not an argument in %<uniform%> clause", t);
8442                 else
8443                     error_at (OMP_CLAUSE_LOCATION (c),
8444                                 "%qE is not an argument in %<uniform%> clause", t);
8445                 remove = true;
8446                 break;
8447               }
8448             /* map_head bitmap is used as uniform_head if declare_simd.  */
8449             bitmap_set_bit (&map_head, DECL_UID (t));
8450             goto check_dup_generic;
8451 
8452           case OMP_CLAUSE_GRAINSIZE:
8453             t = OMP_CLAUSE_GRAINSIZE_EXPR (c);
8454             if (t == error_mark_node)
8455               remove = true;
8456             else if (!type_dependent_expression_p (t)
8457                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
8458               {
8459                 error_at (OMP_CLAUSE_LOCATION (c),
8460                               "%<grainsize%> expression must be integral");
8461                 remove = true;
8462               }
8463             else
8464               {
8465                 t = mark_rvalue_use (t);
8466                 if (!processing_template_decl)
8467                     {
8468                       t = maybe_constant_value (t);
8469                       if (TREE_CODE (t) == INTEGER_CST
8470                           && tree_int_cst_sgn (t) != 1)
8471                         {
8472                           warning_at (OMP_CLAUSE_LOCATION (c), 0,
8473                                           "%<grainsize%> value must be positive");
8474                           t = integer_one_node;
8475                         }
8476                       t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
8477                     }
8478                 OMP_CLAUSE_GRAINSIZE_EXPR (c) = t;
8479               }
8480             break;
8481 
8482           case OMP_CLAUSE_PRIORITY:
8483             t = OMP_CLAUSE_PRIORITY_EXPR (c);
8484             if (t == error_mark_node)
8485               remove = true;
8486             else if (!type_dependent_expression_p (t)
8487                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
8488               {
8489                 error_at (OMP_CLAUSE_LOCATION (c),
8490                               "%<priority%> expression must be integral");
8491                 remove = true;
8492               }
8493             else
8494               {
8495                 t = mark_rvalue_use (t);
8496                 if (!processing_template_decl)
8497                     {
8498                       t = maybe_constant_value (t);
8499                       if (TREE_CODE (t) == INTEGER_CST
8500                           && tree_int_cst_sgn (t) == -1)
8501                         {
8502                           warning_at (OMP_CLAUSE_LOCATION (c), 0,
8503                                           "%<priority%> value must be non-negative");
8504                           t = integer_one_node;
8505                         }
8506                       t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
8507                     }
8508                 OMP_CLAUSE_PRIORITY_EXPR (c) = t;
8509               }
8510             break;
8511 
8512           case OMP_CLAUSE_HINT:
8513             t = OMP_CLAUSE_HINT_EXPR (c);
8514             if (t == error_mark_node)
8515               remove = true;
8516             else if (!type_dependent_expression_p (t)
8517                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
8518               {
8519                 error_at (OMP_CLAUSE_LOCATION (c),
8520                               "%<hint%> expression must be integral");
8521                 remove = true;
8522               }
8523             else
8524               {
8525                 t = mark_rvalue_use (t);
8526                 if (!processing_template_decl)
8527                     {
8528                       t = maybe_constant_value (t);
8529                       t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
8530                       if (TREE_CODE (t) != INTEGER_CST)
8531                         {
8532                           error_at (OMP_CLAUSE_LOCATION (c),
8533                                         "%<hint%> expression must be constant integer "
8534                                         "expression");
8535                           remove = true;
8536                         }
8537                     }
8538                 OMP_CLAUSE_HINT_EXPR (c) = t;
8539               }
8540             break;
8541 
8542           case OMP_CLAUSE_FILTER:
8543             t = OMP_CLAUSE_FILTER_EXPR (c);
8544             if (t == error_mark_node)
8545               remove = true;
8546             else if (!type_dependent_expression_p (t)
8547                        && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
8548               {
8549                 error_at (OMP_CLAUSE_LOCATION (c),
8550                               "%<filter%> expression must be integral");
8551                 remove = true;
8552               }
8553             else
8554               {
8555                 t = mark_rvalue_use (t);
8556                 if (!processing_template_decl)
8557                     {
8558                       t = maybe_constant_value (t);
8559                       t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
8560                     }
8561                 OMP_CLAUSE_FILTER_EXPR (c) = t;
8562               }
8563             break;
8564 
8565           case OMP_CLAUSE_IS_DEVICE_PTR:
8566           case OMP_CLAUSE_USE_DEVICE_PTR:
8567             field_ok = (ort & C_ORT_OMP_DECLARE_SIMD) == C_ORT_OMP;
8568             t = OMP_CLAUSE_DECL (c);
8569             if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IS_DEVICE_PTR)
8570               bitmap_set_bit (&is_on_device_head, DECL_UID (t));
8571             if (!type_dependent_expression_p (t))
8572               {
8573                 tree type = TREE_TYPE (t);
8574                 if (!TYPE_PTR_P (type)
8575                       && (!TYPE_REF_P (type) || !TYPE_PTR_P (TREE_TYPE (type))))
8576                     {
8577                       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_USE_DEVICE_PTR
8578                           && ort == C_ORT_OMP)
8579                         {
8580                           error_at (OMP_CLAUSE_LOCATION (c),
8581                                         "%qs variable is neither a pointer "
8582                                         "nor reference to pointer",
8583                                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8584                           remove = true;
8585                         }
8586                       else if (TREE_CODE (type) != ARRAY_TYPE
8587                                  && (!TYPE_REF_P (type)
8588                                      || TREE_CODE (TREE_TYPE (type)) != ARRAY_TYPE))
8589                         {
8590                           error_at (OMP_CLAUSE_LOCATION (c),
8591                                         "%qs variable is neither a pointer, nor an "
8592                                         "array nor reference to pointer or array",
8593                                         omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8594                           remove = true;
8595                         }
8596                     }
8597               }
8598             goto check_dup_generic;
8599 
8600           case OMP_CLAUSE_HAS_DEVICE_ADDR:
8601             t = OMP_CLAUSE_DECL (c);
8602             if (TREE_CODE (t) == TREE_LIST)
8603               {
8604                 if (handle_omp_array_sections (c, ort))
8605                     remove = true;
8606                 else
8607                     {
8608                       t = OMP_CLAUSE_DECL (c);
8609                       while (TREE_CODE (t) == INDIRECT_REF
8610                                || TREE_CODE (t) == ARRAY_REF)
8611                         t = TREE_OPERAND (t, 0);
8612                     }
8613               }
8614             bitmap_set_bit (&is_on_device_head, DECL_UID (t));
8615             if (VAR_P (t) || TREE_CODE (t) == PARM_DECL)
8616               cxx_mark_addressable (t);
8617             goto check_dup_generic_t;
8618 
8619           case OMP_CLAUSE_USE_DEVICE_ADDR:
8620             field_ok = true;
8621             t = OMP_CLAUSE_DECL (c);
8622             if (!processing_template_decl
8623                 && (VAR_P (t) || TREE_CODE (t) == PARM_DECL)
8624                 && !TYPE_REF_P (TREE_TYPE (t))
8625                 && !cxx_mark_addressable (t))
8626               remove = true;
8627             goto check_dup_generic;
8628 
8629           case OMP_CLAUSE_NOWAIT:
8630           case OMP_CLAUSE_DEFAULT:
8631           case OMP_CLAUSE_UNTIED:
8632           case OMP_CLAUSE_COLLAPSE:
8633           case OMP_CLAUSE_PARALLEL:
8634           case OMP_CLAUSE_FOR:
8635           case OMP_CLAUSE_SECTIONS:
8636           case OMP_CLAUSE_TASKGROUP:
8637           case OMP_CLAUSE_PROC_BIND:
8638           case OMP_CLAUSE_DEVICE_TYPE:
8639           case OMP_CLAUSE_NOGROUP:
8640           case OMP_CLAUSE_THREADS:
8641           case OMP_CLAUSE_SIMD:
8642           case OMP_CLAUSE_DEFAULTMAP:
8643           case OMP_CLAUSE_BIND:
8644           case OMP_CLAUSE_AUTO:
8645           case OMP_CLAUSE_INDEPENDENT:
8646           case OMP_CLAUSE_SEQ:
8647           case OMP_CLAUSE_IF_PRESENT:
8648           case OMP_CLAUSE_FINALIZE:
8649           case OMP_CLAUSE_NOHOST:
8650             break;
8651 
8652           case OMP_CLAUSE_MERGEABLE:
8653             mergeable_seen = true;
8654             break;
8655 
8656           case OMP_CLAUSE_TILE:
8657             for (tree list = OMP_CLAUSE_TILE_LIST (c); !remove && list;
8658                  list = TREE_CHAIN (list))
8659               {
8660                 t = TREE_VALUE (list);
8661 
8662                 if (t == error_mark_node)
8663                     remove = true;
8664                 else if (!type_dependent_expression_p (t)
8665                            && !INTEGRAL_TYPE_P (TREE_TYPE (t)))
8666                     {
8667                       error_at (OMP_CLAUSE_LOCATION (c),
8668                                   "%<tile%> argument needs integral type");
8669                       remove = true;
8670                     }
8671                 else
8672                     {
8673                       t = mark_rvalue_use (t);
8674                       if (!processing_template_decl)
8675                         {
8676                           /* Zero is used to indicate '*', we permit you
8677                                to get there via an ICE of value zero.  */
8678                           t = maybe_constant_value (t);
8679                           if (!tree_fits_shwi_p (t)
8680                                 || tree_to_shwi (t) < 0)
8681                               {
8682                                 error_at (OMP_CLAUSE_LOCATION (c),
8683                                             "%<tile%> argument needs positive "
8684                                             "integral constant");
8685                                 remove = true;
8686                               }
8687                           t = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
8688                         }
8689                     }
8690 
8691                     /* Update list item.  */
8692                 TREE_VALUE (list) = t;
8693               }
8694             break;
8695 
8696           case OMP_CLAUSE_ORDERED:
8697             ordered_seen = true;
8698             break;
8699 
8700           case OMP_CLAUSE_ORDER:
8701             if (order_seen)
8702               remove = true;
8703             else
8704               order_seen = true;
8705             break;
8706 
8707           case OMP_CLAUSE_INBRANCH:
8708           case OMP_CLAUSE_NOTINBRANCH:
8709             if (branch_seen)
8710               {
8711                 error_at (OMP_CLAUSE_LOCATION (c),
8712                               "%<inbranch%> clause is incompatible with "
8713                               "%<notinbranch%>");
8714                 remove = true;
8715               }
8716             branch_seen = true;
8717             break;
8718 
8719           case OMP_CLAUSE_INCLUSIVE:
8720           case OMP_CLAUSE_EXCLUSIVE:
8721             t = omp_clause_decl_field (OMP_CLAUSE_DECL (c));
8722             if (!t)
8723               t = OMP_CLAUSE_DECL (c);
8724             if (t == current_class_ptr)
8725               {
8726                 error_at (OMP_CLAUSE_LOCATION (c),
8727                               "%<this%> allowed in OpenMP only in %<declare simd%>"
8728                               " clauses");
8729                 remove = true;
8730                 break;
8731               }
8732             if (!VAR_P (t)
8733                 && TREE_CODE (t) != PARM_DECL
8734                 && TREE_CODE (t) != FIELD_DECL)
8735               {
8736                 if (processing_template_decl && TREE_CODE (t) != OVERLOAD)
8737                     break;
8738                 if (DECL_P (t))
8739                     error_at (OMP_CLAUSE_LOCATION (c),
8740                                 "%qD is not a variable in clause %qs", t,
8741                                 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8742                 else
8743                     error_at (OMP_CLAUSE_LOCATION (c),
8744                                 "%qE is not a variable in clause %qs", t,
8745                                 omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
8746                 remove = true;
8747               }
8748             break;
8749 
8750           default:
8751             gcc_unreachable ();
8752           }
8753 
8754       if (remove)
8755           *pc = OMP_CLAUSE_CHAIN (c);
8756       else
8757           pc = &OMP_CLAUSE_CHAIN (c);
8758     }
8759 
8760   if (reduction_seen < 0 && (ordered_seen || schedule_seen))
8761     reduction_seen = -2;
8762 
8763   for (pc = &clauses, c = clauses; c ; c = *pc)
8764     {
8765       enum omp_clause_code c_kind = OMP_CLAUSE_CODE (c);
8766       bool remove = false;
8767       bool need_complete_type = false;
8768       bool need_default_ctor = false;
8769       bool need_copy_ctor = false;
8770       bool need_copy_assignment = false;
8771       bool need_implicitly_determined = false;
8772       bool need_dtor = false;
8773       tree type, inner_type;
8774 
8775       switch (c_kind)
8776           {
8777           case OMP_CLAUSE_SHARED:
8778             need_implicitly_determined = true;
8779             break;
8780           case OMP_CLAUSE_PRIVATE:
8781             need_complete_type = true;
8782             need_default_ctor = true;
8783             need_dtor = true;
8784             need_implicitly_determined = true;
8785             break;
8786           case OMP_CLAUSE_FIRSTPRIVATE:
8787             need_complete_type = true;
8788             need_copy_ctor = true;
8789             need_dtor = true;
8790             need_implicitly_determined = true;
8791             break;
8792           case OMP_CLAUSE_LASTPRIVATE:
8793             need_complete_type = true;
8794             need_copy_assignment = true;
8795             need_implicitly_determined = true;
8796             break;
8797           case OMP_CLAUSE_REDUCTION:
8798             if (reduction_seen == -2)
8799               OMP_CLAUSE_REDUCTION_INSCAN (c) = 0;
8800             if (OMP_CLAUSE_REDUCTION_INSCAN (c))
8801               need_copy_assignment = true;
8802             need_implicitly_determined = true;
8803             break;
8804           case OMP_CLAUSE_IN_REDUCTION:
8805           case OMP_CLAUSE_TASK_REDUCTION:
8806           case OMP_CLAUSE_INCLUSIVE:
8807           case OMP_CLAUSE_EXCLUSIVE:
8808             need_implicitly_determined = true;
8809             break;
8810           case OMP_CLAUSE_LINEAR:
8811             if (ort != C_ORT_OMP_DECLARE_SIMD)
8812               need_implicitly_determined = true;
8813             else if (OMP_CLAUSE_LINEAR_VARIABLE_STRIDE (c)
8814                        && !bitmap_bit_p (&map_head,
8815                                              DECL_UID (OMP_CLAUSE_LINEAR_STEP (c))))
8816               {
8817                 error_at (OMP_CLAUSE_LOCATION (c),
8818                               "%<linear%> clause step is a parameter %qD not "
8819                               "specified in %<uniform%> clause",
8820                               OMP_CLAUSE_LINEAR_STEP (c));
8821                 *pc = OMP_CLAUSE_CHAIN (c);
8822                 continue;
8823               }
8824             break;
8825           case OMP_CLAUSE_COPYPRIVATE:
8826             need_copy_assignment = true;
8827             break;
8828           case OMP_CLAUSE_COPYIN:
8829             need_copy_assignment = true;
8830             break;
8831           case OMP_CLAUSE_SIMDLEN:
8832             if (safelen
8833                 && !processing_template_decl
8834                 && tree_int_cst_lt (OMP_CLAUSE_SAFELEN_EXPR (safelen),
8835                                           OMP_CLAUSE_SIMDLEN_EXPR (c)))
8836               {
8837                 error_at (OMP_CLAUSE_LOCATION (c),
8838                               "%<simdlen%> clause value is bigger than "
8839                               "%<safelen%> clause value");
8840                 OMP_CLAUSE_SIMDLEN_EXPR (c)
8841                     = OMP_CLAUSE_SAFELEN_EXPR (safelen);
8842               }
8843             pc = &OMP_CLAUSE_CHAIN (c);
8844             continue;
8845           case OMP_CLAUSE_SCHEDULE:
8846             if (ordered_seen
8847                 && (OMP_CLAUSE_SCHEDULE_KIND (c)
8848                       & OMP_CLAUSE_SCHEDULE_NONMONOTONIC))
8849               {
8850                 error_at (OMP_CLAUSE_LOCATION (c),
8851                               "%<nonmonotonic%> schedule modifier specified "
8852                               "together with %<ordered%> clause");
8853                 OMP_CLAUSE_SCHEDULE_KIND (c)
8854                     = (enum omp_clause_schedule_kind)
8855                       (OMP_CLAUSE_SCHEDULE_KIND (c)
8856                        & ~OMP_CLAUSE_SCHEDULE_NONMONOTONIC);
8857               }
8858             if (reduction_seen == -2)
8859               error_at (OMP_CLAUSE_LOCATION (c),
8860                           "%qs clause specified together with %<inscan%> "
8861                           "%<reduction%> clause", "schedule");
8862             pc = &OMP_CLAUSE_CHAIN (c);
8863             continue;
8864           case OMP_CLAUSE_NOGROUP:
8865             if (reduction_seen)
8866               {
8867                 error_at (OMP_CLAUSE_LOCATION (c),
8868                               "%<nogroup%> clause must not be used together with "
8869                               "%<reduction%> clause");
8870                 *pc = OMP_CLAUSE_CHAIN (c);
8871                 continue;
8872               }
8873             pc = &OMP_CLAUSE_CHAIN (c);
8874             continue;
8875           case OMP_CLAUSE_ORDERED:
8876             if (reduction_seen == -2)
8877               error_at (OMP_CLAUSE_LOCATION (c),
8878                           "%qs clause specified together with %<inscan%> "
8879                           "%<reduction%> clause", "ordered");
8880             pc = &OMP_CLAUSE_CHAIN (c);
8881             continue;
8882           case OMP_CLAUSE_ORDER:
8883             if (ordered_seen)
8884               {
8885                 error_at (OMP_CLAUSE_LOCATION (c),
8886                               "%<order%> clause must not be used together "
8887                               "with %<ordered%>");
8888                 *pc = OMP_CLAUSE_CHAIN (c);
8889                 continue;
8890               }
8891             pc = &OMP_CLAUSE_CHAIN (c);
8892             continue;
8893           case OMP_CLAUSE_DETACH:
8894             if (mergeable_seen)
8895               {
8896                 error_at (OMP_CLAUSE_LOCATION (c),
8897                               "%<detach%> clause must not be used together with "
8898                               "%<mergeable%> clause");
8899                 *pc = OMP_CLAUSE_CHAIN (c);
8900                 continue;
8901               }
8902             pc = &OMP_CLAUSE_CHAIN (c);
8903             continue;
8904           case OMP_CLAUSE_MAP:
8905             if (target_in_reduction_seen && !processing_template_decl)
8906               {
8907                 t = OMP_CLAUSE_DECL (c);
8908                 while (handled_component_p (t)
8909                          || TREE_CODE (t) == INDIRECT_REF
8910                          || TREE_CODE (t) == ADDR_EXPR
8911                          || TREE_CODE (t) == MEM_REF
8912                          || TREE_CODE (t) == NON_LVALUE_EXPR)
8913                     t = TREE_OPERAND (t, 0);
8914                 if (DECL_P (t)
8915                       && bitmap_bit_p (&oacc_reduction_head, DECL_UID (t)))
8916                     OMP_CLAUSE_MAP_IN_REDUCTION (c) = 1;
8917               }
8918             pc = &OMP_CLAUSE_CHAIN (c);
8919             continue;
8920           case OMP_CLAUSE_NOWAIT:
8921             if (copyprivate_seen)
8922               {
8923                 error_at (OMP_CLAUSE_LOCATION (c),
8924                               "%<nowait%> clause must not be used together "
8925                               "with %<copyprivate%>");
8926                 *pc = OMP_CLAUSE_CHAIN (c);
8927                 continue;
8928               }
8929             /* FALLTHRU */
8930           default:
8931             pc = &OMP_CLAUSE_CHAIN (c);
8932             continue;
8933           }
8934 
8935       t = OMP_CLAUSE_DECL (c);
8936       switch (c_kind)
8937           {
8938           case OMP_CLAUSE_LASTPRIVATE:
8939             if (DECL_P (t)
8940                 && !bitmap_bit_p (&firstprivate_head, DECL_UID (t)))
8941               {
8942                 need_default_ctor = true;
8943                 need_dtor = true;
8944               }
8945             break;
8946 
8947           case OMP_CLAUSE_REDUCTION:
8948           case OMP_CLAUSE_IN_REDUCTION:
8949           case OMP_CLAUSE_TASK_REDUCTION:
8950             if (allocate_seen)
8951               {
8952                 if (TREE_CODE (t) == MEM_REF)
8953                     {
8954                       t = TREE_OPERAND (t, 0);
8955                       if (TREE_CODE (t) == POINTER_PLUS_EXPR)
8956                         t = TREE_OPERAND (t, 0);
8957                       if (TREE_CODE (t) == ADDR_EXPR
8958                           || TREE_CODE (t) == INDIRECT_REF)
8959                         t = TREE_OPERAND (t, 0);
8960                       if (DECL_P (t))
8961                         bitmap_clear_bit (&aligned_head, DECL_UID (t));
8962                     }
8963                 else if (TREE_CODE (t) == TREE_LIST)
8964                     {
8965                       while (TREE_CODE (t) == TREE_LIST)
8966                         t = TREE_CHAIN (t);
8967                       if (DECL_P (t))
8968                         bitmap_clear_bit (&aligned_head, DECL_UID (t));
8969                       t = OMP_CLAUSE_DECL (c);
8970                     }
8971                 else if (DECL_P (t))
8972                     bitmap_clear_bit (&aligned_head, DECL_UID (t));
8973                 t = OMP_CLAUSE_DECL (c);
8974               }
8975             if (processing_template_decl
8976                 && !VAR_P (t) && TREE_CODE (t) != PARM_DECL)
8977               break;
8978             if (finish_omp_reduction_clause (c, &need_default_ctor,
8979                                                      &need_dtor))
8980               remove = true;
8981             else
8982               t = OMP_CLAUSE_DECL (c);
8983             break;
8984 
8985           case OMP_CLAUSE_COPYIN:
8986             if (processing_template_decl
8987                 && !VAR_P (t) && TREE_CODE (t) != PARM_DECL)
8988               break;
8989             if (!VAR_P (t) || !CP_DECL_THREAD_LOCAL_P (t))
8990               {
8991                 error_at (OMP_CLAUSE_LOCATION (c),
8992                               "%qE must be %<threadprivate%> for %<copyin%>", t);
8993                 remove = true;
8994               }
8995             break;
8996 
8997           default:
8998             break;
8999           }
9000 
9001       if (processing_template_decl
9002             && !VAR_P (t) && TREE_CODE (t) != PARM_DECL)
9003           {
9004             pc = &OMP_CLAUSE_CHAIN (c);
9005             continue;
9006           }
9007 
9008       if (need_complete_type || need_copy_assignment)
9009           {
9010             t = require_complete_type (t);
9011             if (t == error_mark_node)
9012               remove = true;
9013             else if (!processing_template_decl
9014                        && TYPE_REF_P (TREE_TYPE (t))
9015                        && !complete_type_or_else (TREE_TYPE (TREE_TYPE (t)), t))
9016               remove = true;
9017           }
9018       if (need_implicitly_determined)
9019           {
9020             const char *share_name = NULL;
9021 
9022             if (allocate_seen
9023                 && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_SHARED
9024                 && DECL_P (t))
9025               bitmap_clear_bit (&aligned_head, DECL_UID (t));
9026 
9027             if (VAR_P (t) && CP_DECL_THREAD_LOCAL_P (t))
9028               share_name = "threadprivate";
9029             else switch (cxx_omp_predetermined_sharing_1 (t))
9030               {
9031               case OMP_CLAUSE_DEFAULT_UNSPECIFIED:
9032                 break;
9033               case OMP_CLAUSE_DEFAULT_SHARED:
9034                 if ((OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED
9035                        || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE)
9036                       && c_omp_predefined_variable (t))
9037                     /* The __func__ variable and similar function-local predefined
9038                        variables may be listed in a shared or firstprivate
9039                        clause.  */
9040                     break;
9041                 if (VAR_P (t)
9042                       && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
9043                       && TREE_STATIC (t)
9044                       && cxx_omp_const_qual_no_mutable (t))
9045                     {
9046                       tree ctx = CP_DECL_CONTEXT (t);
9047                       /* const qualified static data members without mutable
9048                          member may be specified in firstprivate clause.  */
9049                       if (TYPE_P (ctx) && MAYBE_CLASS_TYPE_P (ctx))
9050                         break;
9051                     }
9052                 share_name = "shared";
9053                 break;
9054               case OMP_CLAUSE_DEFAULT_PRIVATE:
9055                 share_name = "private";
9056                 break;
9057               default:
9058                 gcc_unreachable ();
9059               }
9060             if (share_name)
9061               {
9062                 error_at (OMP_CLAUSE_LOCATION (c),
9063                               "%qE is predetermined %qs for %qs",
9064                               omp_clause_printable_decl (t), share_name,
9065                               omp_clause_code_name[OMP_CLAUSE_CODE (c)]);
9066                 remove = true;
9067               }
9068             else if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_SHARED
9069                        && OMP_CLAUSE_CODE (c) != OMP_CLAUSE_FIRSTPRIVATE
9070                        && cxx_omp_const_qual_no_mutable (t))
9071               {
9072                 error_at (OMP_CLAUSE_LOCATION (c),
9073                               "%<const%> qualified %qE without %<mutable%> member "
9074                               "may appear only in %<shared%> or %<firstprivate%> "
9075                               "clauses", omp_clause_printable_decl (t));
9076                 remove = true;
9077               }
9078           }
9079 
9080       if (detach_seen
9081             && (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_SHARED
9082                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
9083                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_FIRSTPRIVATE
9084                 || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE)
9085             && OMP_CLAUSE_DECL (c) == OMP_CLAUSE_DECL (detach_seen))
9086           {
9087             error_at (OMP_CLAUSE_LOCATION (c),
9088                         "the event handle of a %<detach%> clause "
9089                         "should not be in a data-sharing clause");
9090             remove = true;
9091           }
9092 
9093       /* We're interested in the base element, not arrays.  */
9094       inner_type = type = TREE_TYPE (t);
9095       if ((need_complete_type
9096              || need_copy_assignment
9097              || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_REDUCTION
9098              || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_IN_REDUCTION
9099              || OMP_CLAUSE_CODE (c) == OMP_CLAUSE_TASK_REDUCTION)
9100             && TYPE_REF_P (inner_type))
9101           inner_type = TREE_TYPE (inner_type);
9102       while (TREE_CODE (inner_type) == ARRAY_TYPE)
9103           inner_type = TREE_TYPE (inner_type);
9104 
9105       /* Check for special function availability by building a call to one.
9106            Save the results, because later we won't be in the right context
9107            for making these queries.  */
9108       if (CLASS_TYPE_P (inner_type)
9109             && COMPLETE_TYPE_P (inner_type)
9110             && (need_default_ctor || need_copy_ctor
9111                 || need_copy_assignment || need_dtor)
9112             && !type_dependent_expression_p (t)
9113             && cxx_omp_create_clause_info (c, inner_type, need_default_ctor,
9114                                                    need_copy_ctor, need_copy_assignment,
9115                                                    need_dtor))
9116           remove = true;
9117 
9118       if (!remove
9119             && c_kind == OMP_CLAUSE_SHARED
9120             && processing_template_decl)
9121           {
9122             t = omp_clause_decl_field (OMP_CLAUSE_DECL (c));
9123             if (t)
9124               OMP_CLAUSE_DECL (c) = t;
9125           }
9126 
9127       if (remove)
9128           *pc = OMP_CLAUSE_CHAIN (c);
9129       else
9130           pc = &OMP_CLAUSE_CHAIN (c);
9131     }
9132 
9133   if (allocate_seen)
9134     for (pc = &clauses, c = clauses; c ; c = *pc)
9135       {
9136           bool remove = false;
9137           if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_ALLOCATE
9138               && !OMP_CLAUSE_ALLOCATE_COMBINED (c)
9139               && DECL_P (OMP_CLAUSE_DECL (c))
9140               && bitmap_bit_p (&aligned_head, DECL_UID (OMP_CLAUSE_DECL (c))))
9141             {
9142               error_at (OMP_CLAUSE_LOCATION (c),
9143                           "%qD specified in %<allocate%> clause but not in "
9144                           "an explicit privatization clause", OMP_CLAUSE_DECL (c));
9145               remove = true;
9146             }
9147           if (remove)
9148             *pc = OMP_CLAUSE_CHAIN (c);
9149           else
9150             pc = &OMP_CLAUSE_CHAIN (c);
9151       }
9152 
9153   bitmap_obstack_release (NULL);
9154   return clauses;
9155 }
9156 
9157 /* Start processing OpenMP clauses that can include any
9158    privatization clauses for non-static data members.  */
9159 
9160 tree
push_omp_privatization_clauses(bool ignore_next)9161 push_omp_privatization_clauses (bool ignore_next)
9162 {
9163   if (omp_private_member_ignore_next)
9164     {
9165       omp_private_member_ignore_next = ignore_next;
9166       return NULL_TREE;
9167     }
9168   omp_private_member_ignore_next = ignore_next;
9169   if (omp_private_member_map)
9170     omp_private_member_vec.safe_push (error_mark_node);
9171   return push_stmt_list ();
9172 }
9173 
9174 /* Revert remapping of any non-static data members since
9175    the last push_omp_privatization_clauses () call.  */
9176 
9177 void
pop_omp_privatization_clauses(tree stmt)9178 pop_omp_privatization_clauses (tree stmt)
9179 {
9180   if (stmt == NULL_TREE)
9181     return;
9182   stmt = pop_stmt_list (stmt);
9183   if (omp_private_member_map)
9184     {
9185       while (!omp_private_member_vec.is_empty ())
9186           {
9187             tree t = omp_private_member_vec.pop ();
9188             if (t == error_mark_node)
9189               {
9190                 add_stmt (stmt);
9191                 return;
9192               }
9193             bool no_decl_expr = t == integer_zero_node;
9194             if (no_decl_expr)
9195               t = omp_private_member_vec.pop ();
9196             tree *v = omp_private_member_map->get (t);
9197             gcc_assert (v);
9198             if (!no_decl_expr)
9199               add_decl_expr (*v);
9200             omp_private_member_map->remove (t);
9201           }
9202       delete omp_private_member_map;
9203       omp_private_member_map = NULL;
9204     }
9205   add_stmt (stmt);
9206 }
9207 
9208 /* Remember OpenMP privatization clauses mapping and clear it.
9209    Used for lambdas.  */
9210 
9211 void
save_omp_privatization_clauses(vec<tree> & save)9212 save_omp_privatization_clauses (vec<tree> &save)
9213 {
9214   save = vNULL;
9215   if (omp_private_member_ignore_next)
9216     save.safe_push (integer_one_node);
9217   omp_private_member_ignore_next = false;
9218   if (!omp_private_member_map)
9219     return;
9220 
9221   while (!omp_private_member_vec.is_empty ())
9222     {
9223       tree t = omp_private_member_vec.pop ();
9224       if (t == error_mark_node)
9225           {
9226             save.safe_push (t);
9227             continue;
9228           }
9229       tree n = t;
9230       if (t == integer_zero_node)
9231           t = omp_private_member_vec.pop ();
9232       tree *v = omp_private_member_map->get (t);
9233       gcc_assert (v);
9234       save.safe_push (*v);
9235       save.safe_push (t);
9236       if (n != t)
9237           save.safe_push (n);
9238     }
9239   delete omp_private_member_map;
9240   omp_private_member_map = NULL;
9241 }
9242 
9243 /* Restore OpenMP privatization clauses mapping saved by the
9244    above function.  */
9245 
9246 void
restore_omp_privatization_clauses(vec<tree> & save)9247 restore_omp_privatization_clauses (vec<tree> &save)
9248 {
9249   gcc_assert (omp_private_member_vec.is_empty ());
9250   omp_private_member_ignore_next = false;
9251   if (save.is_empty ())
9252     return;
9253   if (save.length () == 1 && save[0] == integer_one_node)
9254     {
9255       omp_private_member_ignore_next = true;
9256       save.release ();
9257       return;
9258     }
9259 
9260   omp_private_member_map = new hash_map <tree, tree>;
9261   while (!save.is_empty ())
9262     {
9263       tree t = save.pop ();
9264       tree n = t;
9265       if (t != error_mark_node)
9266           {
9267             if (t == integer_one_node)
9268               {
9269                 omp_private_member_ignore_next = true;
9270                 gcc_assert (save.is_empty ());
9271                 break;
9272               }
9273             if (t == integer_zero_node)
9274               t = save.pop ();
9275             tree &v = omp_private_member_map->get_or_insert (t);
9276             v = save.pop ();
9277           }
9278       omp_private_member_vec.safe_push (t);
9279       if (n != t)
9280           omp_private_member_vec.safe_push (n);
9281     }
9282   save.release ();
9283 }
9284 
9285 /* For all variables in the tree_list VARS, mark them as thread local.  */
9286 
9287 void
finish_omp_threadprivate(tree vars)9288 finish_omp_threadprivate (tree vars)
9289 {
9290   tree t;
9291 
9292   /* Mark every variable in VARS to be assigned thread local storage.  */
9293   for (t = vars; t; t = TREE_CHAIN (t))
9294     {
9295       tree v = TREE_PURPOSE (t);
9296 
9297       if (error_operand_p (v))
9298           ;
9299       else if (!VAR_P (v))
9300           error ("%<threadprivate%> %qD is not file, namespace "
9301                  "or block scope variable", v);
9302       /* If V had already been marked threadprivate, it doesn't matter
9303            whether it had been used prior to this point.  */
9304       else if (TREE_USED (v)
9305             && (DECL_LANG_SPECIFIC (v) == NULL
9306                 || !CP_DECL_THREADPRIVATE_P (v)))
9307           error ("%qE declared %<threadprivate%> after first use", v);
9308       else if (! TREE_STATIC (v) && ! DECL_EXTERNAL (v))
9309           error ("automatic variable %qE cannot be %<threadprivate%>", v);
9310       else if (! COMPLETE_TYPE_P (complete_type (TREE_TYPE (v))))
9311           error ("%<threadprivate%> %qE has incomplete type", v);
9312       else if (TREE_STATIC (v) && TYPE_P (CP_DECL_CONTEXT (v))
9313                  && CP_DECL_CONTEXT (v) != current_class_type)
9314           error ("%<threadprivate%> %qE directive not "
9315                  "in %qT definition", v, CP_DECL_CONTEXT (v));
9316       else
9317           {
9318             /* Allocate a LANG_SPECIFIC structure for V, if needed.  */
9319             if (DECL_LANG_SPECIFIC (v) == NULL)
9320               retrofit_lang_decl (v);
9321 
9322             if (! CP_DECL_THREAD_LOCAL_P (v))
9323               {
9324                 CP_DECL_THREAD_LOCAL_P (v) = true;
9325                 set_decl_tls_model (v, decl_default_tls_model (v));
9326                 /* If rtl has been already set for this var, call
9327                      make_decl_rtl once again, so that encode_section_info
9328                      has a chance to look at the new decl flags.  */
9329                 if (DECL_RTL_SET_P (v))
9330                     make_decl_rtl (v);
9331               }
9332             CP_DECL_THREADPRIVATE_P (v) = 1;
9333           }
9334     }
9335 }
9336 
9337 /* Build an OpenMP structured block.  */
9338 
9339 tree
begin_omp_structured_block(void)9340 begin_omp_structured_block (void)
9341 {
9342   return do_pushlevel (sk_omp);
9343 }
9344 
9345 tree
finish_omp_structured_block(tree block)9346 finish_omp_structured_block (tree block)
9347 {
9348   return do_poplevel (block);
9349 }
9350 
9351 /* Similarly, except force the retention of the BLOCK.  */
9352 
9353 tree
begin_omp_parallel(void)9354 begin_omp_parallel (void)
9355 {
9356   keep_next_level (true);
9357   return begin_omp_structured_block ();
9358 }
9359 
9360 /* Generate OACC_DATA, with CLAUSES and BLOCK as its compound
9361    statement.  */
9362 
9363 tree
finish_oacc_data(tree clauses,tree block)9364 finish_oacc_data (tree clauses, tree block)
9365 {
9366   tree stmt;
9367 
9368   block = finish_omp_structured_block (block);
9369 
9370   stmt = make_node (OACC_DATA);
9371   TREE_TYPE (stmt) = void_type_node;
9372   OACC_DATA_CLAUSES (stmt) = clauses;
9373   OACC_DATA_BODY (stmt) = block;
9374 
9375   return add_stmt (stmt);
9376 }
9377 
9378 /* Generate OACC_HOST_DATA, with CLAUSES and BLOCK as its compound
9379    statement.  */
9380 
9381 tree
finish_oacc_host_data(tree clauses,tree block)9382 finish_oacc_host_data (tree clauses, tree block)
9383 {
9384   tree stmt;
9385 
9386   block = finish_omp_structured_block (block);
9387 
9388   stmt = make_node (OACC_HOST_DATA);
9389   TREE_TYPE (stmt) = void_type_node;
9390   OACC_HOST_DATA_CLAUSES (stmt) = clauses;
9391   OACC_HOST_DATA_BODY (stmt) = block;
9392 
9393   return add_stmt (stmt);
9394 }
9395 
9396 /* Generate OMP construct CODE, with BODY and CLAUSES as its compound
9397    statement.  */
9398 
9399 tree
finish_omp_construct(enum tree_code code,tree body,tree clauses)9400 finish_omp_construct (enum tree_code code, tree body, tree clauses)
9401 {
9402   body = finish_omp_structured_block (body);
9403 
9404   tree stmt = make_node (code);
9405   TREE_TYPE (stmt) = void_type_node;
9406   OMP_BODY (stmt) = body;
9407   OMP_CLAUSES (stmt) = clauses;
9408 
9409   return add_stmt (stmt);
9410 }
9411 
9412 /* Used to walk OpenMP target directive body.  */
9413 
9414 struct omp_target_walk_data
9415 {
9416   /* Holds the 'this' expression found in current function.  */
9417   tree current_object;
9418 
9419   /* True if the 'this' expression was accessed in the target body.  */
9420   bool this_expr_accessed;
9421 
9422   /* For non-static functions, record which pointer-typed members were
9423      accessed, and the whole expression.  */
9424   hash_map<tree, tree> ptr_members_accessed;
9425 
9426   /* Record which lambda objects were accessed in target body.  */
9427   hash_set<tree> lambda_objects_accessed;
9428 
9429   /* For lambda functions, the __closure object expression of the current
9430      function, and the set of captured variables accessed in target body.  */
9431   tree current_closure;
9432   hash_set<tree> closure_vars_accessed;
9433 
9434   /* Local variables declared inside a BIND_EXPR, used to filter out such
9435      variables when recording lambda_objects_accessed.  */
9436   hash_set<tree> local_decls;
9437 };
9438 
9439 /* Helper function of finish_omp_target_clauses, called via
9440    cp_walk_tree_without_duplicates.  Traverse body of OpenMP target
9441    directive *TP, and fill out omp_target_walk_data passed in *PTR.  */
9442 
9443 static tree
finish_omp_target_clauses_r(tree * tp,int * walk_subtrees,void * ptr)9444 finish_omp_target_clauses_r (tree *tp, int *walk_subtrees, void *ptr)
9445 {
9446   tree t = *tp;
9447   struct omp_target_walk_data *data = (struct omp_target_walk_data *) ptr;
9448   tree current_object = data->current_object;
9449   tree current_closure = data->current_closure;
9450 
9451   /* References inside of these expression codes shouldn't incur any
9452      form of mapping, so return early.  */
9453   if (TREE_CODE (t) == SIZEOF_EXPR
9454       || TREE_CODE (t) == ALIGNOF_EXPR)
9455     {
9456       *walk_subtrees = 0;
9457       return NULL_TREE;
9458     }
9459 
9460   if (TREE_CODE (t) == OMP_CLAUSE)
9461     return NULL_TREE;
9462 
9463   if (current_object)
9464     {
9465       tree this_expr = TREE_OPERAND (current_object, 0);
9466 
9467       if (operand_equal_p (t, this_expr))
9468           {
9469             data->this_expr_accessed = true;
9470             *walk_subtrees = 0;
9471             return NULL_TREE;
9472           }
9473 
9474       if (TREE_CODE (t) == COMPONENT_REF
9475             && POINTER_TYPE_P (TREE_TYPE (t))
9476             && operand_equal_p (TREE_OPERAND (t, 0), current_object)
9477             && TREE_CODE (TREE_OPERAND (t, 1)) == FIELD_DECL)
9478           {
9479             data->this_expr_accessed = true;
9480             tree fld = TREE_OPERAND (t, 1);
9481             if (data->ptr_members_accessed.get (fld) == NULL)
9482               {
9483                 if (TREE_CODE (TREE_TYPE (t)) == REFERENCE_TYPE)
9484                     t = convert_from_reference (t);
9485                 data->ptr_members_accessed.put (fld, t);
9486               }
9487             *walk_subtrees = 0;
9488             return NULL_TREE;
9489           }
9490     }
9491 
9492   /* When the current_function_decl is a lambda function, the closure object
9493      argument's type seems to not yet have fields layed out, so a recording
9494      of DECL_VALUE_EXPRs during the target body walk seems the only way to
9495      find them.  */
9496   if (current_closure
9497       && (TREE_CODE (t) == VAR_DECL
9498             || TREE_CODE (t) == PARM_DECL
9499             || TREE_CODE (t) == RESULT_DECL)
9500       && DECL_HAS_VALUE_EXPR_P (t)
9501       && TREE_CODE (DECL_VALUE_EXPR (t)) == COMPONENT_REF
9502       && operand_equal_p (current_closure,
9503                                 TREE_OPERAND (DECL_VALUE_EXPR (t), 0)))
9504     {
9505       if (!data->closure_vars_accessed.contains (t))
9506           data->closure_vars_accessed.add (t);
9507       *walk_subtrees = 0;
9508       return NULL_TREE;
9509     }
9510 
9511   if (TREE_CODE (t) == BIND_EXPR)
9512     {
9513       tree block = BIND_EXPR_BLOCK (t);
9514       for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var))
9515           if (!data->local_decls.contains (var))
9516             data->local_decls.add (var);
9517       return NULL_TREE;
9518     }
9519 
9520   if (TREE_TYPE (t) && LAMBDA_TYPE_P (TREE_TYPE (t)))
9521     {
9522       tree lt = TREE_TYPE (t);
9523       gcc_assert (CLASS_TYPE_P (lt));
9524 
9525       if (!data->lambda_objects_accessed.contains (t)
9526             /* Do not prepare to create target maps for locally declared
9527                lambdas or anonymous ones.  */
9528             && !data->local_decls.contains (t)
9529             && TREE_CODE (t) != TARGET_EXPR)
9530           data->lambda_objects_accessed.add (t);
9531       *walk_subtrees = 0;
9532       return NULL_TREE;
9533     }
9534 
9535   return NULL_TREE;
9536 }
9537 
9538 /* Helper function for finish_omp_target, and also from tsubst_expr.
9539    Create additional clauses for mapping of non-static members, lambda objects,
9540    etc.  */
9541 
9542 void
finish_omp_target_clauses(location_t loc,tree body,tree * clauses_ptr)9543 finish_omp_target_clauses (location_t loc, tree body, tree *clauses_ptr)
9544 {
9545   omp_target_walk_data data;
9546   data.this_expr_accessed = false;
9547   data.current_object = NULL_TREE;
9548 
9549   if (DECL_NONSTATIC_MEMBER_P (current_function_decl) && current_class_ptr)
9550     if (tree ct = current_nonlambda_class_type ())
9551       {
9552           tree object = maybe_dummy_object (ct, NULL);
9553           object = maybe_resolve_dummy (object, true);
9554           data.current_object = object;
9555       }
9556 
9557   if (DECL_LAMBDA_FUNCTION_P (current_function_decl))
9558     {
9559       tree closure = DECL_ARGUMENTS (current_function_decl);
9560       data.current_closure = build_indirect_ref (loc, closure, RO_UNARY_STAR);
9561     }
9562   else
9563     data.current_closure = NULL_TREE;
9564 
9565   cp_walk_tree_without_duplicates (&body, finish_omp_target_clauses_r, &data);
9566 
9567   auto_vec<tree, 16> new_clauses;
9568 
9569   tree omp_target_this_expr = NULL_TREE;
9570   tree *explicit_this_deref_map = NULL;
9571   if (data.this_expr_accessed)
9572     {
9573       omp_target_this_expr = TREE_OPERAND (data.current_object, 0);
9574 
9575       /* See if explicit user-specified map(this[:]) clause already exists.
9576            If not, we create an implicit map(tofrom:this[:1]) clause.  */
9577       for (tree *cp = clauses_ptr; *cp; cp = &OMP_CLAUSE_CHAIN (*cp))
9578           if (OMP_CLAUSE_CODE (*cp) == OMP_CLAUSE_MAP
9579               && (TREE_CODE (OMP_CLAUSE_DECL (*cp)) == INDIRECT_REF
9580                     || TREE_CODE (OMP_CLAUSE_DECL (*cp)) == MEM_REF)
9581               && operand_equal_p (TREE_OPERAND (OMP_CLAUSE_DECL (*cp), 0),
9582                                         omp_target_this_expr))
9583             {
9584               explicit_this_deref_map = cp;
9585               break;
9586             }
9587     }
9588 
9589   if (DECL_LAMBDA_FUNCTION_P (current_function_decl)
9590       && (data.this_expr_accessed
9591             || !data.closure_vars_accessed.is_empty ()))
9592     {
9593       /* For lambda functions, we need to first create a copy of the
9594            __closure object.  */
9595       tree closure = DECL_ARGUMENTS (current_function_decl);
9596       tree c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9597       OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_TO);
9598       OMP_CLAUSE_DECL (c)
9599           = build_indirect_ref (loc, closure, RO_UNARY_STAR);
9600       OMP_CLAUSE_SIZE (c)
9601           = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (closure)));
9602       new_clauses.safe_push (c);
9603 
9604       tree closure_obj = OMP_CLAUSE_DECL (c);
9605       tree closure_type = TREE_TYPE (closure_obj);
9606 
9607       gcc_assert (LAMBDA_TYPE_P (closure_type)
9608                       && CLASS_TYPE_P (closure_type));
9609 
9610       tree c2 = build_omp_clause (loc, OMP_CLAUSE_MAP);
9611       OMP_CLAUSE_SET_MAP_KIND (c2, GOMP_MAP_FIRSTPRIVATE_POINTER);
9612       OMP_CLAUSE_DECL (c2) = closure;
9613       OMP_CLAUSE_SIZE (c2) = size_zero_node;
9614       new_clauses.safe_push (c2);
9615     }
9616 
9617   if (data.this_expr_accessed)
9618     {
9619       /* If the this-expr was accessed, create a map(*this) clause.  */
9620       enum gomp_map_kind kind = GOMP_MAP_TOFROM;
9621       if (explicit_this_deref_map)
9622           {
9623             tree this_map = *explicit_this_deref_map;
9624             tree nc = OMP_CLAUSE_CHAIN (this_map);
9625             gcc_assert (nc != NULL_TREE
9626                           && OMP_CLAUSE_CODE (nc) == OMP_CLAUSE_MAP
9627                           && (OMP_CLAUSE_MAP_KIND (nc)
9628                                 == GOMP_MAP_FIRSTPRIVATE_POINTER));
9629             kind = OMP_CLAUSE_MAP_KIND (this_map);
9630             /* Remove the original 'map(*this) map(firstprivate_ptr:this)'
9631                two-map sequence away from the chain.  */
9632             *explicit_this_deref_map = OMP_CLAUSE_CHAIN (nc);
9633           }
9634       tree c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9635       OMP_CLAUSE_SET_MAP_KIND (c, kind);
9636       OMP_CLAUSE_DECL (c)
9637           = build_indirect_ref (loc, omp_target_this_expr, RO_UNARY_STAR);
9638       OMP_CLAUSE_SIZE (c)
9639           = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (omp_target_this_expr)));
9640       new_clauses.safe_push (c);
9641 
9642       /* If we're in a lambda function, the this-pointer will actually be
9643            '__closure->this', a mapped member of __closure, hence always_pointer.
9644            Otherwise it's a firstprivate pointer.  */
9645       enum gomp_map_kind ptr_kind
9646           = (DECL_LAMBDA_FUNCTION_P (current_function_decl)
9647              ? GOMP_MAP_ALWAYS_POINTER
9648              : GOMP_MAP_FIRSTPRIVATE_POINTER);
9649       c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9650       OMP_CLAUSE_SET_MAP_KIND (c, ptr_kind);
9651       OMP_CLAUSE_DECL (c) = omp_target_this_expr;
9652       OMP_CLAUSE_SIZE (c) = size_zero_node;
9653       new_clauses.safe_push (c);
9654     }
9655 
9656   if (DECL_LAMBDA_FUNCTION_P (current_function_decl))
9657     {
9658       if (omp_target_this_expr)
9659           {
9660             STRIP_NOPS (omp_target_this_expr);
9661             gcc_assert (DECL_HAS_VALUE_EXPR_P (omp_target_this_expr));
9662             omp_target_this_expr = DECL_VALUE_EXPR (omp_target_this_expr);
9663           }
9664 
9665       for (hash_set<tree>::iterator i = data.closure_vars_accessed.begin ();
9666              i != data.closure_vars_accessed.end (); ++i)
9667           {
9668             tree orig_decl = *i;
9669             tree closure_expr = DECL_VALUE_EXPR (orig_decl);
9670 
9671             if (TREE_CODE (TREE_TYPE (orig_decl)) == POINTER_TYPE
9672                 || TREE_CODE (TREE_TYPE (orig_decl)) == REFERENCE_TYPE)
9673               {
9674                 /* this-pointer is processed above, outside this loop.  */
9675                 if (omp_target_this_expr
9676                       && operand_equal_p (closure_expr, omp_target_this_expr))
9677                     continue;
9678 
9679                 bool ptr_p = TREE_CODE (TREE_TYPE (orig_decl)) == POINTER_TYPE;
9680                 enum gomp_map_kind kind, ptr_kind, nc_kind;
9681                 tree size;
9682 
9683                 if (ptr_p)
9684                     {
9685                       /* For pointers, default mapped as zero-length array
9686                          section.  */
9687                       kind = GOMP_MAP_ALLOC;
9688                       nc_kind = GOMP_MAP_FIRSTPRIVATE_POINTER;
9689                       ptr_kind = GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION;
9690                       size = size_zero_node;
9691                     }
9692                 else
9693                     {
9694                       /* For references, default mapped as appearing on map
9695                          clause.  */
9696                       kind = GOMP_MAP_TOFROM;
9697                       nc_kind = GOMP_MAP_FIRSTPRIVATE_REFERENCE;
9698                       ptr_kind = GOMP_MAP_ALWAYS_POINTER;
9699                       size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (closure_expr)));
9700                     }
9701 
9702                 for (tree *p = clauses_ptr; *p; p = &OMP_CLAUSE_CHAIN (*p))
9703                     if (OMP_CLAUSE_CODE (*p) == OMP_CLAUSE_MAP
9704                         && (TREE_CODE (OMP_CLAUSE_DECL (*p)) == INDIRECT_REF
9705                               || TREE_CODE (OMP_CLAUSE_DECL (*p)) == MEM_REF)
9706                         && operand_equal_p (TREE_OPERAND (OMP_CLAUSE_DECL (*p), 0),
9707                                                   orig_decl))
9708                       {
9709                         /* If this was already specified by user as a map,
9710                            save the user specified map kind, delete the
9711                            "map(*ptr/ref), map(firstprivate ptr/ref)" sequence,
9712                            and insert our own sequence:
9713                            "map(*__closure->ptr/ref), map(<ptr_kind>:__closure->ref"
9714                         */
9715                         tree nc = OMP_CLAUSE_CHAIN (*p);
9716                         gcc_assert (nc != NULL_TREE
9717                                         && OMP_CLAUSE_CODE (nc) == OMP_CLAUSE_MAP
9718                                         && OMP_CLAUSE_MAP_KIND (nc) == nc_kind);
9719                         /* Update with user specified kind and size.  */
9720                         kind = OMP_CLAUSE_MAP_KIND (*p);
9721                         size = OMP_CLAUSE_SIZE (*p);
9722                         *p = OMP_CLAUSE_CHAIN (nc);
9723                         break;
9724                       }
9725 
9726                 tree c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9727                 OMP_CLAUSE_SET_MAP_KIND (c, kind);
9728                 OMP_CLAUSE_DECL (c)
9729                     = build_indirect_ref (loc, closure_expr, RO_UNARY_STAR);
9730                 OMP_CLAUSE_SIZE (c) = size;
9731                 if (ptr_p)
9732                     OMP_CLAUSE_MAP_MAYBE_ZERO_LENGTH_ARRAY_SECTION (c) = 1;
9733                 new_clauses.safe_push (c);
9734 
9735                 c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9736                 OMP_CLAUSE_SET_MAP_KIND (c, ptr_kind);
9737                 OMP_CLAUSE_DECL (c) = closure_expr;
9738                 OMP_CLAUSE_SIZE (c) = size_zero_node;
9739                 new_clauses.safe_push (c);
9740               }
9741           }
9742     }
9743 
9744   if (!data.ptr_members_accessed.is_empty ())
9745     for (hash_map<tree, tree>::iterator i = data.ptr_members_accessed.begin ();
9746            i != data.ptr_members_accessed.end (); ++i)
9747       {
9748           /* For each referenced member that is of pointer or reference-to-pointer
9749              type, create the equivalent of map(alloc:this->ptr[:0]).  */
9750           tree field_decl = (*i).first;
9751           tree ptr_member = (*i).second;
9752 
9753           for (tree c = *clauses_ptr; c; c = OMP_CLAUSE_CHAIN (c))
9754             {
9755               if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_MAP)
9756                 continue;
9757               /* If map(this->ptr[:N]) already exists, avoid creating another
9758                  such map.  */
9759               tree decl = OMP_CLAUSE_DECL (c);
9760               if ((TREE_CODE (decl) == INDIRECT_REF
9761                      || TREE_CODE (decl) == MEM_REF)
9762                     && operand_equal_p (TREE_OPERAND (decl, 0), ptr_member))
9763                 goto next_ptr_member;
9764             }
9765 
9766           if (!cxx_mark_addressable (ptr_member))
9767             gcc_unreachable ();
9768 
9769           if (TREE_CODE (TREE_TYPE (field_decl)) == REFERENCE_TYPE)
9770             {
9771               /* For reference to pointers, we need to map the referenced
9772                  pointer first for things to be correct.  */
9773               tree ptr_member_type = TREE_TYPE (ptr_member);
9774 
9775               /* Map pointer target as zero-length array section.  */
9776               tree c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9777               OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_ALLOC);
9778               OMP_CLAUSE_DECL (c)
9779                 = build1 (INDIRECT_REF, TREE_TYPE (ptr_member_type), ptr_member);
9780               OMP_CLAUSE_SIZE (c) = size_zero_node;
9781               OMP_CLAUSE_MAP_MAYBE_ZERO_LENGTH_ARRAY_SECTION (c) = 1;
9782 
9783               /* Map pointer to zero-length array section.  */
9784               tree c2 = build_omp_clause (loc, OMP_CLAUSE_MAP);
9785               OMP_CLAUSE_SET_MAP_KIND
9786                 (c2, GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION);
9787               OMP_CLAUSE_DECL (c2) = ptr_member;
9788               OMP_CLAUSE_SIZE (c2) = size_zero_node;
9789 
9790               /* Attach reference-to-pointer field to pointer.  */
9791               tree c3 = build_omp_clause (loc, OMP_CLAUSE_MAP);
9792               OMP_CLAUSE_SET_MAP_KIND (c3, GOMP_MAP_ATTACH);
9793               OMP_CLAUSE_DECL (c3) = TREE_OPERAND (ptr_member, 0);
9794               OMP_CLAUSE_SIZE (c3) = size_zero_node;
9795 
9796               new_clauses.safe_push (c);
9797               new_clauses.safe_push (c2);
9798               new_clauses.safe_push (c3);
9799             }
9800           else if (TREE_CODE (TREE_TYPE (field_decl)) == POINTER_TYPE)
9801             {
9802               /* Map pointer target as zero-length array section.  */
9803               tree c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9804               OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_ALLOC);
9805               OMP_CLAUSE_DECL (c) = build_indirect_ref (loc, ptr_member,
9806                                                                   RO_UNARY_STAR);
9807               OMP_CLAUSE_SIZE (c) = size_zero_node;
9808               OMP_CLAUSE_MAP_MAYBE_ZERO_LENGTH_ARRAY_SECTION (c) = 1;
9809 
9810               /* Attach zero-length array section to pointer.  */
9811               tree c2 = build_omp_clause (loc, OMP_CLAUSE_MAP);
9812               OMP_CLAUSE_SET_MAP_KIND
9813                 (c2, GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION);
9814               OMP_CLAUSE_DECL (c2) = ptr_member;
9815               OMP_CLAUSE_SIZE (c2) = size_zero_node;
9816 
9817               new_clauses.safe_push (c);
9818               new_clauses.safe_push (c2);
9819             }
9820           else
9821             gcc_unreachable ();
9822 
9823       next_ptr_member:
9824           ;
9825       }
9826 
9827   for (hash_set<tree>::iterator i = data.lambda_objects_accessed.begin ();
9828        i != data.lambda_objects_accessed.end (); ++i)
9829     {
9830       tree lobj = *i;
9831       if (TREE_CODE (lobj) == TARGET_EXPR)
9832           lobj = TREE_OPERAND (lobj, 0);
9833 
9834       tree lt = TREE_TYPE (lobj);
9835       gcc_assert (LAMBDA_TYPE_P (lt) && CLASS_TYPE_P (lt));
9836 
9837       tree lc = build_omp_clause (loc, OMP_CLAUSE_MAP);
9838       OMP_CLAUSE_SET_MAP_KIND (lc, GOMP_MAP_TO);
9839       OMP_CLAUSE_DECL (lc) = lobj;
9840       OMP_CLAUSE_SIZE (lc) = TYPE_SIZE_UNIT (lt);
9841       new_clauses.safe_push (lc);
9842 
9843       for (tree fld = TYPE_FIELDS (lt); fld; fld = DECL_CHAIN (fld))
9844           {
9845             if (TREE_CODE (TREE_TYPE (fld)) == POINTER_TYPE)
9846               {
9847                 tree exp = build3 (COMPONENT_REF, TREE_TYPE (fld),
9848                                          lobj, fld, NULL_TREE);
9849                 tree c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9850                 OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_ALLOC);
9851                 OMP_CLAUSE_DECL (c)
9852                     = build_indirect_ref (loc, exp, RO_UNARY_STAR);
9853                 OMP_CLAUSE_SIZE (c) = size_zero_node;
9854                 OMP_CLAUSE_MAP_MAYBE_ZERO_LENGTH_ARRAY_SECTION (c) = 1;
9855                 new_clauses.safe_push (c);
9856 
9857                 c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9858                 OMP_CLAUSE_SET_MAP_KIND
9859                     (c, GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION);
9860                 OMP_CLAUSE_DECL (c) = exp;
9861                 OMP_CLAUSE_SIZE (c) = size_zero_node;
9862                 new_clauses.safe_push (c);
9863               }
9864             else if (TREE_CODE (TREE_TYPE (fld)) == REFERENCE_TYPE)
9865               {
9866                 tree exp = build3 (COMPONENT_REF, TREE_TYPE (fld),
9867                                          lobj, fld, NULL_TREE);
9868                 tree c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9869                 OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_TOFROM);
9870                 OMP_CLAUSE_DECL (c)
9871                     = build1 (INDIRECT_REF, TREE_TYPE (TREE_TYPE (exp)), exp);
9872                 OMP_CLAUSE_SIZE (c)
9873                     = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (exp)));
9874                 new_clauses.safe_push (c);
9875 
9876                 c = build_omp_clause (loc, OMP_CLAUSE_MAP);
9877                 OMP_CLAUSE_SET_MAP_KIND (c, GOMP_MAP_ALWAYS_POINTER);
9878                 OMP_CLAUSE_DECL (c) = exp;
9879                 OMP_CLAUSE_SIZE (c) = size_zero_node;
9880                 new_clauses.safe_push (c);
9881               }
9882           }
9883     }
9884 
9885   tree c = *clauses_ptr;
9886   for (int i = new_clauses.length () - 1; i >= 0; i--)
9887     {
9888       OMP_CLAUSE_CHAIN (new_clauses[i]) = c;
9889       c = new_clauses[i];
9890     }
9891   *clauses_ptr = c;
9892 }
9893 
9894 /* Called from cp_parser_omp_target.  Create additional implicit clauses for
9895    OpenMP target directives, and do sanity checks.  */
9896 
9897 tree
finish_omp_target(location_t loc,tree clauses,tree body,bool combined_p)9898 finish_omp_target (location_t loc, tree clauses, tree body, bool combined_p)
9899 {
9900   if (!processing_template_decl)
9901     finish_omp_target_clauses (loc, body, &clauses);
9902 
9903   tree stmt = make_node (OMP_TARGET);
9904   TREE_TYPE (stmt) = void_type_node;
9905   OMP_TARGET_CLAUSES (stmt) = clauses;
9906   OMP_TARGET_BODY (stmt) = body;
9907   OMP_TARGET_COMBINED (stmt) = combined_p;
9908   SET_EXPR_LOCATION (stmt, loc);
9909 
9910   tree c = clauses;
9911   while (c)
9912     {
9913       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_MAP)
9914           switch (OMP_CLAUSE_MAP_KIND (c))
9915             {
9916             case GOMP_MAP_TO:
9917             case GOMP_MAP_ALWAYS_TO:
9918             case GOMP_MAP_FROM:
9919             case GOMP_MAP_ALWAYS_FROM:
9920             case GOMP_MAP_TOFROM:
9921             case GOMP_MAP_ALWAYS_TOFROM:
9922             case GOMP_MAP_ALLOC:
9923             case GOMP_MAP_FIRSTPRIVATE_POINTER:
9924             case GOMP_MAP_FIRSTPRIVATE_REFERENCE:
9925             case GOMP_MAP_ALWAYS_POINTER:
9926             case GOMP_MAP_ATTACH_DETACH:
9927             case GOMP_MAP_ATTACH:
9928             case GOMP_MAP_ATTACH_ZERO_LENGTH_ARRAY_SECTION:
9929             case GOMP_MAP_POINTER_TO_ZERO_LENGTH_ARRAY_SECTION:
9930               break;
9931             default:
9932               error_at (OMP_CLAUSE_LOCATION (c),
9933                           "%<#pragma omp target%> with map-type other "
9934                           "than %<to%>, %<from%>, %<tofrom%> or %<alloc%> "
9935                           "on %<map%> clause");
9936               break;
9937             }
9938       c = OMP_CLAUSE_CHAIN (c);
9939     }
9940   return add_stmt (stmt);
9941 }
9942 
9943 tree
finish_omp_parallel(tree clauses,tree body)9944 finish_omp_parallel (tree clauses, tree body)
9945 {
9946   tree stmt;
9947 
9948   body = finish_omp_structured_block (body);
9949 
9950   stmt = make_node (OMP_PARALLEL);
9951   TREE_TYPE (stmt) = void_type_node;
9952   OMP_PARALLEL_CLAUSES (stmt) = clauses;
9953   OMP_PARALLEL_BODY (stmt) = body;
9954 
9955   return add_stmt (stmt);
9956 }
9957 
9958 tree
begin_omp_task(void)9959 begin_omp_task (void)
9960 {
9961   keep_next_level (true);
9962   return begin_omp_structured_block ();
9963 }
9964 
9965 tree
finish_omp_task(tree clauses,tree body)9966 finish_omp_task (tree clauses, tree body)
9967 {
9968   tree stmt;
9969 
9970   body = finish_omp_structured_block (body);
9971 
9972   stmt = make_node (OMP_TASK);
9973   TREE_TYPE (stmt) = void_type_node;
9974   OMP_TASK_CLAUSES (stmt) = clauses;
9975   OMP_TASK_BODY (stmt) = body;
9976 
9977   return add_stmt (stmt);
9978 }
9979 
9980 /* Helper function for finish_omp_for.  Convert Ith random access iterator
9981    into integral iterator.  Return FALSE if successful.  */
9982 
9983 static bool
handle_omp_for_class_iterator(int i,location_t locus,enum tree_code code,tree declv,tree orig_declv,tree initv,tree condv,tree incrv,tree * body,tree * pre_body,tree & clauses,int collapse,int ordered)9984 handle_omp_for_class_iterator (int i, location_t locus, enum tree_code code,
9985                                      tree declv, tree orig_declv, tree initv,
9986                                      tree condv, tree incrv, tree *body,
9987                                      tree *pre_body, tree &clauses,
9988                                      int collapse, int ordered)
9989 {
9990   tree diff, iter_init, iter_incr = NULL, last;
9991   tree incr_var = NULL, orig_pre_body, orig_body, c;
9992   tree decl = TREE_VEC_ELT (declv, i);
9993   tree init = TREE_VEC_ELT (initv, i);
9994   tree cond = TREE_VEC_ELT (condv, i);
9995   tree incr = TREE_VEC_ELT (incrv, i);
9996   tree iter = decl;
9997   location_t elocus = locus;
9998 
9999   if (init && EXPR_HAS_LOCATION (init))
10000     elocus = EXPR_LOCATION (init);
10001 
10002   switch (TREE_CODE (cond))
10003     {
10004     case GT_EXPR:
10005     case GE_EXPR:
10006     case LT_EXPR:
10007     case LE_EXPR:
10008     case NE_EXPR:
10009       if (TREE_OPERAND (cond, 1) == iter)
10010           cond = build2 (swap_tree_comparison (TREE_CODE (cond)),
10011                            TREE_TYPE (cond), iter, TREE_OPERAND (cond, 0));
10012       if (TREE_OPERAND (cond, 0) != iter)
10013           cond = error_mark_node;
10014       else
10015           {
10016             tree tem = build_x_binary_op (EXPR_LOCATION (cond),
10017                                                   TREE_CODE (cond),
10018                                                   iter, ERROR_MARK,
10019                                                   TREE_OPERAND (cond, 1), ERROR_MARK,
10020                                                   NULL_TREE, NULL, tf_warning_or_error);
10021             if (error_operand_p (tem))
10022               return true;
10023           }
10024       break;
10025     default:
10026       cond = error_mark_node;
10027       break;
10028     }
10029   if (cond == error_mark_node)
10030     {
10031       error_at (elocus, "invalid controlling predicate");
10032       return true;
10033     }
10034   diff = build_x_binary_op (elocus, MINUS_EXPR,
10035                                   TREE_OPERAND (cond, 1), ERROR_MARK,
10036                                   iter, ERROR_MARK,
10037                                   NULL_TREE, NULL, tf_warning_or_error);
10038   diff = cp_fully_fold (diff);
10039   if (error_operand_p (diff))
10040     return true;
10041   if (TREE_CODE (TREE_TYPE (diff)) != INTEGER_TYPE)
10042     {
10043       error_at (elocus, "difference between %qE and %qD does not have integer type",
10044                     TREE_OPERAND (cond, 1), iter);
10045       return true;
10046     }
10047   if (!c_omp_check_loop_iv_exprs (locus, code, orig_declv, i,
10048                                           TREE_VEC_ELT (declv, i), NULL_TREE,
10049                                           cond, cp_walk_subtrees))
10050     return true;
10051 
10052   switch (TREE_CODE (incr))
10053     {
10054     case PREINCREMENT_EXPR:
10055     case PREDECREMENT_EXPR:
10056     case POSTINCREMENT_EXPR:
10057     case POSTDECREMENT_EXPR:
10058       if (TREE_OPERAND (incr, 0) != iter)
10059           {
10060             incr = error_mark_node;
10061             break;
10062           }
10063       iter_incr = build_x_unary_op (EXPR_LOCATION (incr),
10064                                             TREE_CODE (incr), iter,
10065                                             NULL_TREE, tf_warning_or_error);
10066       if (error_operand_p (iter_incr))
10067           return true;
10068       else if (TREE_CODE (incr) == PREINCREMENT_EXPR
10069                  || TREE_CODE (incr) == POSTINCREMENT_EXPR)
10070           incr = integer_one_node;
10071       else
10072           incr = integer_minus_one_node;
10073       break;
10074     case MODIFY_EXPR:
10075       if (TREE_OPERAND (incr, 0) != iter)
10076           incr = error_mark_node;
10077       else if (TREE_CODE (TREE_OPERAND (incr, 1)) == PLUS_EXPR
10078                  || TREE_CODE (TREE_OPERAND (incr, 1)) == MINUS_EXPR)
10079           {
10080             tree rhs = TREE_OPERAND (incr, 1);
10081             if (TREE_OPERAND (rhs, 0) == iter)
10082               {
10083                 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 1)))
10084                       != INTEGER_TYPE)
10085                     incr = error_mark_node;
10086                 else
10087                     {
10088                       iter_incr = build_x_modify_expr (EXPR_LOCATION (rhs),
10089                                                                iter, TREE_CODE (rhs),
10090                                                                TREE_OPERAND (rhs, 1),
10091                                                                NULL_TREE,
10092                                                                tf_warning_or_error);
10093                       if (error_operand_p (iter_incr))
10094                         return true;
10095                       incr = TREE_OPERAND (rhs, 1);
10096                       incr = cp_convert (TREE_TYPE (diff), incr,
10097                                              tf_warning_or_error);
10098                       if (TREE_CODE (rhs) == MINUS_EXPR)
10099                         {
10100                           incr = build1 (NEGATE_EXPR, TREE_TYPE (diff), incr);
10101                           incr = fold_simple (incr);
10102                         }
10103                       if (TREE_CODE (incr) != INTEGER_CST
10104                           && (TREE_CODE (incr) != NOP_EXPR
10105                                 || (TREE_CODE (TREE_OPERAND (incr, 0))
10106                                     != INTEGER_CST)))
10107                         iter_incr = NULL;
10108                     }
10109               }
10110             else if (TREE_OPERAND (rhs, 1) == iter)
10111               {
10112                 if (TREE_CODE (TREE_TYPE (TREE_OPERAND (rhs, 0))) != INTEGER_TYPE
10113                       || TREE_CODE (rhs) != PLUS_EXPR)
10114                     incr = error_mark_node;
10115                 else
10116                     {
10117                       iter_incr = build_x_binary_op (EXPR_LOCATION (rhs),
10118                                                              PLUS_EXPR,
10119                                                              TREE_OPERAND (rhs, 0),
10120                                                              ERROR_MARK, iter,
10121                                                              ERROR_MARK, NULL_TREE, NULL,
10122                                                              tf_warning_or_error);
10123                       if (error_operand_p (iter_incr))
10124                         return true;
10125                       iter_incr = build_x_modify_expr (EXPR_LOCATION (rhs),
10126                                                                iter, NOP_EXPR,
10127                                                                iter_incr, NULL_TREE,
10128                                                                tf_warning_or_error);
10129                       if (error_operand_p (iter_incr))
10130                         return true;
10131                       incr = TREE_OPERAND (rhs, 0);
10132                       iter_incr = NULL;
10133                     }
10134               }
10135             else
10136               incr = error_mark_node;
10137           }
10138       else
10139           incr = error_mark_node;
10140       break;
10141     default:
10142       incr = error_mark_node;
10143       break;
10144     }
10145 
10146   if (incr == error_mark_node)
10147     {
10148       error_at (elocus, "invalid increment expression");
10149       return true;
10150     }
10151 
10152   incr = cp_convert (TREE_TYPE (diff), incr, tf_warning_or_error);
10153   incr = cp_fully_fold (incr);
10154   tree loop_iv_seen = NULL_TREE;
10155   for (c = clauses; c ; c = OMP_CLAUSE_CHAIN (c))
10156     if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
10157           && OMP_CLAUSE_DECL (c) == iter)
10158       {
10159           if (code == OMP_TASKLOOP || code == OMP_LOOP)
10160             {
10161               loop_iv_seen = c;
10162               OMP_CLAUSE_LASTPRIVATE_LOOP_IV (c) = 1;
10163             }
10164           break;
10165       }
10166     else if ((code == OMP_TASKLOOP || code == OMP_LOOP)
10167                && OMP_CLAUSE_CODE (c) == OMP_CLAUSE_PRIVATE
10168                && OMP_CLAUSE_DECL (c) == iter)
10169       {
10170           loop_iv_seen = c;
10171           if (code == OMP_TASKLOOP)
10172             OMP_CLAUSE_PRIVATE_TASKLOOP_IV (c) = 1;
10173       }
10174 
10175   decl = create_temporary_var (TREE_TYPE (diff));
10176   pushdecl (decl);
10177   add_decl_expr (decl);
10178   last = create_temporary_var (TREE_TYPE (diff));
10179   pushdecl (last);
10180   add_decl_expr (last);
10181   if (c && iter_incr == NULL && TREE_CODE (incr) != INTEGER_CST
10182       && (!ordered || (i < collapse && collapse > 1)))
10183     {
10184       incr_var = create_temporary_var (TREE_TYPE (diff));
10185       pushdecl (incr_var);
10186       add_decl_expr (incr_var);
10187     }
10188   gcc_assert (stmts_are_full_exprs_p ());
10189   tree diffvar = NULL_TREE;
10190   if (code == OMP_TASKLOOP)
10191     {
10192       if (!loop_iv_seen)
10193           {
10194             tree ivc = build_omp_clause (locus, OMP_CLAUSE_FIRSTPRIVATE);
10195             OMP_CLAUSE_DECL (ivc) = iter;
10196             cxx_omp_finish_clause (ivc, NULL, false);
10197             OMP_CLAUSE_CHAIN (ivc) = clauses;
10198             clauses = ivc;
10199           }
10200       tree lvc = build_omp_clause (locus, OMP_CLAUSE_FIRSTPRIVATE);
10201       OMP_CLAUSE_DECL (lvc) = last;
10202       OMP_CLAUSE_CHAIN (lvc) = clauses;
10203       clauses = lvc;
10204       diffvar = create_temporary_var (TREE_TYPE (diff));
10205       pushdecl (diffvar);
10206       add_decl_expr (diffvar);
10207     }
10208   else if (code == OMP_LOOP)
10209     {
10210       if (!loop_iv_seen)
10211           {
10212             /* While iterators on the loop construct are predetermined
10213                lastprivate, if the decl is not declared inside of the
10214                loop, OMP_CLAUSE_LASTPRIVATE should have been added
10215                already.  */
10216             loop_iv_seen = build_omp_clause (locus, OMP_CLAUSE_FIRSTPRIVATE);
10217             OMP_CLAUSE_DECL (loop_iv_seen) = iter;
10218             OMP_CLAUSE_CHAIN (loop_iv_seen) = clauses;
10219             clauses = loop_iv_seen;
10220           }
10221       else if (OMP_CLAUSE_CODE (loop_iv_seen) == OMP_CLAUSE_PRIVATE)
10222           {
10223             OMP_CLAUSE_PRIVATE_DEBUG (loop_iv_seen) = 0;
10224             OMP_CLAUSE_PRIVATE_OUTER_REF (loop_iv_seen) = 0;
10225             OMP_CLAUSE_CODE (loop_iv_seen) = OMP_CLAUSE_FIRSTPRIVATE;
10226           }
10227       if (OMP_CLAUSE_CODE (loop_iv_seen) == OMP_CLAUSE_FIRSTPRIVATE)
10228           cxx_omp_finish_clause (loop_iv_seen, NULL, false);
10229     }
10230 
10231   orig_pre_body = *pre_body;
10232   *pre_body = push_stmt_list ();
10233   if (orig_pre_body)
10234     add_stmt (orig_pre_body);
10235   if (init != NULL)
10236     finish_expr_stmt (build_x_modify_expr (elocus,
10237                                                      iter, NOP_EXPR, init,
10238                                                      NULL_TREE, tf_warning_or_error));
10239   init = build_int_cst (TREE_TYPE (diff), 0);
10240   if (c && iter_incr == NULL
10241       && (!ordered || (i < collapse && collapse > 1)))
10242     {
10243       if (incr_var)
10244           {
10245             finish_expr_stmt (build_x_modify_expr (elocus,
10246                                                              incr_var, NOP_EXPR,
10247                                                              incr, NULL_TREE,
10248                                                              tf_warning_or_error));
10249             incr = incr_var;
10250           }
10251       iter_incr = build_x_modify_expr (elocus,
10252                                                iter, PLUS_EXPR, incr,
10253                                                NULL_TREE, tf_warning_or_error);
10254     }
10255   if (c && ordered && i < collapse && collapse > 1)
10256     iter_incr = incr;
10257   finish_expr_stmt (build_x_modify_expr (elocus,
10258                                                    last, NOP_EXPR, init,
10259                                                    NULL_TREE, tf_warning_or_error));
10260   if (diffvar)
10261     {
10262       finish_expr_stmt (build_x_modify_expr (elocus,
10263                                                        diffvar, NOP_EXPR,
10264                                                        diff, NULL_TREE, tf_warning_or_error));
10265       diff = diffvar;
10266     }
10267   *pre_body = pop_stmt_list (*pre_body);
10268 
10269   cond = cp_build_binary_op (elocus,
10270                                    TREE_CODE (cond), decl, diff,
10271                                    tf_warning_or_error);
10272   incr = build_modify_expr (elocus, decl, NULL_TREE, PLUS_EXPR,
10273                                   elocus, incr, NULL_TREE);
10274 
10275   orig_body = *body;
10276   *body = push_stmt_list ();
10277   iter_init = build2 (MINUS_EXPR, TREE_TYPE (diff), decl, last);
10278   iter_init = build_x_modify_expr (elocus,
10279                                            iter, PLUS_EXPR, iter_init,
10280                                            NULL_TREE, tf_warning_or_error);
10281   if (iter_init != error_mark_node)
10282     iter_init = build1 (NOP_EXPR, void_type_node, iter_init);
10283   finish_expr_stmt (iter_init);
10284   finish_expr_stmt (build_x_modify_expr (elocus,
10285                                                    last, NOP_EXPR, decl,
10286                                                    NULL_TREE, tf_warning_or_error));
10287   add_stmt (orig_body);
10288   *body = pop_stmt_list (*body);
10289 
10290   if (c)
10291     {
10292       OMP_CLAUSE_LASTPRIVATE_STMT (c) = push_stmt_list ();
10293       if (!ordered)
10294           finish_expr_stmt (iter_incr);
10295       else
10296           {
10297             iter_init = decl;
10298             if (i < collapse && collapse > 1 && !error_operand_p (iter_incr))
10299               iter_init = build2 (PLUS_EXPR, TREE_TYPE (diff),
10300                                         iter_init, iter_incr);
10301             iter_init = build2 (MINUS_EXPR, TREE_TYPE (diff), iter_init, last);
10302             iter_init = build_x_modify_expr (elocus,
10303                                                      iter, PLUS_EXPR, iter_init,
10304                                                      NULL_TREE, tf_warning_or_error);
10305             if (iter_init != error_mark_node)
10306               iter_init = build1 (NOP_EXPR, void_type_node, iter_init);
10307             finish_expr_stmt (iter_init);
10308           }
10309       OMP_CLAUSE_LASTPRIVATE_STMT (c)
10310           = pop_stmt_list (OMP_CLAUSE_LASTPRIVATE_STMT (c));
10311     }
10312 
10313   if (TREE_CODE (TREE_VEC_ELT (orig_declv, i)) == TREE_LIST)
10314     {
10315       tree t = TREE_VEC_ELT (orig_declv, i);
10316       gcc_assert (TREE_PURPOSE (t) == NULL_TREE
10317                       && TREE_VALUE (t) == NULL_TREE
10318                       && TREE_CODE (TREE_CHAIN (t)) == TREE_VEC);
10319       TREE_PURPOSE (t) = TREE_VEC_ELT (declv, i);
10320       TREE_VALUE (t) = last;
10321     }
10322   else
10323     TREE_VEC_ELT (orig_declv, i)
10324       = tree_cons (TREE_VEC_ELT (declv, i), last, NULL_TREE);
10325   TREE_VEC_ELT (declv, i) = decl;
10326   TREE_VEC_ELT (initv, i) = init;
10327   TREE_VEC_ELT (condv, i) = cond;
10328   TREE_VEC_ELT (incrv, i) = incr;
10329 
10330   return false;
10331 }
10332 
10333 /* Build and validate an OMP_FOR statement.  CLAUSES, BODY, COND, INCR
10334    are directly for their associated operands in the statement.  DECL
10335    and INIT are a combo; if DECL is NULL then INIT ought to be a
10336    MODIFY_EXPR, and the DECL should be extracted.  PRE_BODY are
10337    optional statements that need to go before the loop into its
10338    sk_omp scope.  */
10339 
10340 tree
finish_omp_for(location_t locus,enum tree_code code,tree declv,tree orig_declv,tree initv,tree condv,tree incrv,tree body,tree pre_body,vec<tree> * orig_inits,tree clauses)10341 finish_omp_for (location_t locus, enum tree_code code, tree declv,
10342                     tree orig_declv, tree initv, tree condv, tree incrv,
10343                     tree body, tree pre_body, vec<tree> *orig_inits, tree clauses)
10344 {
10345   tree omp_for = NULL, orig_incr = NULL;
10346   tree decl = NULL, init, cond, incr;
10347   location_t elocus;
10348   int i;
10349   int collapse = 1;
10350   int ordered = 0;
10351 
10352   gcc_assert (TREE_VEC_LENGTH (declv) == TREE_VEC_LENGTH (initv));
10353   gcc_assert (TREE_VEC_LENGTH (declv) == TREE_VEC_LENGTH (condv));
10354   gcc_assert (TREE_VEC_LENGTH (declv) == TREE_VEC_LENGTH (incrv));
10355   if (TREE_VEC_LENGTH (declv) > 1)
10356     {
10357       tree c;
10358 
10359       c = omp_find_clause (clauses, OMP_CLAUSE_TILE);
10360       if (c)
10361           collapse = list_length (OMP_CLAUSE_TILE_LIST (c));
10362       else
10363           {
10364             c = omp_find_clause (clauses, OMP_CLAUSE_COLLAPSE);
10365             if (c)
10366               collapse = tree_to_shwi (OMP_CLAUSE_COLLAPSE_EXPR (c));
10367             if (collapse != TREE_VEC_LENGTH (declv))
10368               ordered = TREE_VEC_LENGTH (declv);
10369           }
10370     }
10371   for (i = 0; i < TREE_VEC_LENGTH (declv); i++)
10372     {
10373       decl = TREE_VEC_ELT (declv, i);
10374       init = TREE_VEC_ELT (initv, i);
10375       cond = TREE_VEC_ELT (condv, i);
10376       incr = TREE_VEC_ELT (incrv, i);
10377       elocus = locus;
10378 
10379       if (decl == NULL)
10380           {
10381             if (init != NULL)
10382               switch (TREE_CODE (init))
10383                 {
10384                 case MODIFY_EXPR:
10385                     decl = TREE_OPERAND (init, 0);
10386                     init = TREE_OPERAND (init, 1);
10387                     break;
10388                 case MODOP_EXPR:
10389                     if (TREE_CODE (TREE_OPERAND (init, 1)) == NOP_EXPR)
10390                       {
10391                         decl = TREE_OPERAND (init, 0);
10392                         init = TREE_OPERAND (init, 2);
10393                       }
10394                     break;
10395                 default:
10396                     break;
10397                 }
10398 
10399             if (decl == NULL)
10400               {
10401                 error_at (locus,
10402                               "expected iteration declaration or initialization");
10403                 return NULL;
10404               }
10405           }
10406 
10407       if (init && EXPR_HAS_LOCATION (init))
10408           elocus = EXPR_LOCATION (init);
10409 
10410       if (cond == global_namespace)
10411           continue;
10412 
10413       if (cond == NULL)
10414           {
10415             error_at (elocus, "missing controlling predicate");
10416             return NULL;
10417           }
10418 
10419       if (incr == NULL)
10420           {
10421             error_at (elocus, "missing increment expression");
10422             return NULL;
10423           }
10424 
10425       TREE_VEC_ELT (declv, i) = decl;
10426       TREE_VEC_ELT (initv, i) = init;
10427     }
10428 
10429   if (orig_inits)
10430     {
10431       bool fail = false;
10432       tree orig_init;
10433       FOR_EACH_VEC_ELT (*orig_inits, i, orig_init)
10434           if (orig_init
10435               && !c_omp_check_loop_iv_exprs (locus, code,
10436                                                      orig_declv ? orig_declv : declv, i,
10437                                                      TREE_VEC_ELT (declv, i), orig_init,
10438                                                      NULL_TREE, cp_walk_subtrees))
10439             fail = true;
10440       if (fail)
10441           return NULL;
10442     }
10443 
10444   if (dependent_omp_for_p (declv, initv, condv, incrv))
10445     {
10446       tree stmt;
10447 
10448       stmt = make_node (code);
10449 
10450       for (i = 0; i < TREE_VEC_LENGTH (declv); i++)
10451           {
10452             /* This is really just a place-holder.  We'll be decomposing this
10453                again and going through the cp_build_modify_expr path below when
10454                we instantiate the thing.  */
10455             TREE_VEC_ELT (initv, i)
10456               = build2 (MODIFY_EXPR, void_type_node, TREE_VEC_ELT (declv, i),
10457                           TREE_VEC_ELT (initv, i));
10458           }
10459 
10460       TREE_TYPE (stmt) = void_type_node;
10461       OMP_FOR_INIT (stmt) = initv;
10462       OMP_FOR_COND (stmt) = condv;
10463       OMP_FOR_INCR (stmt) = incrv;
10464       OMP_FOR_BODY (stmt) = body;
10465       OMP_FOR_PRE_BODY (stmt) = pre_body;
10466       OMP_FOR_CLAUSES (stmt) = clauses;
10467 
10468       SET_EXPR_LOCATION (stmt, locus);
10469       return add_stmt (stmt);
10470     }
10471 
10472   if (!orig_declv)
10473     orig_declv = copy_node (declv);
10474 
10475   if (processing_template_decl)
10476     orig_incr = make_tree_vec (TREE_VEC_LENGTH (incrv));
10477 
10478   for (i = 0; i < TREE_VEC_LENGTH (declv); )
10479     {
10480       decl = TREE_VEC_ELT (declv, i);
10481       init = TREE_VEC_ELT (initv, i);
10482       cond = TREE_VEC_ELT (condv, i);
10483       incr = TREE_VEC_ELT (incrv, i);
10484       if (orig_incr)
10485           TREE_VEC_ELT (orig_incr, i) = incr;
10486       elocus = locus;
10487 
10488       if (init && EXPR_HAS_LOCATION (init))
10489           elocus = EXPR_LOCATION (init);
10490 
10491       if (!DECL_P (decl))
10492           {
10493             error_at (elocus, "expected iteration declaration or initialization");
10494             return NULL;
10495           }
10496 
10497       if (incr && TREE_CODE (incr) == MODOP_EXPR)
10498           {
10499             if (orig_incr)
10500               TREE_VEC_ELT (orig_incr, i) = incr;
10501             incr = cp_build_modify_expr (elocus, TREE_OPERAND (incr, 0),
10502                                                TREE_CODE (TREE_OPERAND (incr, 1)),
10503                                                TREE_OPERAND (incr, 2),
10504                                                tf_warning_or_error);
10505           }
10506 
10507       if (CLASS_TYPE_P (TREE_TYPE (decl)))
10508           {
10509             if (code == OMP_SIMD)
10510               {
10511                 error_at (elocus, "%<#pragma omp simd%> used with class "
10512                                         "iteration variable %qE", decl);
10513                 return NULL;
10514               }
10515             if (handle_omp_for_class_iterator (i, locus, code, declv, orig_declv,
10516                                                        initv, condv, incrv, &body,
10517                                                        &pre_body, clauses,
10518                                                        collapse, ordered))
10519               return NULL;
10520             continue;
10521           }
10522 
10523       if (!INTEGRAL_TYPE_P (TREE_TYPE (decl))
10524             && !TYPE_PTR_P (TREE_TYPE (decl)))
10525           {
10526             error_at (elocus, "invalid type for iteration variable %qE", decl);
10527             return NULL;
10528           }
10529 
10530       if (!processing_template_decl && TREE_CODE (init) != TREE_VEC)
10531           init = cp_build_modify_expr (elocus, decl, NOP_EXPR, init,
10532                                              tf_warning_or_error);
10533       else
10534           init = build2 (MODIFY_EXPR, void_type_node, decl, init);
10535       if (decl == error_mark_node || init == error_mark_node)
10536           return NULL;
10537 
10538       TREE_VEC_ELT (declv, i) = decl;
10539       TREE_VEC_ELT (initv, i) = init;
10540       TREE_VEC_ELT (condv, i) = cond;
10541       TREE_VEC_ELT (incrv, i) = incr;
10542       i++;
10543     }
10544 
10545   if (pre_body && IS_EMPTY_STMT (pre_body))
10546     pre_body = NULL;
10547 
10548   omp_for = c_finish_omp_for (locus, code, declv, orig_declv, initv, condv,
10549                                     incrv, body, pre_body,
10550                                     !processing_template_decl);
10551 
10552   /* Check for iterators appearing in lb, b or incr expressions.  */
10553   if (omp_for && !c_omp_check_loop_iv (omp_for, orig_declv, cp_walk_subtrees))
10554     omp_for = NULL_TREE;
10555 
10556   if (omp_for == NULL)
10557     return NULL;
10558 
10559   add_stmt (omp_for);
10560 
10561   for (i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INCR (omp_for)); i++)
10562     {
10563       init = TREE_VEC_ELT (OMP_FOR_INIT (omp_for), i);
10564       decl = TREE_OPERAND (init, 0);
10565       cond = TREE_VEC_ELT (OMP_FOR_COND (omp_for), i);
10566       incr = TREE_VEC_ELT (OMP_FOR_INCR (omp_for), i);
10567 
10568       if (!processing_template_decl)
10569           {
10570             if (TREE_CODE (TREE_OPERAND (init, 1)) == TREE_VEC)
10571               {
10572                 tree t = TREE_VEC_ELT (TREE_OPERAND (init, 1), 1);
10573                 TREE_VEC_ELT (TREE_OPERAND (init, 1), 1)
10574                     = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
10575                 t = TREE_VEC_ELT (TREE_OPERAND (init, 1), 2);
10576                 TREE_VEC_ELT (TREE_OPERAND (init, 1), 2)
10577                     = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
10578               }
10579             else
10580               {
10581                 tree t = TREE_OPERAND (init, 1);
10582                 TREE_OPERAND (init, 1)
10583                     = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
10584               }
10585             if (TREE_CODE (TREE_OPERAND (cond, 1)) == TREE_VEC)
10586               {
10587                 tree t = TREE_VEC_ELT (TREE_OPERAND (cond, 1), 1);
10588                 TREE_VEC_ELT (TREE_OPERAND (cond, 1), 1)
10589                     = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
10590                 t = TREE_VEC_ELT (TREE_OPERAND (cond, 1), 2);
10591                 TREE_VEC_ELT (TREE_OPERAND (cond, 1), 2)
10592                     = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
10593               }
10594             else
10595               {
10596                 tree t = TREE_OPERAND (cond, 1);
10597                 TREE_OPERAND (cond, 1)
10598                     = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
10599               }
10600           }
10601 
10602       if (TREE_CODE (incr) != MODIFY_EXPR)
10603           continue;
10604 
10605       if (TREE_SIDE_EFFECTS (TREE_OPERAND (incr, 1))
10606             && BINARY_CLASS_P (TREE_OPERAND (incr, 1))
10607             && !processing_template_decl)
10608           {
10609             tree t = TREE_OPERAND (TREE_OPERAND (incr, 1), 0);
10610             if (TREE_SIDE_EFFECTS (t)
10611                 && t != decl
10612                 && (TREE_CODE (t) != NOP_EXPR
10613                       || TREE_OPERAND (t, 0) != decl))
10614               TREE_OPERAND (TREE_OPERAND (incr, 1), 0)
10615                 = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
10616 
10617             t = TREE_OPERAND (TREE_OPERAND (incr, 1), 1);
10618             if (TREE_SIDE_EFFECTS (t)
10619                 && t != decl
10620                 && (TREE_CODE (t) != NOP_EXPR
10621                       || TREE_OPERAND (t, 0) != decl))
10622               TREE_OPERAND (TREE_OPERAND (incr, 1), 1)
10623                 = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
10624           }
10625 
10626       if (orig_incr)
10627           TREE_VEC_ELT (OMP_FOR_INCR (omp_for), i) = TREE_VEC_ELT (orig_incr, i);
10628     }
10629   OMP_FOR_CLAUSES (omp_for) = clauses;
10630 
10631   /* For simd loops with non-static data member iterators, we could have added
10632      OMP_CLAUSE_LINEAR clauses without OMP_CLAUSE_LINEAR_STEP.  As we know the
10633      step at this point, fill it in.  */
10634   if (code == OMP_SIMD && !processing_template_decl
10635       && TREE_VEC_LENGTH (OMP_FOR_INCR (omp_for)) == 1)
10636     for (tree c = omp_find_clause (clauses, OMP_CLAUSE_LINEAR); c;
10637            c = omp_find_clause (OMP_CLAUSE_CHAIN (c), OMP_CLAUSE_LINEAR))
10638       if (OMP_CLAUSE_LINEAR_STEP (c) == NULL_TREE)
10639           {
10640             decl = TREE_OPERAND (TREE_VEC_ELT (OMP_FOR_INIT (omp_for), 0), 0);
10641             gcc_assert (decl == OMP_CLAUSE_DECL (c));
10642             incr = TREE_VEC_ELT (OMP_FOR_INCR (omp_for), 0);
10643             tree step, stept;
10644             switch (TREE_CODE (incr))
10645               {
10646               case PREINCREMENT_EXPR:
10647               case POSTINCREMENT_EXPR:
10648                 /* c_omp_for_incr_canonicalize_ptr() should have been
10649                      called to massage things appropriately.  */
10650                 gcc_assert (!INDIRECT_TYPE_P (TREE_TYPE (decl)));
10651                 OMP_CLAUSE_LINEAR_STEP (c) = build_int_cst (TREE_TYPE (decl), 1);
10652                 break;
10653               case PREDECREMENT_EXPR:
10654               case POSTDECREMENT_EXPR:
10655                 /* c_omp_for_incr_canonicalize_ptr() should have been
10656                      called to massage things appropriately.  */
10657                 gcc_assert (!INDIRECT_TYPE_P (TREE_TYPE (decl)));
10658                 OMP_CLAUSE_LINEAR_STEP (c)
10659                     = build_int_cst (TREE_TYPE (decl), -1);
10660                 break;
10661               case MODIFY_EXPR:
10662                 gcc_assert (TREE_OPERAND (incr, 0) == decl);
10663                 incr = TREE_OPERAND (incr, 1);
10664                 switch (TREE_CODE (incr))
10665                     {
10666                     case PLUS_EXPR:
10667                       if (TREE_OPERAND (incr, 1) == decl)
10668                         step = TREE_OPERAND (incr, 0);
10669                       else
10670                         step = TREE_OPERAND (incr, 1);
10671                       break;
10672                     case MINUS_EXPR:
10673                     case POINTER_PLUS_EXPR:
10674                       gcc_assert (TREE_OPERAND (incr, 0) == decl);
10675                       step = TREE_OPERAND (incr, 1);
10676                       break;
10677                     default:
10678                       gcc_unreachable ();
10679                     }
10680                 stept = TREE_TYPE (decl);
10681                 if (INDIRECT_TYPE_P (stept))
10682                     stept = sizetype;
10683                 step = fold_convert (stept, step);
10684                 if (TREE_CODE (incr) == MINUS_EXPR)
10685                     step = fold_build1 (NEGATE_EXPR, stept, step);
10686                 OMP_CLAUSE_LINEAR_STEP (c) = step;
10687                 break;
10688               default:
10689                 gcc_unreachable ();
10690               }
10691           }
10692   /* Override saved methods on OMP_LOOP's OMP_CLAUSE_LASTPRIVATE_LOOP_IV
10693      clauses, we need copy ctor for those rather than default ctor,
10694      plus as for other lastprivates assignment op and dtor.  */
10695   if (code == OMP_LOOP && !processing_template_decl)
10696     for (tree c = clauses; c; c = OMP_CLAUSE_CHAIN (c))
10697       if (OMP_CLAUSE_CODE (c) == OMP_CLAUSE_LASTPRIVATE
10698             && OMP_CLAUSE_LASTPRIVATE_LOOP_IV (c)
10699             && cxx_omp_create_clause_info (c, TREE_TYPE (OMP_CLAUSE_DECL (c)),
10700                                                    false, true, true, true))
10701           CP_OMP_CLAUSE_INFO (c) = NULL_TREE;
10702 
10703   return omp_for;
10704 }
10705 
10706 /* Fix up range for decls.  Those decls were pushed into BIND's BIND_EXPR_VARS
10707    and need to be moved into the BIND_EXPR inside of the OMP_FOR's body.  */
10708 
10709 tree
finish_omp_for_block(tree bind,tree omp_for)10710 finish_omp_for_block (tree bind, tree omp_for)
10711 {
10712   if (omp_for == NULL_TREE
10713       || !OMP_FOR_ORIG_DECLS (omp_for)
10714       || bind == NULL_TREE
10715       || TREE_CODE (bind) != BIND_EXPR)
10716     return bind;
10717   tree b = NULL_TREE;
10718   for (int i = 0; i < TREE_VEC_LENGTH (OMP_FOR_INIT (omp_for)); i++)
10719     if (TREE_CODE (TREE_VEC_ELT (OMP_FOR_ORIG_DECLS (omp_for), i)) == TREE_LIST
10720           && TREE_CHAIN (TREE_VEC_ELT (OMP_FOR_ORIG_DECLS (omp_for), i)))
10721       {
10722           tree v = TREE_CHAIN (TREE_VEC_ELT (OMP_FOR_ORIG_DECLS (omp_for), i));
10723           gcc_assert (BIND_EXPR_BLOCK (bind)
10724                         && (BIND_EXPR_VARS (bind)
10725                               == BLOCK_VARS (BIND_EXPR_BLOCK (bind))));
10726           for (int j = 2; j < TREE_VEC_LENGTH (v); j++)
10727             for (tree *p = &BIND_EXPR_VARS (bind); *p; p = &DECL_CHAIN (*p))
10728               {
10729                 if (*p == TREE_VEC_ELT (v, j))
10730                     {
10731                       tree var = *p;
10732                       *p = DECL_CHAIN (*p);
10733                       if (b == NULL_TREE)
10734                         {
10735                           b = make_node (BLOCK);
10736                           b = build3 (BIND_EXPR, void_type_node, NULL_TREE,
10737                                           OMP_FOR_BODY (omp_for), b);
10738                           TREE_SIDE_EFFECTS (b) = 1;
10739                           OMP_FOR_BODY (omp_for) = b;
10740                         }
10741                       DECL_CHAIN (var) = BIND_EXPR_VARS (b);
10742                       BIND_EXPR_VARS (b) = var;
10743                       BLOCK_VARS (BIND_EXPR_BLOCK (b)) = var;
10744                     }
10745               }
10746           BLOCK_VARS (BIND_EXPR_BLOCK (bind)) = BIND_EXPR_VARS (bind);
10747       }
10748   return bind;
10749 }
10750 
10751 void
finish_omp_atomic(location_t loc,enum tree_code code,enum tree_code opcode,tree lhs,tree rhs,tree v,tree lhs1,tree rhs1,tree r,tree clauses,enum omp_memory_order mo,bool weak)10752 finish_omp_atomic (location_t loc, enum tree_code code, enum tree_code opcode,
10753                        tree lhs, tree rhs, tree v, tree lhs1, tree rhs1, tree r,
10754                        tree clauses, enum omp_memory_order mo, bool weak)
10755 {
10756   tree orig_lhs;
10757   tree orig_rhs;
10758   tree orig_v;
10759   tree orig_lhs1;
10760   tree orig_rhs1;
10761   tree orig_r;
10762   bool dependent_p;
10763   tree stmt;
10764 
10765   orig_lhs = lhs;
10766   orig_rhs = rhs;
10767   orig_v = v;
10768   orig_lhs1 = lhs1;
10769   orig_rhs1 = rhs1;
10770   orig_r = r;
10771   dependent_p = false;
10772   stmt = NULL_TREE;
10773 
10774   /* Even in a template, we can detect invalid uses of the atomic
10775      pragma if neither LHS nor RHS is type-dependent.  */
10776   if (processing_template_decl)
10777     {
10778       dependent_p = (type_dependent_expression_p (lhs)
10779                          || (rhs && type_dependent_expression_p (rhs))
10780                          || (v && type_dependent_expression_p (v))
10781                          || (lhs1 && type_dependent_expression_p (lhs1))
10782                          || (rhs1 && type_dependent_expression_p (rhs1))
10783                          || (r
10784                                && r != void_list_node
10785                                && type_dependent_expression_p (r)));
10786       if (clauses)
10787           {
10788             gcc_assert (TREE_CODE (clauses) == OMP_CLAUSE
10789                           && OMP_CLAUSE_CODE (clauses) == OMP_CLAUSE_HINT
10790                           && OMP_CLAUSE_CHAIN (clauses) == NULL_TREE);
10791             if (type_dependent_expression_p (OMP_CLAUSE_HINT_EXPR (clauses))
10792                 || TREE_CODE (OMP_CLAUSE_HINT_EXPR (clauses)) != INTEGER_CST)
10793               dependent_p = true;
10794           }
10795       if (!dependent_p)
10796           {
10797             lhs = build_non_dependent_expr (lhs);
10798             if (rhs)
10799               rhs = build_non_dependent_expr (rhs);
10800             if (v)
10801               v = build_non_dependent_expr (v);
10802             if (lhs1)
10803               lhs1 = build_non_dependent_expr (lhs1);
10804             if (rhs1)
10805               rhs1 = build_non_dependent_expr (rhs1);
10806             if (r && r != void_list_node)
10807               r = build_non_dependent_expr (r);
10808           }
10809     }
10810   if (!dependent_p)
10811     {
10812       bool swapped = false;
10813       if (rhs1 && opcode != COND_EXPR && cp_tree_equal (lhs, rhs))
10814           {
10815             std::swap (rhs, rhs1);
10816             swapped = !commutative_tree_code (opcode);
10817           }
10818       if (rhs1 && opcode != COND_EXPR && !cp_tree_equal (lhs, rhs1))
10819           {
10820             if (code == OMP_ATOMIC)
10821               error ("%<#pragma omp atomic update%> uses two different "
10822                        "expressions for memory");
10823             else
10824               error ("%<#pragma omp atomic capture%> uses two different "
10825                        "expressions for memory");
10826             return;
10827           }
10828       if (lhs1 && !cp_tree_equal (lhs, lhs1))
10829           {
10830             if (code == OMP_ATOMIC)
10831               error ("%<#pragma omp atomic update%> uses two different "
10832                        "expressions for memory");
10833             else
10834               error ("%<#pragma omp atomic capture%> uses two different "
10835                        "expressions for memory");
10836             return;
10837           }
10838       stmt = c_finish_omp_atomic (loc, code, opcode, lhs, rhs,
10839                                           v, lhs1, rhs1, r, swapped, mo, weak,
10840                                           processing_template_decl != 0);
10841       if (stmt == error_mark_node)
10842           return;
10843     }
10844   if (processing_template_decl)
10845     {
10846       if (code == OMP_ATOMIC_READ)
10847           {
10848             stmt = build_min_nt_loc (loc, OMP_ATOMIC_READ, orig_lhs);
10849             OMP_ATOMIC_MEMORY_ORDER (stmt) = mo;
10850             stmt = build2 (MODIFY_EXPR, void_type_node, orig_v, stmt);
10851           }
10852       else
10853           {
10854             if (opcode == NOP_EXPR)
10855               stmt = build2 (MODIFY_EXPR, void_type_node, orig_lhs, orig_rhs);
10856             else if (opcode == COND_EXPR)
10857               {
10858                 stmt = build2 (EQ_EXPR, boolean_type_node, orig_lhs, orig_rhs);
10859                 if (orig_r)
10860                     stmt = build2 (MODIFY_EXPR, boolean_type_node, orig_r,
10861                                      stmt);
10862                 stmt = build3 (COND_EXPR, void_type_node, stmt, orig_rhs1,
10863                                    orig_lhs);
10864                 orig_rhs1 = NULL_TREE;
10865               }
10866             else
10867               stmt = build2 (opcode, void_type_node, orig_lhs, orig_rhs);
10868             if (orig_rhs1)
10869               stmt = build_min_nt_loc (EXPR_LOCATION (orig_rhs1),
10870                                              COMPOUND_EXPR, orig_rhs1, stmt);
10871             if (code != OMP_ATOMIC)
10872               {
10873                 stmt = build_min_nt_loc (loc, code, orig_lhs1, stmt);
10874                 OMP_ATOMIC_MEMORY_ORDER (stmt) = mo;
10875                 OMP_ATOMIC_WEAK (stmt) = weak;
10876                 stmt = build2 (MODIFY_EXPR, void_type_node, orig_v, stmt);
10877               }
10878           }
10879       stmt = build2 (OMP_ATOMIC, void_type_node,
10880                          clauses ? clauses : integer_zero_node, stmt);
10881       OMP_ATOMIC_MEMORY_ORDER (stmt) = mo;
10882       OMP_ATOMIC_WEAK (stmt) = weak;
10883       SET_EXPR_LOCATION (stmt, loc);
10884     }
10885 
10886   /* Avoid -Wunused-value warnings here, the whole construct has side-effects
10887      and even if it might be wrapped from fold-const.cc or c-omp.cc wrapped
10888      in some tree that appears to be unused, the value is not unused.  */
10889   warning_sentinel w (warn_unused_value);
10890   finish_expr_stmt (stmt);
10891 }
10892 
10893 void
finish_omp_barrier(void)10894 finish_omp_barrier (void)
10895 {
10896   tree fn = builtin_decl_explicit (BUILT_IN_GOMP_BARRIER);
10897   releasing_vec vec;
10898   tree stmt = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
10899   finish_expr_stmt (stmt);
10900 }
10901 
10902 void
finish_omp_depobj(location_t loc,tree depobj,enum omp_clause_depend_kind kind,tree clause)10903 finish_omp_depobj (location_t loc, tree depobj,
10904                        enum omp_clause_depend_kind kind, tree clause)
10905 {
10906   if (!error_operand_p (depobj) && !type_dependent_expression_p (depobj))
10907     {
10908       if (!lvalue_p (depobj))
10909           {
10910             error_at (EXPR_LOC_OR_LOC (depobj, loc),
10911                         "%<depobj%> expression is not lvalue expression");
10912             depobj = error_mark_node;
10913           }
10914     }
10915 
10916   if (processing_template_decl)
10917     {
10918       if (clause == NULL_TREE)
10919           clause = build_int_cst (integer_type_node, kind);
10920       add_stmt (build_min_nt_loc (loc, OMP_DEPOBJ, depobj, clause));
10921       return;
10922     }
10923 
10924   if (!error_operand_p (depobj))
10925     {
10926       tree addr = cp_build_addr_expr (depobj, tf_warning_or_error);
10927       if (addr == error_mark_node)
10928           depobj = error_mark_node;
10929       else
10930           depobj = cp_build_indirect_ref (loc, addr, RO_UNARY_STAR,
10931                                                   tf_warning_or_error);
10932     }
10933 
10934   c_finish_omp_depobj (loc, depobj, kind, clause);
10935 }
10936 
10937 void
finish_omp_flush(int mo)10938 finish_omp_flush (int mo)
10939 {
10940   tree fn = builtin_decl_explicit (BUILT_IN_SYNC_SYNCHRONIZE);
10941   releasing_vec vec;
10942   if (mo != MEMMODEL_LAST && mo != MEMMODEL_SEQ_CST)
10943     {
10944       fn = builtin_decl_explicit (BUILT_IN_ATOMIC_THREAD_FENCE);
10945       vec->quick_push (build_int_cst (integer_type_node, mo));
10946     }
10947   tree stmt = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
10948   finish_expr_stmt (stmt);
10949 }
10950 
10951 void
finish_omp_taskwait(void)10952 finish_omp_taskwait (void)
10953 {
10954   tree fn = builtin_decl_explicit (BUILT_IN_GOMP_TASKWAIT);
10955   releasing_vec vec;
10956   tree stmt = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
10957   finish_expr_stmt (stmt);
10958 }
10959 
10960 void
finish_omp_taskyield(void)10961 finish_omp_taskyield (void)
10962 {
10963   tree fn = builtin_decl_explicit (BUILT_IN_GOMP_TASKYIELD);
10964   releasing_vec vec;
10965   tree stmt = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
10966   finish_expr_stmt (stmt);
10967 }
10968 
10969 void
finish_omp_cancel(tree clauses)10970 finish_omp_cancel (tree clauses)
10971 {
10972   tree fn = builtin_decl_explicit (BUILT_IN_GOMP_CANCEL);
10973   int mask = 0;
10974   if (omp_find_clause (clauses, OMP_CLAUSE_PARALLEL))
10975     mask = 1;
10976   else if (omp_find_clause (clauses, OMP_CLAUSE_FOR))
10977     mask = 2;
10978   else if (omp_find_clause (clauses, OMP_CLAUSE_SECTIONS))
10979     mask = 4;
10980   else if (omp_find_clause (clauses, OMP_CLAUSE_TASKGROUP))
10981     mask = 8;
10982   else
10983     {
10984       error ("%<#pragma omp cancel%> must specify one of "
10985                "%<parallel%>, %<for%>, %<sections%> or %<taskgroup%> clauses");
10986       return;
10987     }
10988   releasing_vec vec;
10989   tree ifc = omp_find_clause (clauses, OMP_CLAUSE_IF);
10990   if (ifc != NULL_TREE)
10991     {
10992       if (OMP_CLAUSE_IF_MODIFIER (ifc) != ERROR_MARK
10993             && OMP_CLAUSE_IF_MODIFIER (ifc) != VOID_CST)
10994           error_at (OMP_CLAUSE_LOCATION (ifc),
10995                       "expected %<cancel%> %<if%> clause modifier");
10996       else
10997           {
10998             tree ifc2 = omp_find_clause (OMP_CLAUSE_CHAIN (ifc), OMP_CLAUSE_IF);
10999             if (ifc2 != NULL_TREE)
11000               {
11001                 gcc_assert (OMP_CLAUSE_IF_MODIFIER (ifc) == VOID_CST
11002                                 && OMP_CLAUSE_IF_MODIFIER (ifc2) != ERROR_MARK
11003                                 && OMP_CLAUSE_IF_MODIFIER (ifc2) != VOID_CST);
11004                 error_at (OMP_CLAUSE_LOCATION (ifc2),
11005                               "expected %<cancel%> %<if%> clause modifier");
11006               }
11007           }
11008 
11009       if (!processing_template_decl)
11010           ifc = maybe_convert_cond (OMP_CLAUSE_IF_EXPR (ifc));
11011       else
11012           ifc = build_x_binary_op (OMP_CLAUSE_LOCATION (ifc), NE_EXPR,
11013                                          OMP_CLAUSE_IF_EXPR (ifc), ERROR_MARK,
11014                                          integer_zero_node, ERROR_MARK,
11015                                          NULL_TREE, NULL, tf_warning_or_error);
11016     }
11017   else
11018     ifc = boolean_true_node;
11019   vec->quick_push (build_int_cst (integer_type_node, mask));
11020   vec->quick_push (ifc);
11021   tree stmt = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
11022   finish_expr_stmt (stmt);
11023 }
11024 
11025 void
finish_omp_cancellation_point(tree clauses)11026 finish_omp_cancellation_point (tree clauses)
11027 {
11028   tree fn = builtin_decl_explicit (BUILT_IN_GOMP_CANCELLATION_POINT);
11029   int mask = 0;
11030   if (omp_find_clause (clauses, OMP_CLAUSE_PARALLEL))
11031     mask = 1;
11032   else if (omp_find_clause (clauses, OMP_CLAUSE_FOR))
11033     mask = 2;
11034   else if (omp_find_clause (clauses, OMP_CLAUSE_SECTIONS))
11035     mask = 4;
11036   else if (omp_find_clause (clauses, OMP_CLAUSE_TASKGROUP))
11037     mask = 8;
11038   else
11039     {
11040       error ("%<#pragma omp cancellation point%> must specify one of "
11041                "%<parallel%>, %<for%>, %<sections%> or %<taskgroup%> clauses");
11042       return;
11043     }
11044   releasing_vec vec
11045     = make_tree_vector_single (build_int_cst (integer_type_node, mask));
11046   tree stmt = finish_call_expr (fn, &vec, false, false, tf_warning_or_error);
11047   finish_expr_stmt (stmt);
11048 }
11049 
11050 /* Begin a __transaction_atomic or __transaction_relaxed statement.
11051    If PCOMPOUND is non-null, this is for a function-transaction-block, and we
11052    should create an extra compound stmt.  */
11053 
11054 tree
begin_transaction_stmt(location_t loc,tree * pcompound,int flags)11055 begin_transaction_stmt (location_t loc, tree *pcompound, int flags)
11056 {
11057   tree r;
11058 
11059   if (pcompound)
11060     *pcompound = begin_compound_stmt (0);
11061 
11062   r = build_stmt (loc, TRANSACTION_EXPR, NULL_TREE);
11063 
11064   /* Only add the statement to the function if support enabled.  */
11065   if (flag_tm)
11066     add_stmt (r);
11067   else
11068     error_at (loc, ((flags & TM_STMT_ATTR_RELAXED) != 0
11069                         ? G_("%<__transaction_relaxed%> without "
11070                                "transactional memory support enabled")
11071                         : G_("%<__transaction_atomic%> without "
11072                                "transactional memory support enabled")));
11073 
11074   TRANSACTION_EXPR_BODY (r) = push_stmt_list ();
11075   TREE_SIDE_EFFECTS (r) = 1;
11076   return r;
11077 }
11078 
11079 /* End a __transaction_atomic or __transaction_relaxed statement.
11080    If COMPOUND_STMT is non-null, this is for a function-transaction-block,
11081    and we should end the compound.  If NOEX is non-NULL, we wrap the body in
11082    a MUST_NOT_THROW_EXPR with NOEX as condition.  */
11083 
11084 void
finish_transaction_stmt(tree stmt,tree compound_stmt,int flags,tree noex)11085 finish_transaction_stmt (tree stmt, tree compound_stmt, int flags, tree noex)
11086 {
11087   TRANSACTION_EXPR_BODY (stmt) = pop_stmt_list (TRANSACTION_EXPR_BODY (stmt));
11088   TRANSACTION_EXPR_OUTER (stmt) = (flags & TM_STMT_ATTR_OUTER) != 0;
11089   TRANSACTION_EXPR_RELAXED (stmt) = (flags & TM_STMT_ATTR_RELAXED) != 0;
11090   TRANSACTION_EXPR_IS_STMT (stmt) = 1;
11091 
11092   /* noexcept specifications are not allowed for function transactions.  */
11093   gcc_assert (!(noex && compound_stmt));
11094   if (noex)
11095     {
11096       tree body = build_must_not_throw_expr (TRANSACTION_EXPR_BODY (stmt),
11097                                                        noex);
11098       protected_set_expr_location
11099           (body, EXPR_LOCATION (TRANSACTION_EXPR_BODY (stmt)));
11100       TREE_SIDE_EFFECTS (body) = 1;
11101       TRANSACTION_EXPR_BODY (stmt) = body;
11102     }
11103 
11104   if (compound_stmt)
11105     finish_compound_stmt (compound_stmt);
11106 }
11107 
11108 /* Build a __transaction_atomic or __transaction_relaxed expression.  If
11109    NOEX is non-NULL, we wrap the body in a MUST_NOT_THROW_EXPR with NOEX as
11110    condition.  */
11111 
11112 tree
build_transaction_expr(location_t loc,tree expr,int flags,tree noex)11113 build_transaction_expr (location_t loc, tree expr, int flags, tree noex)
11114 {
11115   tree ret;
11116   if (noex)
11117     {
11118       expr = build_must_not_throw_expr (expr, noex);
11119       protected_set_expr_location (expr, loc);
11120       TREE_SIDE_EFFECTS (expr) = 1;
11121     }
11122   ret = build1 (TRANSACTION_EXPR, TREE_TYPE (expr), expr);
11123   if (flags & TM_STMT_ATTR_RELAXED)
11124           TRANSACTION_EXPR_RELAXED (ret) = 1;
11125   TREE_SIDE_EFFECTS (ret) = 1;
11126   SET_EXPR_LOCATION (ret, loc);
11127   return ret;
11128 }
11129 
11130 void
init_cp_semantics(void)11131 init_cp_semantics (void)
11132 {
11133 }
11134 
11135 
11136 /* If we have a condition in conjunctive normal form (CNF), find the first
11137    failing clause.  In other words, given an expression like
11138 
11139      true && true && false && true && false
11140 
11141    return the first 'false'.  EXPR is the expression.  */
11142 
11143 static tree
find_failing_clause_r(tree expr)11144 find_failing_clause_r (tree expr)
11145 {
11146   if (TREE_CODE (expr) == TRUTH_ANDIF_EXPR)
11147     {
11148       /* First check the left side...  */
11149       tree e = find_failing_clause_r (TREE_OPERAND (expr, 0));
11150       if (e == NULL_TREE)
11151           /* ...if we didn't find a false clause, check the right side.  */
11152           e = find_failing_clause_r (TREE_OPERAND (expr, 1));
11153       return e;
11154     }
11155   tree e = contextual_conv_bool (expr, tf_none);
11156   e = fold_non_dependent_expr (e, tf_none, /*manifestly_const_eval=*/true);
11157   if (integer_zerop (e))
11158     /* This is the failing clause.  */
11159     return expr;
11160   return NULL_TREE;
11161 }
11162 
11163 /* Wrapper for find_failing_clause_r.  */
11164 
11165 static tree
find_failing_clause(tree expr)11166 find_failing_clause (tree expr)
11167 {
11168   if (TREE_CODE (expr) == TRUTH_ANDIF_EXPR)
11169     if (tree e = find_failing_clause_r (expr))
11170       expr = e;
11171   return expr;
11172 }
11173 
11174 /* Build a STATIC_ASSERT for a static assertion with the condition
11175    CONDITION and the message text MESSAGE.  LOCATION is the location
11176    of the static assertion in the source code.  When MEMBER_P, this
11177    static assertion is a member of a class.  If SHOW_EXPR_P is true,
11178    print the condition (because it was instantiation-dependent).  */
11179 
11180 void
finish_static_assert(tree condition,tree message,location_t location,bool member_p,bool show_expr_p)11181 finish_static_assert (tree condition, tree message, location_t location,
11182                           bool member_p, bool show_expr_p)
11183 {
11184   tsubst_flags_t complain = tf_warning_or_error;
11185 
11186   if (message == NULL_TREE
11187       || message == error_mark_node
11188       || condition == NULL_TREE
11189       || condition == error_mark_node)
11190     return;
11191 
11192   if (check_for_bare_parameter_packs (condition))
11193     condition = error_mark_node;
11194 
11195   if (instantiation_dependent_expression_p (condition))
11196     {
11197       /* We're in a template; build a STATIC_ASSERT and put it in
11198          the right place. */
11199       tree assertion;
11200 
11201       assertion = make_node (STATIC_ASSERT);
11202       STATIC_ASSERT_CONDITION (assertion) = condition;
11203       STATIC_ASSERT_MESSAGE (assertion) = message;
11204       STATIC_ASSERT_SOURCE_LOCATION (assertion) = location;
11205 
11206       if (member_p)
11207         maybe_add_class_template_decl_list (current_class_type,
11208                                             assertion,
11209                                             /*friend_p=*/0);
11210       else
11211         add_stmt (assertion);
11212 
11213       return;
11214     }
11215 
11216   /* Save the condition in case it was a concept check.  */
11217   tree orig_condition = condition;
11218 
11219   /* Fold the expression and convert it to a boolean value. */
11220   condition = contextual_conv_bool (condition, complain);
11221   condition = fold_non_dependent_expr (condition, complain,
11222                                                /*manifestly_const_eval=*/true);
11223 
11224   if (TREE_CODE (condition) == INTEGER_CST && !integer_zerop (condition))
11225     /* Do nothing; the condition is satisfied. */
11226     ;
11227   else
11228     {
11229       iloc_sentinel ils (location);
11230 
11231       if (integer_zerop (condition))
11232           {
11233             int sz = TREE_INT_CST_LOW (TYPE_SIZE_UNIT
11234                                              (TREE_TYPE (TREE_TYPE (message))));
11235             int len = TREE_STRING_LENGTH (message) / sz - 1;
11236 
11237             /* See if we can find which clause was failing (for logical AND).  */
11238             tree bad = find_failing_clause (orig_condition);
11239             /* If not, or its location is unusable, fall back to the previous
11240                location.  */
11241             location_t cloc = cp_expr_loc_or_loc (bad, location);
11242             /* Nobody wants to see the artificial (bool) cast.  */
11243             bad = tree_strip_nop_conversions (bad);
11244 
11245           /* Report the error. */
11246             if (len == 0)
11247               error_at (cloc, "static assertion failed");
11248             else
11249               error_at (cloc, "static assertion failed: %s",
11250                           TREE_STRING_POINTER (message));
11251 
11252             /* Actually explain the failure if this is a concept check or a
11253                requires-expression.  */
11254             if (concept_check_p (bad)
11255                 || TREE_CODE (bad) == REQUIRES_EXPR)
11256               diagnose_constraints (location, bad, NULL_TREE);
11257             else if (COMPARISON_CLASS_P (bad)
11258                        && ARITHMETIC_TYPE_P (TREE_TYPE (TREE_OPERAND (bad, 0))))
11259               {
11260                 tree op0 = fold_non_dependent_expr (TREE_OPERAND (bad, 0));
11261                 tree op1 = fold_non_dependent_expr (TREE_OPERAND (bad, 1));
11262                 tree cond = build2 (TREE_CODE (bad), boolean_type_node, op0, op1);
11263                 inform (cloc, "the comparison reduces to %qE", cond);
11264               }
11265             else if (show_expr_p)
11266               inform (cloc, "%qE evaluates to false", bad);
11267           }
11268       else if (condition && condition != error_mark_node)
11269           {
11270             error ("non-constant condition for static assertion");
11271             if (require_rvalue_constant_expression (condition))
11272               cxx_constant_value (condition);
11273           }
11274     }
11275 }
11276 
11277 /* Implements the C++0x decltype keyword. Returns the type of EXPR,
11278    suitable for use as a type-specifier.
11279 
11280    ID_EXPRESSION_OR_MEMBER_ACCESS_P is true when EXPR was parsed as an
11281    id-expression or a class member access, FALSE when it was parsed as
11282    a full expression.  */
11283 
11284 tree
finish_decltype_type(tree expr,bool id_expression_or_member_access_p,tsubst_flags_t complain)11285 finish_decltype_type (tree expr, bool id_expression_or_member_access_p,
11286                           tsubst_flags_t complain)
11287 {
11288   tree type = NULL_TREE;
11289 
11290   if (!expr || error_operand_p (expr))
11291     return error_mark_node;
11292 
11293   if (TYPE_P (expr)
11294       || TREE_CODE (expr) == TYPE_DECL
11295       || (TREE_CODE (expr) == BIT_NOT_EXPR
11296             && TYPE_P (TREE_OPERAND (expr, 0))))
11297     {
11298       if (complain & tf_error)
11299           error ("argument to %<decltype%> must be an expression");
11300       return error_mark_node;
11301     }
11302 
11303   /* decltype is an unevaluated context.  */
11304   cp_unevaluated u;
11305 
11306   processing_template_decl_sentinel ptds (/*reset=*/false);
11307 
11308   /* Depending on the resolution of DR 1172, we may later need to distinguish
11309      instantiation-dependent but not type-dependent expressions so that, say,
11310      A<decltype(sizeof(T))>::U doesn't require 'typename'.  */
11311   if (instantiation_dependent_uneval_expression_p (expr))
11312     {
11313       type = cxx_make_type (DECLTYPE_TYPE);
11314       DECLTYPE_TYPE_EXPR (type) = expr;
11315       DECLTYPE_TYPE_ID_EXPR_OR_MEMBER_ACCESS_P (type)
11316         = id_expression_or_member_access_p;
11317       SET_TYPE_STRUCTURAL_EQUALITY (type);
11318 
11319       return type;
11320     }
11321   else if (processing_template_decl)
11322     {
11323       expr = instantiate_non_dependent_expr_sfinae (expr, complain|tf_decltype);
11324       if (expr == error_mark_node)
11325           return error_mark_node;
11326       /* Keep processing_template_decl cleared for the rest of the function
11327            (for sake of the call to lvalue_kind below, which handles templated
11328            and non-templated COND_EXPR differently).  */
11329       processing_template_decl = 0;
11330     }
11331 
11332   /* The type denoted by decltype(e) is defined as follows:  */
11333 
11334   expr = resolve_nondeduced_context (expr, complain);
11335   if (!mark_single_function (expr, complain))
11336     return error_mark_node;
11337 
11338   if (invalid_nonstatic_memfn_p (input_location, expr, complain))
11339     return error_mark_node;
11340 
11341   if (type_unknown_p (expr))
11342     {
11343       if (complain & tf_error)
11344           error ("%<decltype%> cannot resolve address of overloaded function");
11345       return error_mark_node;
11346     }
11347 
11348   /* To get the size of a static data member declared as an array of
11349      unknown bound, we need to instantiate it.  */
11350   if (VAR_P (expr)
11351       && VAR_HAD_UNKNOWN_BOUND (expr)
11352       && DECL_TEMPLATE_INSTANTIATION (expr))
11353     instantiate_decl (expr, /*defer_ok*/true, /*expl_inst_mem*/false);
11354 
11355   if (id_expression_or_member_access_p)
11356     {
11357       /* If e is an id-expression or a class member access (5.2.5
11358          [expr.ref]), decltype(e) is defined as the type of the entity
11359          named by e. If there is no such entity, or e names a set of
11360          overloaded functions, the program is ill-formed.  */
11361       if (identifier_p (expr))
11362         expr = lookup_name (expr);
11363 
11364       if (INDIRECT_REF_P (expr)
11365             || TREE_CODE (expr) == VIEW_CONVERT_EXPR)
11366         /* This can happen when the expression is, e.g., "a.b". Just
11367            look at the underlying operand.  */
11368         expr = TREE_OPERAND (expr, 0);
11369 
11370       if (TREE_CODE (expr) == OFFSET_REF
11371           || TREE_CODE (expr) == MEMBER_REF
11372             || TREE_CODE (expr) == SCOPE_REF)
11373         /* We're only interested in the field itself. If it is a
11374            BASELINK, we will need to see through it in the next
11375            step.  */
11376         expr = TREE_OPERAND (expr, 1);
11377 
11378       if (BASELINK_P (expr))
11379         /* See through BASELINK nodes to the underlying function.  */
11380         expr = BASELINK_FUNCTIONS (expr);
11381 
11382       /* decltype of a decomposition name drops references in the tuple case
11383            (unlike decltype of a normal variable) and keeps cv-qualifiers from
11384            the containing object in the other cases (unlike decltype of a member
11385            access expression).  */
11386       if (DECL_DECOMPOSITION_P (expr))
11387           {
11388             if (DECL_HAS_VALUE_EXPR_P (expr))
11389               /* Expr is an array or struct subobject proxy, handle
11390                  bit-fields properly.  */
11391               return unlowered_expr_type (expr);
11392             else
11393               /* Expr is a reference variable for the tuple case.  */
11394               return lookup_decomp_type (expr);
11395           }
11396 
11397       switch (TREE_CODE (expr))
11398         {
11399         case FIELD_DECL:
11400           if (DECL_BIT_FIELD_TYPE (expr))
11401             {
11402               type = DECL_BIT_FIELD_TYPE (expr);
11403               break;
11404             }
11405           /* Fall through for fields that aren't bitfields.  */
11406             gcc_fallthrough ();
11407 
11408         case FUNCTION_DECL:
11409         case VAR_DECL:
11410         case CONST_DECL:
11411         case PARM_DECL:
11412         case RESULT_DECL:
11413         case TEMPLATE_PARM_INDEX:
11414             expr = mark_type_use (expr);
11415           type = TREE_TYPE (expr);
11416           break;
11417 
11418         case ERROR_MARK:
11419           type = error_mark_node;
11420           break;
11421 
11422         case COMPONENT_REF:
11423           case COMPOUND_EXPR:
11424             mark_type_use (expr);
11425           type = is_bitfield_expr_with_lowered_type (expr);
11426           if (!type)
11427             type = TREE_TYPE (TREE_OPERAND (expr, 1));
11428           break;
11429 
11430         case BIT_FIELD_REF:
11431           gcc_unreachable ();
11432 
11433         case INTEGER_CST:
11434           case PTRMEM_CST:
11435           /* We can get here when the id-expression refers to an
11436              enumerator or non-type template parameter.  */
11437           type = TREE_TYPE (expr);
11438           break;
11439 
11440         default:
11441             /* Handle instantiated template non-type arguments.  */
11442             type = TREE_TYPE (expr);
11443           break;
11444         }
11445     }
11446   else
11447     {
11448       /* Within a lambda-expression:
11449 
11450            Every occurrence of decltype((x)) where x is a possibly
11451            parenthesized id-expression that names an entity of
11452            automatic storage duration is treated as if x were
11453            transformed into an access to a corresponding data member
11454            of the closure type that would have been declared if x
11455            were a use of the denoted entity.  */
11456       if (outer_automatic_var_p (expr)
11457             && current_function_decl
11458             && LAMBDA_FUNCTION_P (current_function_decl))
11459           type = capture_decltype (expr);
11460       else if (error_operand_p (expr))
11461           type = error_mark_node;
11462       else if (expr == current_class_ptr)
11463           /* If the expression is just "this", we want the
11464              cv-unqualified pointer for the "this" type.  */
11465           type = TYPE_MAIN_VARIANT (TREE_TYPE (expr));
11466       else
11467           {
11468             /* Otherwise, where T is the type of e, if e is an lvalue,
11469                decltype(e) is defined as T&; if an xvalue, T&&; otherwise, T. */
11470             cp_lvalue_kind clk = lvalue_kind (expr);
11471             type = unlowered_expr_type (expr);
11472             gcc_assert (!TYPE_REF_P (type));
11473 
11474             /* For vector types, pick a non-opaque variant.  */
11475             if (VECTOR_TYPE_P (type))
11476               type = strip_typedefs (type);
11477 
11478             if (clk != clk_none && !(clk & clk_class))
11479               type = cp_build_reference_type (type, (clk & clk_rvalueref));
11480           }
11481     }
11482 
11483   return type;
11484 }
11485 
11486 /* Called from trait_expr_value to evaluate either __has_nothrow_assign or
11487    __has_nothrow_copy, depending on assign_p.  Returns true iff all
11488    the copy {ctor,assign} fns are nothrow.  */
11489 
11490 static bool
classtype_has_nothrow_assign_or_copy_p(tree type,bool assign_p)11491 classtype_has_nothrow_assign_or_copy_p (tree type, bool assign_p)
11492 {
11493   tree fns = NULL_TREE;
11494 
11495   if (assign_p || TYPE_HAS_COPY_CTOR (type))
11496     fns = get_class_binding (type, assign_p ? assign_op_identifier
11497                                    : ctor_identifier);
11498 
11499   bool saw_copy = false;
11500   for (ovl_iterator iter (fns); iter; ++iter)
11501     {
11502       tree fn = *iter;
11503 
11504       if (copy_fn_p (fn) > 0)
11505           {
11506             saw_copy = true;
11507             if (!maybe_instantiate_noexcept (fn)
11508                 || !TYPE_NOTHROW_P (TREE_TYPE (fn)))
11509               return false;
11510           }
11511     }
11512 
11513   return saw_copy;
11514 }
11515 
11516 /* Return true if DERIVED is pointer interconvertible base of BASE.  */
11517 
11518 static bool
pointer_interconvertible_base_of_p(tree base,tree derived)11519 pointer_interconvertible_base_of_p (tree base, tree derived)
11520 {
11521   if (base == error_mark_node || derived == error_mark_node)
11522     return false;
11523   base = TYPE_MAIN_VARIANT (base);
11524   derived = TYPE_MAIN_VARIANT (derived);
11525   if (!NON_UNION_CLASS_TYPE_P (base)
11526       || !NON_UNION_CLASS_TYPE_P (derived))
11527     return false;
11528 
11529   if (same_type_p (base, derived))
11530     return true;
11531 
11532   if (!std_layout_type_p (derived))
11533     return false;
11534 
11535   return uniquely_derived_from_p (base, derived);
11536 }
11537 
11538 /* Helper function for fold_builtin_is_pointer_inverconvertible_with_class,
11539    return true if MEMBERTYPE is the type of the first non-static data member
11540    of TYPE or for unions of any members.  */
11541 static bool
first_nonstatic_data_member_p(tree type,tree membertype)11542 first_nonstatic_data_member_p (tree type, tree membertype)
11543 {
11544   for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
11545     {
11546       if (TREE_CODE (field) != FIELD_DECL)
11547           continue;
11548       if (DECL_FIELD_IS_BASE (field) && is_empty_field (field))
11549           continue;
11550       if (DECL_FIELD_IS_BASE (field))
11551           return first_nonstatic_data_member_p (TREE_TYPE (field), membertype);
11552       if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
11553           {
11554             if ((TREE_CODE (TREE_TYPE (field)) == UNION_TYPE
11555                  || std_layout_type_p (TREE_TYPE (field)))
11556                 && first_nonstatic_data_member_p (TREE_TYPE (field), membertype))
11557               return true;
11558           }
11559       else if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (field),
11560                                                                         membertype))
11561           return true;
11562       if (TREE_CODE (type) != UNION_TYPE)
11563           return false;
11564     }
11565   return false;
11566 }
11567 
11568 /* Fold __builtin_is_pointer_interconvertible_with_class call.  */
11569 
11570 tree
fold_builtin_is_pointer_inverconvertible_with_class(location_t loc,int nargs,tree * args)11571 fold_builtin_is_pointer_inverconvertible_with_class (location_t loc, int nargs,
11572                                                                  tree *args)
11573 {
11574   /* Unless users call the builtin directly, the following 3 checks should be
11575      ensured from std::is_pointer_interconvertible_with_class function
11576      template.  */
11577   if (nargs != 1)
11578     {
11579       error_at (loc, "%<__builtin_is_pointer_interconvertible_with_class%> "
11580                          "needs a single argument");
11581       return boolean_false_node;
11582     }
11583   tree arg = args[0];
11584   if (error_operand_p (arg))
11585     return boolean_false_node;
11586   if (!TYPE_PTRMEM_P (TREE_TYPE (arg)))
11587     {
11588       error_at (loc, "%<__builtin_is_pointer_interconvertible_with_class%> "
11589                          "argument is not pointer to member");
11590       return boolean_false_node;
11591     }
11592 
11593   if (!TYPE_PTRDATAMEM_P (TREE_TYPE (arg)))
11594     return boolean_false_node;
11595 
11596   tree membertype = TREE_TYPE (TREE_TYPE (arg));
11597   tree basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (arg));
11598   if (!complete_type_or_else (basetype, NULL_TREE))
11599     return boolean_false_node;
11600 
11601   if (TREE_CODE (basetype) != UNION_TYPE
11602       && !std_layout_type_p (basetype))
11603     return boolean_false_node;
11604 
11605   if (!first_nonstatic_data_member_p (basetype, membertype))
11606     return boolean_false_node;
11607 
11608   if (TREE_CODE (arg) == PTRMEM_CST)
11609     arg = cplus_expand_constant (arg);
11610 
11611   if (integer_nonzerop (arg))
11612     return boolean_false_node;
11613   if (integer_zerop (arg))
11614     return boolean_true_node;
11615 
11616   return fold_build2 (EQ_EXPR, boolean_type_node, arg,
11617                           build_zero_cst (TREE_TYPE (arg)));
11618 }
11619 
11620 /* Helper function for is_corresponding_member_aggr.  Return true if
11621    MEMBERTYPE pointer-to-data-member ARG can be found in anonymous
11622    union or structure BASETYPE.  */
11623 
11624 static bool
is_corresponding_member_union(tree basetype,tree membertype,tree arg)11625 is_corresponding_member_union (tree basetype, tree membertype, tree arg)
11626 {
11627   for (tree field = TYPE_FIELDS (basetype); field; field = DECL_CHAIN (field))
11628     if (TREE_CODE (field) != FIELD_DECL || DECL_BIT_FIELD_TYPE (field))
11629       continue;
11630     else if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (field),
11631                                                                       membertype))
11632       {
11633           if (TREE_CODE (arg) != INTEGER_CST
11634               || tree_int_cst_equal (arg, byte_position (field)))
11635             return true;
11636       }
11637     else if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
11638       {
11639           tree narg = arg;
11640           if (TREE_CODE (basetype) != UNION_TYPE
11641               && TREE_CODE (narg) == INTEGER_CST)
11642             narg = size_binop (MINUS_EXPR, arg, byte_position (field));
11643           if (is_corresponding_member_union (TREE_TYPE (field),
11644                                                      membertype, narg))
11645             return true;
11646       }
11647   return false;
11648 }
11649 
11650 /* Helper function for fold_builtin_is_corresponding_member call.
11651    Return boolean_false_node if MEMBERTYPE1 BASETYPE1::*ARG1 and
11652    MEMBERTYPE2 BASETYPE2::*ARG2 aren't corresponding members,
11653    boolean_true_node if they are corresponding members, or for
11654    non-constant ARG2 the highest member offset for corresponding
11655    members.  */
11656 
11657 static tree
is_corresponding_member_aggr(location_t loc,tree basetype1,tree membertype1,tree arg1,tree basetype2,tree membertype2,tree arg2)11658 is_corresponding_member_aggr (location_t loc, tree basetype1, tree membertype1,
11659                                     tree arg1, tree basetype2, tree membertype2,
11660                                     tree arg2)
11661 {
11662   tree field1 = TYPE_FIELDS (basetype1);
11663   tree field2 = TYPE_FIELDS (basetype2);
11664   tree ret = boolean_false_node;
11665   while (1)
11666     {
11667       bool r = next_common_initial_sequence (field1, field2);
11668       if (field1 == NULL_TREE || field2 == NULL_TREE)
11669           break;
11670       if (r
11671             && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (field1),
11672                                                                       membertype1)
11673             && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (field2),
11674                                                                       membertype2))
11675           {
11676             tree pos = byte_position (field1);
11677             if (TREE_CODE (arg1) == INTEGER_CST
11678                 && tree_int_cst_equal (arg1, pos))
11679               {
11680                 if (TREE_CODE (arg2) == INTEGER_CST)
11681                     return boolean_true_node;
11682                 return pos;
11683               }
11684             else if (TREE_CODE (arg1) != INTEGER_CST)
11685               ret = pos;
11686           }
11687       else if (ANON_AGGR_TYPE_P (TREE_TYPE (field1))
11688                  && ANON_AGGR_TYPE_P (TREE_TYPE (field2)))
11689           {
11690             if ((!lookup_attribute ("no_unique_address",
11691                                           DECL_ATTRIBUTES (field1)))
11692                 != !lookup_attribute ("no_unique_address",
11693                                             DECL_ATTRIBUTES (field2)))
11694               break;
11695             if (!tree_int_cst_equal (bit_position (field1),
11696                                            bit_position (field2)))
11697               break;
11698             bool overlap = true;
11699             tree pos = byte_position (field1);
11700             if (TREE_CODE (arg1) == INTEGER_CST)
11701               {
11702                 tree off1 = fold_convert (sizetype, arg1);
11703                 tree sz1 = TYPE_SIZE_UNIT (TREE_TYPE (field1));
11704                 if (tree_int_cst_lt (off1, pos)
11705                       || tree_int_cst_le (size_binop (PLUS_EXPR, pos, sz1), off1))
11706                     overlap = false;
11707               }
11708             if (TREE_CODE (arg2) == INTEGER_CST)
11709               {
11710                 tree off2 = fold_convert (sizetype, arg2);
11711                 tree sz2 = TYPE_SIZE_UNIT (TREE_TYPE (field2));
11712                 if (tree_int_cst_lt (off2, pos)
11713                       || tree_int_cst_le (size_binop (PLUS_EXPR, pos, sz2), off2))
11714                     overlap = false;
11715               }
11716             if (overlap
11717                 && NON_UNION_CLASS_TYPE_P (TREE_TYPE (field1))
11718                 && NON_UNION_CLASS_TYPE_P (TREE_TYPE (field2)))
11719               {
11720                 tree narg1 = arg1;
11721                 if (TREE_CODE (arg1) == INTEGER_CST)
11722                     narg1 = size_binop (MINUS_EXPR,
11723                                             fold_convert (sizetype, arg1), pos);
11724                 tree narg2 = arg2;
11725                 if (TREE_CODE (arg2) == INTEGER_CST)
11726                     narg2 = size_binop (MINUS_EXPR,
11727                                             fold_convert (sizetype, arg2), pos);
11728                 tree t1 = TREE_TYPE (field1);
11729                 tree t2 = TREE_TYPE (field2);
11730                 tree nret = is_corresponding_member_aggr (loc, t1, membertype1,
11731                                                                       narg1, t2, membertype2,
11732                                                                       narg2);
11733                 if (nret != boolean_false_node)
11734                     {
11735                       if (nret == boolean_true_node)
11736                         return nret;
11737                       if (TREE_CODE (arg1) == INTEGER_CST)
11738                         return size_binop (PLUS_EXPR, nret, pos);
11739                       ret = size_binop (PLUS_EXPR, nret, pos);
11740                     }
11741               }
11742             else if (overlap
11743                        && TREE_CODE (TREE_TYPE (field1)) == UNION_TYPE
11744                        && TREE_CODE (TREE_TYPE (field2)) == UNION_TYPE)
11745               {
11746                 tree narg1 = arg1;
11747                 if (TREE_CODE (arg1) == INTEGER_CST)
11748                     narg1 = size_binop (MINUS_EXPR,
11749                                             fold_convert (sizetype, arg1), pos);
11750                 tree narg2 = arg2;
11751                 if (TREE_CODE (arg2) == INTEGER_CST)
11752                     narg2 = size_binop (MINUS_EXPR,
11753                                             fold_convert (sizetype, arg2), pos);
11754                 if (is_corresponding_member_union (TREE_TYPE (field1),
11755                                                              membertype1, narg1)
11756                       && is_corresponding_member_union (TREE_TYPE (field2),
11757                                                                 membertype2, narg2))
11758                     {
11759                       sorry_at (loc, "%<__builtin_is_corresponding_member%> "
11760                                          "not well defined for anonymous unions");
11761                       return boolean_false_node;
11762                     }
11763               }
11764           }
11765       if (!r)
11766           break;
11767       field1 = DECL_CHAIN (field1);
11768       field2 = DECL_CHAIN (field2);
11769     }
11770   return ret;
11771 }
11772 
11773 /* Fold __builtin_is_corresponding_member call.  */
11774 
11775 tree
fold_builtin_is_corresponding_member(location_t loc,int nargs,tree * args)11776 fold_builtin_is_corresponding_member (location_t loc, int nargs,
11777                                               tree *args)
11778 {
11779   /* Unless users call the builtin directly, the following 3 checks should be
11780      ensured from std::is_corresponding_member function template.  */
11781   if (nargs != 2)
11782     {
11783       error_at (loc, "%<__builtin_is_corresponding_member%> "
11784                          "needs two arguments");
11785       return boolean_false_node;
11786     }
11787   tree arg1 = args[0];
11788   tree arg2 = args[1];
11789   if (error_operand_p (arg1) || error_operand_p (arg2))
11790     return boolean_false_node;
11791   if (!TYPE_PTRMEM_P (TREE_TYPE (arg1))
11792       || !TYPE_PTRMEM_P (TREE_TYPE (arg2)))
11793     {
11794       error_at (loc, "%<__builtin_is_corresponding_member%> "
11795                          "argument is not pointer to member");
11796       return boolean_false_node;
11797     }
11798 
11799   if (!TYPE_PTRDATAMEM_P (TREE_TYPE (arg1))
11800       || !TYPE_PTRDATAMEM_P (TREE_TYPE (arg2)))
11801     return boolean_false_node;
11802 
11803   tree membertype1 = TREE_TYPE (TREE_TYPE (arg1));
11804   tree basetype1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (arg1));
11805   if (!complete_type_or_else (basetype1, NULL_TREE))
11806     return boolean_false_node;
11807 
11808   tree membertype2 = TREE_TYPE (TREE_TYPE (arg2));
11809   tree basetype2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (arg2));
11810   if (!complete_type_or_else (basetype2, NULL_TREE))
11811     return boolean_false_node;
11812 
11813   if (!NON_UNION_CLASS_TYPE_P (basetype1)
11814       || !NON_UNION_CLASS_TYPE_P (basetype2)
11815       || !std_layout_type_p (basetype1)
11816       || !std_layout_type_p (basetype2))
11817     return boolean_false_node;
11818 
11819   /* If the member types aren't layout compatible, then they
11820      can't be corresponding members.  */
11821   if (!layout_compatible_type_p (membertype1, membertype2))
11822     return boolean_false_node;
11823 
11824   if (TREE_CODE (arg1) == PTRMEM_CST)
11825     arg1 = cplus_expand_constant (arg1);
11826   if (TREE_CODE (arg2) == PTRMEM_CST)
11827     arg2 = cplus_expand_constant (arg2);
11828 
11829   if (null_member_pointer_value_p (arg1)
11830       || null_member_pointer_value_p (arg2))
11831     return boolean_false_node;
11832 
11833   if (TREE_CODE (arg1) == INTEGER_CST
11834       && TREE_CODE (arg2) == INTEGER_CST
11835       && !tree_int_cst_equal (arg1, arg2))
11836     return boolean_false_node;
11837 
11838   if (TREE_CODE (arg2) == INTEGER_CST
11839       && TREE_CODE (arg1) != INTEGER_CST)
11840     {
11841       std::swap (arg1, arg2);
11842       std::swap (membertype1, membertype2);
11843       std::swap (basetype1, basetype2);
11844     }
11845 
11846   tree ret = is_corresponding_member_aggr (loc, basetype1, membertype1, arg1,
11847                                                      basetype2, membertype2, arg2);
11848   if (TREE_TYPE (ret) == boolean_type_node)
11849     return ret;
11850   /* If both arg1 and arg2 are INTEGER_CSTs, is_corresponding_member_aggr
11851      already returns boolean_{true,false}_node whether those particular
11852      members are corresponding members or not.  Otherwise, if only
11853      one of them is INTEGER_CST (canonicalized to first being INTEGER_CST
11854      above), it returns boolean_false_node if it is certainly not a
11855      corresponding member and otherwise we need to do a runtime check that
11856      those two OFFSET_TYPE offsets are equal.
11857      If neither of the operands is INTEGER_CST, is_corresponding_member_aggr
11858      returns the largest offset at which the members would be corresponding
11859      members, so perform arg1 <= ret && arg1 == arg2 runtime check.  */
11860   gcc_assert (TREE_CODE (arg2) != INTEGER_CST);
11861   if (TREE_CODE (arg1) == INTEGER_CST)
11862     return fold_build2 (EQ_EXPR, boolean_type_node, arg1,
11863                               fold_convert (TREE_TYPE (arg1), arg2));
11864   ret = fold_build2 (LE_EXPR, boolean_type_node,
11865                          fold_convert (pointer_sized_int_node, arg1),
11866                          fold_convert (pointer_sized_int_node, ret));
11867   return fold_build2 (TRUTH_AND_EXPR, boolean_type_node, ret,
11868                           fold_build2 (EQ_EXPR, boolean_type_node, arg1,
11869                                            fold_convert (TREE_TYPE (arg1), arg2)));
11870 }
11871 
11872 /* Actually evaluates the trait.  */
11873 
11874 static bool
trait_expr_value(cp_trait_kind kind,tree type1,tree type2)11875 trait_expr_value (cp_trait_kind kind, tree type1, tree type2)
11876 {
11877   enum tree_code type_code1;
11878   tree t;
11879 
11880   type_code1 = TREE_CODE (type1);
11881 
11882   switch (kind)
11883     {
11884     case CPTK_HAS_NOTHROW_ASSIGN:
11885       type1 = strip_array_types (type1);
11886       return (!CP_TYPE_CONST_P (type1) && type_code1 != REFERENCE_TYPE
11887                 && (trait_expr_value (CPTK_HAS_TRIVIAL_ASSIGN, type1, type2)
11888                       || (CLASS_TYPE_P (type1)
11889                           && classtype_has_nothrow_assign_or_copy_p (type1,
11890                                                                                  true))));
11891 
11892     case CPTK_HAS_TRIVIAL_ASSIGN:
11893       /* ??? The standard seems to be missing the "or array of such a class
11894            type" wording for this trait.  */
11895       type1 = strip_array_types (type1);
11896       return (!CP_TYPE_CONST_P (type1) && type_code1 != REFERENCE_TYPE
11897                 && (trivial_type_p (type1)
11898                         || (CLASS_TYPE_P (type1)
11899                               && TYPE_HAS_TRIVIAL_COPY_ASSIGN (type1))));
11900 
11901     case CPTK_HAS_NOTHROW_CONSTRUCTOR:
11902       type1 = strip_array_types (type1);
11903       return (trait_expr_value (CPTK_HAS_TRIVIAL_CONSTRUCTOR, type1, type2)
11904                 || (CLASS_TYPE_P (type1)
11905                       && (t = locate_ctor (type1))
11906                       && maybe_instantiate_noexcept (t)
11907                       && TYPE_NOTHROW_P (TREE_TYPE (t))));
11908 
11909     case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
11910       type1 = strip_array_types (type1);
11911       return (trivial_type_p (type1)
11912                 || (CLASS_TYPE_P (type1) && TYPE_HAS_TRIVIAL_DFLT (type1)));
11913 
11914     case CPTK_HAS_NOTHROW_COPY:
11915       type1 = strip_array_types (type1);
11916       return (trait_expr_value (CPTK_HAS_TRIVIAL_COPY, type1, type2)
11917                 || (CLASS_TYPE_P (type1)
11918                       && classtype_has_nothrow_assign_or_copy_p (type1, false)));
11919 
11920     case CPTK_HAS_TRIVIAL_COPY:
11921       /* ??? The standard seems to be missing the "or array of such a class
11922            type" wording for this trait.  */
11923       type1 = strip_array_types (type1);
11924       return (trivial_type_p (type1) || type_code1 == REFERENCE_TYPE
11925                 || (CLASS_TYPE_P (type1) && TYPE_HAS_TRIVIAL_COPY_CTOR (type1)));
11926 
11927     case CPTK_HAS_TRIVIAL_DESTRUCTOR:
11928       type1 = strip_array_types (type1);
11929       return (trivial_type_p (type1) || type_code1 == REFERENCE_TYPE
11930                 || (CLASS_TYPE_P (type1)
11931                       && TYPE_HAS_TRIVIAL_DESTRUCTOR (type1)));
11932 
11933     case CPTK_HAS_VIRTUAL_DESTRUCTOR:
11934       return type_has_virtual_destructor (type1);
11935 
11936     case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS:
11937       return type_has_unique_obj_representations (type1);
11938 
11939     case CPTK_IS_ABSTRACT:
11940       return ABSTRACT_CLASS_TYPE_P (type1);
11941 
11942     case CPTK_IS_AGGREGATE:
11943       return CP_AGGREGATE_TYPE_P (type1);
11944 
11945     case CPTK_IS_BASE_OF:
11946       return (NON_UNION_CLASS_TYPE_P (type1) && NON_UNION_CLASS_TYPE_P (type2)
11947                 && (same_type_ignoring_top_level_qualifiers_p (type1, type2)
11948                       || DERIVED_FROM_P (type1, type2)));
11949 
11950     case CPTK_IS_CLASS:
11951       return NON_UNION_CLASS_TYPE_P (type1);
11952 
11953     case CPTK_IS_EMPTY:
11954       return NON_UNION_CLASS_TYPE_P (type1) && CLASSTYPE_EMPTY_P (type1);
11955 
11956     case CPTK_IS_ENUM:
11957       return type_code1 == ENUMERAL_TYPE;
11958 
11959     case CPTK_IS_FINAL:
11960       return CLASS_TYPE_P (type1) && CLASSTYPE_FINAL (type1);
11961 
11962     case CPTK_IS_LAYOUT_COMPATIBLE:
11963       return layout_compatible_type_p (type1, type2);
11964 
11965     case CPTK_IS_LITERAL_TYPE:
11966       return literal_type_p (type1);
11967 
11968     case CPTK_IS_POINTER_INTERCONVERTIBLE_BASE_OF:
11969       return pointer_interconvertible_base_of_p (type1, type2);
11970 
11971     case CPTK_IS_POD:
11972       return pod_type_p (type1);
11973 
11974     case CPTK_IS_POLYMORPHIC:
11975       return CLASS_TYPE_P (type1) && TYPE_POLYMORPHIC_P (type1);
11976 
11977     case CPTK_IS_SAME_AS:
11978       return same_type_p (type1, type2);
11979 
11980     case CPTK_IS_STD_LAYOUT:
11981       return std_layout_type_p (type1);
11982 
11983     case CPTK_IS_TRIVIAL:
11984       return trivial_type_p (type1);
11985 
11986     case CPTK_IS_TRIVIALLY_ASSIGNABLE:
11987       return is_trivially_xible (MODIFY_EXPR, type1, type2);
11988 
11989     case CPTK_IS_TRIVIALLY_CONSTRUCTIBLE:
11990       return is_trivially_xible (INIT_EXPR, type1, type2);
11991 
11992     case CPTK_IS_TRIVIALLY_COPYABLE:
11993       return trivially_copyable_p (type1);
11994 
11995     case CPTK_IS_UNION:
11996       return type_code1 == UNION_TYPE;
11997 
11998     case CPTK_IS_ASSIGNABLE:
11999       return is_xible (MODIFY_EXPR, type1, type2);
12000 
12001     case CPTK_IS_CONSTRUCTIBLE:
12002       return is_xible (INIT_EXPR, type1, type2);
12003 
12004     case CPTK_IS_NOTHROW_ASSIGNABLE:
12005       return is_nothrow_xible (MODIFY_EXPR, type1, type2);
12006 
12007     case CPTK_IS_NOTHROW_CONSTRUCTIBLE:
12008       return is_nothrow_xible (INIT_EXPR, type1, type2);
12009 
12010     default:
12011       gcc_unreachable ();
12012       return false;
12013     }
12014 }
12015 
12016 /* If TYPE is an array of unknown bound, or (possibly cv-qualified)
12017    void, or a complete type, returns true, otherwise false.  */
12018 
12019 static bool
check_trait_type(tree type)12020 check_trait_type (tree type)
12021 {
12022   if (type == NULL_TREE)
12023     return true;
12024 
12025   if (TREE_CODE (type) == TREE_LIST)
12026     return (check_trait_type (TREE_VALUE (type))
12027               && check_trait_type (TREE_CHAIN (type)));
12028 
12029   if (TREE_CODE (type) == ARRAY_TYPE && !TYPE_DOMAIN (type)
12030       && COMPLETE_TYPE_P (TREE_TYPE (type)))
12031     return true;
12032 
12033   if (VOID_TYPE_P (type))
12034     return true;
12035 
12036   return !!complete_type_or_else (strip_array_types (type), NULL_TREE);
12037 }
12038 
12039 /* True iff the conversion (if any) would be a direct reference
12040    binding, not requiring complete types.  This is LWG2939.  */
12041 
12042 static bool
same_type_ref_bind_p(cp_trait_kind kind,tree type1,tree type2)12043 same_type_ref_bind_p (cp_trait_kind kind, tree type1, tree type2)
12044 {
12045   tree from, to;
12046   switch (kind)
12047     {
12048       /* These put the target type first.  */
12049     case CPTK_IS_CONSTRUCTIBLE:
12050     case CPTK_IS_NOTHROW_CONSTRUCTIBLE:
12051     case CPTK_IS_TRIVIALLY_CONSTRUCTIBLE:
12052       to = type1;
12053       from = type2;
12054       break;
12055 
12056     default:
12057       gcc_unreachable ();
12058     }
12059 
12060   if (TREE_CODE (to) != REFERENCE_TYPE || !from)
12061     return false;
12062   if (TREE_CODE (from) == TREE_VEC && TREE_VEC_LENGTH (from) == 1)
12063     from = TREE_VEC_ELT (from, 0);
12064   else if (TREE_CODE (from) == TREE_LIST && !TREE_CHAIN (from))
12065     from = TREE_VALUE (from);
12066   return (TYPE_P (from)
12067             && (same_type_ignoring_top_level_qualifiers_p
12068                 (non_reference (to), non_reference (from))));
12069 }
12070 
12071 /* Process a trait expression.  */
12072 
12073 tree
finish_trait_expr(location_t loc,cp_trait_kind kind,tree type1,tree type2)12074 finish_trait_expr (location_t loc, cp_trait_kind kind, tree type1, tree type2)
12075 {
12076   if (type1 == error_mark_node
12077       || type2 == error_mark_node)
12078     return error_mark_node;
12079 
12080   if (processing_template_decl)
12081     {
12082       tree trait_expr = make_node (TRAIT_EXPR);
12083       TREE_TYPE (trait_expr) = boolean_type_node;
12084       TRAIT_EXPR_TYPE1 (trait_expr) = type1;
12085       TRAIT_EXPR_TYPE2 (trait_expr) = type2;
12086       TRAIT_EXPR_KIND (trait_expr) = kind;
12087       TRAIT_EXPR_LOCATION (trait_expr) = loc;
12088       return trait_expr;
12089     }
12090 
12091   switch (kind)
12092     {
12093     case CPTK_HAS_NOTHROW_ASSIGN:
12094     case CPTK_HAS_TRIVIAL_ASSIGN:
12095     case CPTK_HAS_NOTHROW_CONSTRUCTOR:
12096     case CPTK_HAS_TRIVIAL_CONSTRUCTOR:
12097     case CPTK_HAS_NOTHROW_COPY:
12098     case CPTK_HAS_TRIVIAL_COPY:
12099     case CPTK_HAS_TRIVIAL_DESTRUCTOR:
12100     case CPTK_HAS_UNIQUE_OBJ_REPRESENTATIONS:
12101     case CPTK_HAS_VIRTUAL_DESTRUCTOR:
12102     case CPTK_IS_ABSTRACT:
12103     case CPTK_IS_AGGREGATE:
12104     case CPTK_IS_EMPTY:
12105     case CPTK_IS_FINAL:
12106     case CPTK_IS_LITERAL_TYPE:
12107     case CPTK_IS_POD:
12108     case CPTK_IS_POLYMORPHIC:
12109     case CPTK_IS_STD_LAYOUT:
12110     case CPTK_IS_TRIVIAL:
12111     case CPTK_IS_TRIVIALLY_COPYABLE:
12112       if (!check_trait_type (type1))
12113           return error_mark_node;
12114       break;
12115 
12116     case CPTK_IS_ASSIGNABLE:
12117     case CPTK_IS_CONSTRUCTIBLE:
12118       break;
12119 
12120     case CPTK_IS_TRIVIALLY_CONSTRUCTIBLE:
12121     case CPTK_IS_NOTHROW_CONSTRUCTIBLE:
12122       /* Don't check completeness for direct reference binding.  */;
12123       if (same_type_ref_bind_p (kind, type1, type2))
12124           break;
12125       gcc_fallthrough ();
12126 
12127     case CPTK_IS_NOTHROW_ASSIGNABLE:
12128     case CPTK_IS_TRIVIALLY_ASSIGNABLE:
12129       if (!check_trait_type (type1)
12130             || !check_trait_type (type2))
12131           return error_mark_node;
12132       break;
12133 
12134     case CPTK_IS_BASE_OF:
12135     case CPTK_IS_POINTER_INTERCONVERTIBLE_BASE_OF:
12136       if (NON_UNION_CLASS_TYPE_P (type1) && NON_UNION_CLASS_TYPE_P (type2)
12137             && !same_type_ignoring_top_level_qualifiers_p (type1, type2)
12138             && !complete_type_or_else (type2, NULL_TREE))
12139           /* We already issued an error.  */
12140           return error_mark_node;
12141       break;
12142 
12143     case CPTK_IS_CLASS:
12144     case CPTK_IS_ENUM:
12145     case CPTK_IS_UNION:
12146     case CPTK_IS_SAME_AS:
12147       break;
12148 
12149     case CPTK_IS_LAYOUT_COMPATIBLE:
12150       if (!array_of_unknown_bound_p (type1)
12151             && TREE_CODE (type1) != VOID_TYPE
12152             && !complete_type_or_else (type1, NULL_TREE))
12153           /* We already issued an error.  */
12154           return error_mark_node;
12155       if (!array_of_unknown_bound_p (type2)
12156             && TREE_CODE (type2) != VOID_TYPE
12157             && !complete_type_or_else (type2, NULL_TREE))
12158           /* We already issued an error.  */
12159           return error_mark_node;
12160       break;
12161 
12162     default:
12163       gcc_unreachable ();
12164     }
12165 
12166   tree val = (trait_expr_value (kind, type1, type2)
12167                 ? boolean_true_node : boolean_false_node);
12168   return maybe_wrap_with_location (val, loc);
12169 }
12170 
12171 /* Do-nothing variants of functions to handle pragma FLOAT_CONST_DECIMAL64,
12172    which is ignored for C++.  */
12173 
12174 void
set_float_const_decimal64(void)12175 set_float_const_decimal64 (void)
12176 {
12177 }
12178 
12179 void
clear_float_const_decimal64(void)12180 clear_float_const_decimal64 (void)
12181 {
12182 }
12183 
12184 bool
float_const_decimal64_p(void)12185 float_const_decimal64_p (void)
12186 {
12187   return 0;
12188 }
12189 
12190 
12191 /* Return true if T designates the implied `this' parameter.  */
12192 
12193 bool
is_this_parameter(tree t)12194 is_this_parameter (tree t)
12195 {
12196   if (!DECL_P (t) || DECL_NAME (t) != this_identifier)
12197     return false;
12198   gcc_assert (TREE_CODE (t) == PARM_DECL
12199                 || (TREE_CODE (t) == VAR_DECL && DECL_HAS_VALUE_EXPR_P (t))
12200                 || (cp_binding_oracle && TREE_CODE (t) == VAR_DECL));
12201   return true;
12202 }
12203 
12204 /* Insert the deduced return type for an auto function.  */
12205 
12206 void
apply_deduced_return_type(tree fco,tree return_type)12207 apply_deduced_return_type (tree fco, tree return_type)
12208 {
12209   tree result;
12210 
12211   if (return_type == error_mark_node)
12212     return;
12213 
12214   if (DECL_CONV_FN_P (fco))
12215     DECL_NAME (fco) = make_conv_op_name (return_type);
12216 
12217   TREE_TYPE (fco) = change_return_type (return_type, TREE_TYPE (fco));
12218 
12219   result = DECL_RESULT (fco);
12220   if (result == NULL_TREE)
12221     return;
12222   if (TREE_TYPE (result) == return_type)
12223     return;
12224 
12225   if (!processing_template_decl && !VOID_TYPE_P (return_type)
12226       && !complete_type_or_else (return_type, NULL_TREE))
12227     return;
12228 
12229   /* We already have a DECL_RESULT from start_preparsed_function.
12230      Now we need to redo the work it and allocate_struct_function
12231      did to reflect the new type.  */
12232   gcc_assert (current_function_decl == fco);
12233   result = build_decl (input_location, RESULT_DECL, NULL_TREE,
12234                            TYPE_MAIN_VARIANT (return_type));
12235   DECL_ARTIFICIAL (result) = 1;
12236   DECL_IGNORED_P (result) = 1;
12237   cp_apply_type_quals_to_decl (cp_type_quals (return_type),
12238                                result);
12239 
12240   DECL_RESULT (fco) = result;
12241 
12242   if (!processing_template_decl)
12243     {
12244       bool aggr = aggregate_value_p (result, fco);
12245 #ifdef PCC_STATIC_STRUCT_RETURN
12246       cfun->returns_pcc_struct = aggr;
12247 #endif
12248       cfun->returns_struct = aggr;
12249     }
12250 }
12251 
12252 /* DECL is a local variable or parameter from the surrounding scope of a
12253    lambda-expression.  Returns the decltype for a use of the capture field
12254    for DECL even if it hasn't been captured yet.  */
12255 
12256 static tree
capture_decltype(tree decl)12257 capture_decltype (tree decl)
12258 {
12259   tree lam = CLASSTYPE_LAMBDA_EXPR (DECL_CONTEXT (current_function_decl));
12260   tree cap = lookup_name (DECL_NAME (decl), LOOK_where::BLOCK,
12261                                 LOOK_want::HIDDEN_LAMBDA);
12262   tree type;
12263 
12264   if (cap && is_capture_proxy (cap))
12265     type = TREE_TYPE (cap);
12266   else
12267     switch (LAMBDA_EXPR_DEFAULT_CAPTURE_MODE (lam))
12268       {
12269       case CPLD_NONE:
12270           error ("%qD is not captured", decl);
12271           return error_mark_node;
12272 
12273       case CPLD_COPY:
12274           type = TREE_TYPE (decl);
12275           if (TYPE_REF_P (type)
12276               && TREE_CODE (TREE_TYPE (type)) != FUNCTION_TYPE)
12277             type = TREE_TYPE (type);
12278           break;
12279 
12280       case CPLD_REFERENCE:
12281           type = TREE_TYPE (decl);
12282           if (!TYPE_REF_P (type))
12283             type = build_reference_type (TREE_TYPE (decl));
12284           break;
12285 
12286       default:
12287           gcc_unreachable ();
12288       }
12289 
12290   if (!TYPE_REF_P (type))
12291     {
12292       if (!LAMBDA_EXPR_MUTABLE_P (lam))
12293           type = cp_build_qualified_type (type, (cp_type_quals (type)
12294                                                          |TYPE_QUAL_CONST));
12295       type = build_reference_type (type);
12296     }
12297   return type;
12298 }
12299 
12300 /* Build a unary fold expression of EXPR over OP. If IS_RIGHT is true,
12301    this is a right unary fold. Otherwise it is a left unary fold. */
12302 
12303 static tree
finish_unary_fold_expr(tree expr,int op,tree_code dir)12304 finish_unary_fold_expr (tree expr, int op, tree_code dir)
12305 {
12306   /* Build a pack expansion (assuming expr has pack type).  */
12307   if (!uses_parameter_packs (expr))
12308     {
12309       error_at (location_of (expr), "operand of fold expression has no "
12310                     "unexpanded parameter packs");
12311       return error_mark_node;
12312     }
12313   tree pack = make_pack_expansion (expr);
12314 
12315   /* Build the fold expression.  */
12316   tree code = build_int_cstu (integer_type_node, abs (op));
12317   tree fold = build_min_nt_loc (input_location, dir, code, pack);
12318   FOLD_EXPR_MODIFY_P (fold) = (op < 0);
12319   TREE_TYPE (fold) = build_dependent_operator_type (NULL_TREE,
12320                                                                 FOLD_EXPR_OP (fold),
12321                                                                 FOLD_EXPR_MODIFY_P (fold));
12322   return fold;
12323 }
12324 
12325 tree
finish_left_unary_fold_expr(tree expr,int op)12326 finish_left_unary_fold_expr (tree expr, int op)
12327 {
12328   return finish_unary_fold_expr (expr, op, UNARY_LEFT_FOLD_EXPR);
12329 }
12330 
12331 tree
finish_right_unary_fold_expr(tree expr,int op)12332 finish_right_unary_fold_expr (tree expr, int op)
12333 {
12334   return finish_unary_fold_expr (expr, op, UNARY_RIGHT_FOLD_EXPR);
12335 }
12336 
12337 /* Build a binary fold expression over EXPR1 and EXPR2. The
12338    associativity of the fold is determined by EXPR1 and EXPR2 (whichever
12339    has an unexpanded parameter pack). */
12340 
12341 tree
finish_binary_fold_expr(tree pack,tree init,int op,tree_code dir)12342 finish_binary_fold_expr (tree pack, tree init, int op, tree_code dir)
12343 {
12344   pack = make_pack_expansion (pack);
12345   tree code = build_int_cstu (integer_type_node, abs (op));
12346   tree fold = build_min_nt_loc (input_location, dir, code, pack, init);
12347   FOLD_EXPR_MODIFY_P (fold) = (op < 0);
12348   TREE_TYPE (fold) = build_dependent_operator_type (NULL_TREE,
12349                                                                 FOLD_EXPR_OP (fold),
12350                                                                 FOLD_EXPR_MODIFY_P (fold));
12351   return fold;
12352 }
12353 
12354 tree
finish_binary_fold_expr(tree expr1,tree expr2,int op)12355 finish_binary_fold_expr (tree expr1, tree expr2, int op)
12356 {
12357   // Determine which expr has an unexpanded parameter pack and
12358   // set the pack and initial term.
12359   bool pack1 = uses_parameter_packs (expr1);
12360   bool pack2 = uses_parameter_packs (expr2);
12361   if (pack1 && !pack2)
12362     return finish_binary_fold_expr (expr1, expr2, op, BINARY_RIGHT_FOLD_EXPR);
12363   else if (pack2 && !pack1)
12364     return finish_binary_fold_expr (expr2, expr1, op, BINARY_LEFT_FOLD_EXPR);
12365   else
12366     {
12367       if (pack1)
12368         error ("both arguments in binary fold have unexpanded parameter packs");
12369       else
12370         error ("no unexpanded parameter packs in binary fold");
12371     }
12372   return error_mark_node;
12373 }
12374 
12375 /* Finish __builtin_launder (arg).  */
12376 
12377 tree
finish_builtin_launder(location_t loc,tree arg,tsubst_flags_t complain)12378 finish_builtin_launder (location_t loc, tree arg, tsubst_flags_t complain)
12379 {
12380   tree orig_arg = arg;
12381   if (!type_dependent_expression_p (arg))
12382     arg = decay_conversion (arg, complain);
12383   if (error_operand_p (arg))
12384     return error_mark_node;
12385   if (!type_dependent_expression_p (arg)
12386       && !TYPE_PTR_P (TREE_TYPE (arg)))
12387     {
12388       error_at (loc, "non-pointer argument to %<__builtin_launder%>");
12389       return error_mark_node;
12390     }
12391   if (processing_template_decl)
12392     arg = orig_arg;
12393   return build_call_expr_internal_loc (loc, IFN_LAUNDER,
12394                                                TREE_TYPE (arg), 1, arg);
12395 }
12396 
12397 /* Finish __builtin_convertvector (arg, type).  */
12398 
12399 tree
cp_build_vec_convert(tree arg,location_t loc,tree type,tsubst_flags_t complain)12400 cp_build_vec_convert (tree arg, location_t loc, tree type,
12401                           tsubst_flags_t complain)
12402 {
12403   if (error_operand_p (type))
12404     return error_mark_node;
12405   if (error_operand_p (arg))
12406     return error_mark_node;
12407 
12408   tree ret = NULL_TREE;
12409   if (!type_dependent_expression_p (arg) && !dependent_type_p (type))
12410     ret = c_build_vec_convert (cp_expr_loc_or_input_loc (arg),
12411                                      decay_conversion (arg, complain),
12412                                      loc, type, (complain & tf_error) != 0);
12413 
12414   if (!processing_template_decl)
12415     return ret;
12416 
12417   return build_call_expr_internal_loc (loc, IFN_VEC_CONVERT, type, 1, arg);
12418 }
12419 
12420 /* Finish __builtin_bit_cast (type, arg).  */
12421 
12422 tree
cp_build_bit_cast(location_t loc,tree type,tree arg,tsubst_flags_t complain)12423 cp_build_bit_cast (location_t loc, tree type, tree arg,
12424                        tsubst_flags_t complain)
12425 {
12426   if (error_operand_p (type))
12427     return error_mark_node;
12428   if (!dependent_type_p (type))
12429     {
12430       if (!complete_type_or_maybe_complain (type, NULL_TREE, complain))
12431           return error_mark_node;
12432       if (TREE_CODE (type) == ARRAY_TYPE)
12433           {
12434             /* std::bit_cast for destination ARRAY_TYPE is not possible,
12435                as functions may not return an array, so don't bother trying
12436                to support this (and then deal with VLAs etc.).  */
12437             error_at (loc, "%<__builtin_bit_cast%> destination type %qT "
12438                                "is an array type", type);
12439             return error_mark_node;
12440           }
12441       if (!trivially_copyable_p (type))
12442           {
12443             error_at (loc, "%<__builtin_bit_cast%> destination type %qT "
12444                                "is not trivially copyable", type);
12445             return error_mark_node;
12446           }
12447     }
12448 
12449   if (error_operand_p (arg))
12450     return error_mark_node;
12451 
12452   if (!type_dependent_expression_p (arg))
12453     {
12454       if (TREE_CODE (TREE_TYPE (arg)) == ARRAY_TYPE)
12455           {
12456             /* Don't perform array-to-pointer conversion.  */
12457             arg = mark_rvalue_use (arg, loc, true);
12458             if (!complete_type_or_maybe_complain (TREE_TYPE (arg), arg, complain))
12459               return error_mark_node;
12460           }
12461       else
12462           arg = decay_conversion (arg, complain);
12463 
12464       if (error_operand_p (arg))
12465           return error_mark_node;
12466 
12467       if (!trivially_copyable_p (TREE_TYPE (arg)))
12468           {
12469             error_at (cp_expr_loc_or_loc (arg, loc),
12470                         "%<__builtin_bit_cast%> source type %qT "
12471                         "is not trivially copyable", TREE_TYPE (arg));
12472             return error_mark_node;
12473           }
12474       if (!dependent_type_p (type)
12475             && !cp_tree_equal (TYPE_SIZE_UNIT (type),
12476                                    TYPE_SIZE_UNIT (TREE_TYPE (arg))))
12477           {
12478             error_at (loc, "%<__builtin_bit_cast%> source size %qE "
12479                                "not equal to destination type size %qE",
12480                                TYPE_SIZE_UNIT (TREE_TYPE (arg)),
12481                                TYPE_SIZE_UNIT (type));
12482             return error_mark_node;
12483           }
12484     }
12485 
12486   tree ret = build_min (BIT_CAST_EXPR, type, arg);
12487   SET_EXPR_LOCATION (ret, loc);
12488 
12489   if (!processing_template_decl && CLASS_TYPE_P (type))
12490     ret = get_target_expr_sfinae (ret, complain);
12491 
12492   return ret;
12493 }
12494 
12495 #include "gt-cp-semantics.h"
12496