Line data Source code
1 : // Copyright (C) 2020-2026 Free Software Foundation, Inc.
2 :
3 : // This file is part of GCC.
4 :
5 : // GCC is free software; you can redistribute it and/or modify it under
6 : // the terms of the GNU General Public License as published by the Free
7 : // Software Foundation; either version 3, or (at your option) any later
8 : // version.
9 :
10 : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 : // for more details.
14 :
15 : // You should have received a copy of the GNU General Public License
16 : // along with GCC; see the file COPYING3. If not see
17 : // <http://www.gnu.org/licenses/>.
18 :
19 : #include "rust-tree.h"
20 : #include "fold-const.h"
21 : #include "stringpool.h"
22 : #include "attribs.h"
23 : #include "escaped_string.h"
24 : #include "libiberty.h"
25 : #include "stor-layout.h"
26 : #include "hash-map.h"
27 : #include "diagnostic.h"
28 : #include "timevar.h"
29 : #include "convert.h"
30 : #include "gimple-expr.h"
31 : #include "gimplify.h"
32 : #include "function.h"
33 : #include "gcc-rich-location.h"
34 : #include "target.h"
35 : #include "file-prefix-map.h"
36 : #include "cgraph.h"
37 : #include "output.h"
38 : #include "memmodel.h"
39 : #include "tm_p.h"
40 :
41 : // forked from gcc/c-family/c-common.cc c_global_trees
42 : tree c_global_trees[CTI_MAX];
43 : // forked from gcc/cp/decl.cc cp_global_trees
44 : tree cp_global_trees[CPTI_MAX];
45 :
46 : struct saved_scope *scope_chain;
47 :
48 : namespace Rust {
49 :
50 : void
51 1226 : mark_exp_read (tree exp)
52 : {
53 1226 : char tmp_name[32];
54 1226 : ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lsrc_loc", 1);
55 :
56 1226 : if (exp == NULL)
57 0 : return;
58 :
59 1226 : switch (TREE_CODE (exp))
60 : {
61 1209 : case VAR_DECL:
62 1209 : gcc_fallthrough ();
63 1209 : case PARM_DECL:
64 1209 : DECL_READ_P (exp) = 1;
65 1209 : break;
66 16 : case ARRAY_REF:
67 16 : case COMPONENT_REF:
68 16 : case MODIFY_EXPR:
69 16 : case REALPART_EXPR:
70 16 : case IMAGPART_EXPR:
71 16 : CASE_CONVERT:
72 16 : case ADDR_EXPR:
73 16 : case INDIRECT_REF:
74 16 : case FLOAT_EXPR:
75 16 : case VIEW_CONVERT_EXPR:
76 16 : mark_exp_read (TREE_OPERAND (exp, 0));
77 16 : break;
78 0 : case COMPOUND_EXPR:
79 0 : mark_exp_read (TREE_OPERAND (exp, 1));
80 0 : break;
81 0 : case COND_EXPR:
82 0 : if (TREE_OPERAND (exp, 1))
83 0 : mark_exp_read (TREE_OPERAND (exp, 1));
84 0 : if (TREE_OPERAND (exp, 2))
85 0 : mark_exp_read (TREE_OPERAND (exp, 2));
86 : break;
87 : default:
88 : break;
89 : }
90 : }
91 :
92 : tree
93 0 : convert_from_reference (tree val)
94 : {
95 0 : if (TREE_TYPE (val) && TYPE_REF_P (TREE_TYPE (val)))
96 : {
97 0 : tree t = TREE_TYPE (TREE_TYPE (val));
98 0 : tree ref = build1 (INDIRECT_REF, t, val);
99 :
100 0 : mark_exp_read (val);
101 :
102 0 : TREE_SIDE_EFFECTS (ref)
103 0 : = (TREE_THIS_VOLATILE (ref) || TREE_SIDE_EFFECTS (val));
104 0 : val = ref;
105 : }
106 :
107 0 : return val;
108 : }
109 :
110 : tree
111 1210 : mark_use (tree expr, bool rvalue_p, bool read_p,
112 : location_t loc /* = UNKNOWN_LOCATION */,
113 : bool reject_builtin /* = true */)
114 : {
115 : #define RECUR(t) mark_use ((t), rvalue_p, read_p, loc, reject_builtin)
116 :
117 1210 : if (expr == NULL_TREE || error_operand_p (expr))
118 : return expr;
119 :
120 1210 : if (reject_builtin)
121 0 : return error_mark_node;
122 :
123 1210 : if (read_p)
124 1210 : mark_exp_read (expr);
125 :
126 1210 : bool recurse_op[3] = {false, false, false};
127 1210 : switch (TREE_CODE (expr))
128 : {
129 15 : case COMPONENT_REF:
130 15 : recurse_op[0] = true;
131 15 : break;
132 0 : case COMPOUND_EXPR:
133 0 : recurse_op[1] = true;
134 0 : break;
135 0 : case COND_EXPR:
136 0 : recurse_op[2] = true;
137 0 : if (TREE_OPERAND (expr, 1))
138 0 : recurse_op[1] = true;
139 : break;
140 0 : case INDIRECT_REF:
141 0 : if (REFERENCE_REF_P (expr))
142 : {
143 : /* Try to look through the reference. */
144 0 : tree ref = TREE_OPERAND (expr, 0);
145 0 : tree r = mark_rvalue_use (ref, loc, reject_builtin);
146 0 : if (r != ref)
147 0 : expr = convert_from_reference (r);
148 : }
149 : break;
150 :
151 0 : case VIEW_CONVERT_EXPR:
152 0 : if (location_wrapper_p (expr))
153 : {
154 0 : loc = EXPR_LOCATION (expr);
155 0 : tree op = TREE_OPERAND (expr, 0);
156 0 : tree nop = RECUR (op);
157 0 : if (nop == error_mark_node)
158 : return error_mark_node;
159 0 : else if (op == nop)
160 : /* No change. */;
161 0 : else if (DECL_P (nop) || CONSTANT_CLASS_P (nop))
162 : {
163 : /* Reuse the location wrapper. */
164 0 : TREE_OPERAND (expr, 0) = nop;
165 : /* If we're replacing a DECL with a constant, we also need to
166 : change the TREE_CODE of the location wrapper. */
167 0 : if (rvalue_p)
168 0 : TREE_SET_CODE (expr, NON_LVALUE_EXPR);
169 : }
170 : else
171 : {
172 : /* Drop the location wrapper. */
173 0 : expr = nop;
174 0 : protected_set_expr_location (expr, loc);
175 : }
176 0 : return expr;
177 : }
178 0 : gcc_fallthrough ();
179 0 : CASE_CONVERT:
180 0 : recurse_op[0] = true;
181 0 : break;
182 :
183 : default:
184 : break;
185 : }
186 :
187 4840 : for (int i = 0; i < 3; ++i)
188 3630 : if (recurse_op[i])
189 : {
190 15 : tree op = TREE_OPERAND (expr, i);
191 15 : op = RECUR (op);
192 15 : if (op == error_mark_node)
193 : return error_mark_node;
194 15 : TREE_OPERAND (expr, i) = op;
195 : }
196 :
197 : return expr;
198 : #undef RECUR
199 : }
200 :
201 : tree
202 0 : mark_rvalue_use (tree e, location_t loc /* = UNKNOWN_LOCATION */,
203 : bool reject_builtin /* = true */)
204 : {
205 0 : return mark_use (e, true, true, loc, reject_builtin);
206 : }
207 :
208 : tree
209 0 : mark_lvalue_use (tree expr)
210 : {
211 0 : return mark_use (expr, false, true, input_location, false);
212 : }
213 :
214 : tree
215 0 : mark_lvalue_use_nonread (tree expr)
216 : {
217 0 : return mark_use (expr, false, false, input_location, false);
218 : }
219 :
220 : tree
221 5718 : mark_discarded_use (tree expr)
222 : {
223 5718 : if (expr == NULL_TREE)
224 : return expr;
225 :
226 5718 : STRIP_ANY_LOCATION_WRAPPER (expr);
227 :
228 5718 : switch (TREE_CODE (expr))
229 : {
230 0 : case COND_EXPR:
231 0 : TREE_OPERAND (expr, 2) = mark_discarded_use (TREE_OPERAND (expr, 2));
232 2 : gcc_fallthrough ();
233 2 : case COMPOUND_EXPR:
234 2 : TREE_OPERAND (expr, 1) = mark_discarded_use (TREE_OPERAND (expr, 1));
235 2 : return expr;
236 :
237 : case COMPONENT_REF:
238 : case ARRAY_REF:
239 : case INDIRECT_REF:
240 : case MEMBER_REF:
241 : break;
242 5700 : default:
243 5700 : if (DECL_P (expr))
244 : break;
245 : else
246 : return expr;
247 : }
248 :
249 1195 : return mark_use (expr, true, true, input_location, false);
250 : }
251 :
252 : tree
253 9116 : convert_to_void (tree expr, impl_conv_void implicit)
254 : {
255 9116 : location_t loc = expr_loc_or_input_loc (expr);
256 9116 : if (expr == error_mark_node || TREE_TYPE (expr) == error_mark_node)
257 : return error_mark_node;
258 :
259 5716 : expr = mark_discarded_use (expr);
260 5716 : if (implicit == ICV_CAST)
261 : /* An explicit cast to void avoids all -Wunused-but-set* warnings. */
262 0 : mark_exp_read (expr);
263 :
264 5716 : if (!TREE_TYPE (expr))
265 : return expr;
266 :
267 5716 : if (VOID_TYPE_P (TREE_TYPE (expr)))
268 : return expr;
269 3476 : switch (TREE_CODE (expr))
270 : {
271 0 : case COND_EXPR:
272 0 : {
273 : /* The two parts of a cond expr might be separate lvalues. */
274 0 : tree op1 = TREE_OPERAND (expr, 1);
275 0 : tree op2 = TREE_OPERAND (expr, 2);
276 0 : bool side_effects
277 0 : = ((op1 && TREE_SIDE_EFFECTS (op1)) || TREE_SIDE_EFFECTS (op2));
278 0 : tree new_op1, new_op2;
279 0 : new_op1 = NULL_TREE;
280 0 : if (implicit != ICV_CAST && !side_effects)
281 : {
282 0 : if (op1)
283 0 : new_op1 = convert_to_void (op1, ICV_SECOND_OF_COND);
284 0 : new_op2 = convert_to_void (op2, ICV_THIRD_OF_COND);
285 : }
286 : else
287 : {
288 0 : if (op1)
289 0 : new_op1 = convert_to_void (op1, ICV_CAST);
290 0 : new_op2 = convert_to_void (op2, ICV_CAST);
291 : }
292 :
293 0 : expr = build3_loc (loc, COND_EXPR, TREE_TYPE (new_op2),
294 0 : TREE_OPERAND (expr, 0), new_op1, new_op2);
295 0 : break;
296 : }
297 :
298 2 : case COMPOUND_EXPR:
299 2 : {
300 : /* The second part of a compound expr contains the value. */
301 2 : tree op1 = TREE_OPERAND (expr, 1);
302 2 : tree new_op1;
303 2 : if (implicit != ICV_CAST
304 2 : && !warning_suppressed_p (expr /* What warning? */))
305 2 : new_op1 = convert_to_void (op1, ICV_RIGHT_OF_COMMA);
306 : else
307 0 : new_op1 = convert_to_void (op1, ICV_CAST);
308 :
309 2 : if (new_op1 != op1)
310 : {
311 2 : tree t = build2_loc (loc, COMPOUND_EXPR, TREE_TYPE (new_op1),
312 2 : TREE_OPERAND (expr, 0), new_op1);
313 2 : expr = t;
314 : }
315 :
316 : break;
317 : }
318 :
319 : case NON_LVALUE_EXPR:
320 : case NOP_EXPR:
321 : /* These have already decayed to rvalue. */
322 : break;
323 :
324 2194 : case CALL_EXPR:
325 2194 : maybe_warn_nodiscard (expr, implicit);
326 2194 : break;
327 :
328 0 : case INDIRECT_REF:
329 0 : {
330 0 : tree type = TREE_TYPE (expr);
331 0 : int is_reference = TYPE_REF_P (TREE_TYPE (TREE_OPERAND (expr, 0)));
332 0 : int is_volatile = TYPE_VOLATILE (type);
333 0 : int is_complete = COMPLETE_TYPE_P (type);
334 :
335 : /* Can't load the value if we don't know the type. */
336 0 : if (is_volatile && !is_complete)
337 : {
338 0 : switch (implicit)
339 : {
340 0 : case ICV_CAST:
341 0 : warning_at (loc, 0,
342 : "conversion to void will not access "
343 : "object of incomplete type %qT",
344 : type);
345 0 : break;
346 0 : case ICV_SECOND_OF_COND:
347 0 : warning_at (loc, 0,
348 : "indirection will not access object of "
349 : "incomplete type %qT in second operand "
350 : "of conditional expression",
351 : type);
352 0 : break;
353 0 : case ICV_THIRD_OF_COND:
354 0 : warning_at (loc, 0,
355 : "indirection will not access object of "
356 : "incomplete type %qT in third operand "
357 : "of conditional expression",
358 : type);
359 0 : break;
360 0 : case ICV_RIGHT_OF_COMMA:
361 0 : warning_at (loc, 0,
362 : "indirection will not access object of "
363 : "incomplete type %qT in right operand of "
364 : "comma operator",
365 : type);
366 0 : break;
367 0 : case ICV_LEFT_OF_COMMA:
368 0 : warning_at (loc, 0,
369 : "indirection will not access object of "
370 : "incomplete type %qT in left operand of "
371 : "comma operator",
372 : type);
373 0 : break;
374 0 : case ICV_STATEMENT:
375 0 : warning_at (loc, 0,
376 : "indirection will not access object of "
377 : "incomplete type %qT in statement",
378 : type);
379 0 : break;
380 0 : case ICV_THIRD_IN_FOR:
381 0 : warning_at (loc, 0,
382 : "indirection will not access object of "
383 : "incomplete type %qT in for increment "
384 : "expression",
385 : type);
386 0 : break;
387 0 : default:
388 0 : rust_unreachable ();
389 : }
390 : }
391 : /* Don't load the value if this is an implicit dereference, or if
392 : the type needs to be handled by ctors/dtors. */
393 0 : else if (is_volatile && is_reference)
394 : {
395 0 : switch (implicit)
396 : {
397 0 : case ICV_CAST:
398 0 : warning_at (loc, 0,
399 : "conversion to void will not access "
400 : "object of type %qT",
401 : type);
402 0 : break;
403 0 : case ICV_SECOND_OF_COND:
404 0 : warning_at (loc, 0,
405 : "implicit dereference will not access "
406 : "object of type %qT in second operand of "
407 : "conditional expression",
408 : type);
409 0 : break;
410 0 : case ICV_THIRD_OF_COND:
411 0 : warning_at (loc, 0,
412 : "implicit dereference will not access "
413 : "object of type %qT in third operand of "
414 : "conditional expression",
415 : type);
416 0 : break;
417 0 : case ICV_RIGHT_OF_COMMA:
418 0 : warning_at (loc, 0,
419 : "implicit dereference will not access "
420 : "object of type %qT in right operand of "
421 : "comma operator",
422 : type);
423 0 : break;
424 0 : case ICV_LEFT_OF_COMMA:
425 0 : warning_at (loc, 0,
426 : "implicit dereference will not access "
427 : "object of type %qT in left operand of comma "
428 : "operator",
429 : type);
430 0 : break;
431 0 : case ICV_STATEMENT:
432 0 : warning_at (loc, 0,
433 : "implicit dereference will not access "
434 : "object of type %qT in statement",
435 : type);
436 0 : break;
437 0 : case ICV_THIRD_IN_FOR:
438 0 : warning_at (loc, 0,
439 : "implicit dereference will not access "
440 : "object of type %qT in for increment expression",
441 : type);
442 0 : break;
443 0 : default:
444 0 : rust_unreachable ();
445 : }
446 : }
447 0 : else if (is_volatile && TREE_ADDRESSABLE (type))
448 : {
449 0 : switch (implicit)
450 : {
451 0 : case ICV_CAST:
452 0 : warning_at (loc, 0,
453 : "conversion to void will not access "
454 : "object of non-trivially-copyable type %qT",
455 : type);
456 0 : break;
457 0 : case ICV_SECOND_OF_COND:
458 0 : warning_at (loc, 0,
459 : "indirection will not access object of "
460 : "non-trivially-copyable type %qT in second "
461 : "operand of conditional expression",
462 : type);
463 0 : break;
464 0 : case ICV_THIRD_OF_COND:
465 0 : warning_at (loc, 0,
466 : "indirection will not access object of "
467 : "non-trivially-copyable type %qT in third "
468 : "operand of conditional expression",
469 : type);
470 0 : break;
471 0 : case ICV_RIGHT_OF_COMMA:
472 0 : warning_at (loc, 0,
473 : "indirection will not access object of "
474 : "non-trivially-copyable type %qT in right "
475 : "operand of comma operator",
476 : type);
477 0 : break;
478 0 : case ICV_LEFT_OF_COMMA:
479 0 : warning_at (loc, 0,
480 : "indirection will not access object of "
481 : "non-trivially-copyable type %qT in left "
482 : "operand of comma operator",
483 : type);
484 0 : break;
485 0 : case ICV_STATEMENT:
486 0 : warning_at (loc, 0,
487 : "indirection will not access object of "
488 : "non-trivially-copyable type %qT in statement",
489 : type);
490 0 : break;
491 0 : case ICV_THIRD_IN_FOR:
492 0 : warning_at (loc, 0,
493 : "indirection will not access object of "
494 : "non-trivially-copyable type %qT in for "
495 : "increment expression",
496 : type);
497 0 : break;
498 0 : default:
499 0 : rust_unreachable ();
500 : }
501 : }
502 0 : if (is_reference || !is_volatile || !is_complete
503 0 : || TREE_ADDRESSABLE (type))
504 : {
505 : /* Emit a warning (if enabled) when the "effect-less" INDIRECT_REF
506 : operation is stripped off. Note that we don't warn about
507 : - an expression with TREE_NO_WARNING set. (For an example of
508 : such expressions, see build_over_call in call.cc.)
509 : - automatic dereferencing of references, since the user cannot
510 : control it. (See also warn_if_unused_value() in c-common.cc.)
511 : */
512 0 : if (warn_unused_value && implicit != ICV_CAST
513 0 : && !warning_suppressed_p (expr, OPT_Wunused_value)
514 0 : && !is_reference)
515 0 : warning_at (loc, OPT_Wunused_value, "value computed is not used");
516 0 : expr = TREE_OPERAND (expr, 0);
517 0 : if (TREE_CODE (expr) == CALL_EXPR)
518 0 : maybe_warn_nodiscard (expr, implicit);
519 : }
520 :
521 : break;
522 : }
523 :
524 1170 : case VAR_DECL:
525 1170 : {
526 : /* External variables might be incomplete. */
527 1170 : tree type = TREE_TYPE (expr);
528 1170 : int is_complete = COMPLETE_TYPE_P (type);
529 :
530 1170 : if (TYPE_VOLATILE (type) && !is_complete)
531 0 : switch (implicit)
532 : {
533 0 : case ICV_CAST:
534 0 : warning_at (loc, 0,
535 : "conversion to void will not access "
536 : "object %qE of incomplete type %qT",
537 : expr, type);
538 0 : break;
539 0 : case ICV_SECOND_OF_COND:
540 0 : warning_at (loc, 0,
541 : "variable %qE of incomplete type %qT will "
542 : "not be accessed in second operand of "
543 : "conditional expression",
544 : expr, type);
545 0 : break;
546 0 : case ICV_THIRD_OF_COND:
547 0 : warning_at (loc, 0,
548 : "variable %qE of incomplete type %qT will "
549 : "not be accessed in third operand of "
550 : "conditional expression",
551 : expr, type);
552 0 : break;
553 0 : case ICV_RIGHT_OF_COMMA:
554 0 : warning_at (loc, 0,
555 : "variable %qE of incomplete type %qT will "
556 : "not be accessed in right operand of comma operator",
557 : expr, type);
558 0 : break;
559 0 : case ICV_LEFT_OF_COMMA:
560 0 : warning_at (loc, 0,
561 : "variable %qE of incomplete type %qT will "
562 : "not be accessed in left operand of comma operator",
563 : expr, type);
564 0 : break;
565 0 : case ICV_STATEMENT:
566 0 : warning_at (loc, 0,
567 : "variable %qE of incomplete type %qT will "
568 : "not be accessed in statement",
569 : expr, type);
570 0 : break;
571 0 : case ICV_THIRD_IN_FOR:
572 0 : warning_at (loc, 0,
573 : "variable %qE of incomplete type %qT will "
574 : "not be accessed in for increment expression",
575 : expr, type);
576 0 : break;
577 0 : default:
578 0 : rust_unreachable ();
579 : }
580 :
581 : break;
582 : }
583 :
584 3476 : default:;
585 : }
586 :
587 3476 : if (!TREE_SIDE_EFFECTS (expr))
588 1281 : expr = void_node;
589 :
590 : return expr;
591 : }
592 :
593 : void
594 2194 : maybe_warn_nodiscard (tree expr, impl_conv_void implicit)
595 : {
596 2194 : tree call = expr;
597 2194 : if (TREE_CODE (expr) == TARGET_EXPR)
598 0 : call = TARGET_EXPR_INITIAL (expr);
599 :
600 2194 : location_t loc = expr_loc_or_input_loc (call);
601 2194 : tree callee = CALL_EXPR_FN (call);
602 2194 : if (!callee)
603 : return;
604 :
605 2194 : tree type = TREE_TYPE (callee);
606 2194 : if (INDIRECT_TYPE_P (type))
607 2194 : type = TREE_TYPE (type);
608 :
609 2194 : tree rettype = TREE_TYPE (type);
610 2194 : tree fn = get_fndecl_from_callee (callee);
611 2194 : tree attr;
612 2194 : if (implicit != ICV_CAST && fn
613 2194 : && (attr = lookup_attribute ("nodiscard", DECL_ATTRIBUTES (fn))))
614 : {
615 14 : escaped_string msg;
616 14 : tree args = TREE_VALUE (attr);
617 14 : if (args)
618 7 : msg.escape (TREE_STRING_POINTER (TREE_VALUE (args)));
619 14 : const char *format
620 14 : = (msg ? G_ ("ignoring return value of %qD, that must be used: %qs")
621 7 : : G_ ("ignoring return value of %qD, that must be used"));
622 14 : const char *raw_msg = msg ? (const char *) msg : "";
623 14 : auto_diagnostic_group d;
624 14 : if (warning_at (loc, OPT_Wunused_result, format, fn, raw_msg))
625 14 : inform (DECL_SOURCE_LOCATION (fn), "declared here");
626 14 : }
627 2180 : else if (implicit != ICV_CAST
628 2180 : && (attr
629 2180 : = lookup_attribute ("nodiscard", TYPE_ATTRIBUTES (rettype))))
630 : {
631 0 : escaped_string msg;
632 0 : tree args = TREE_VALUE (attr);
633 0 : if (args)
634 0 : msg.escape (TREE_STRING_POINTER (TREE_VALUE (args)));
635 0 : const char *format
636 0 : = (msg ? G_ (
637 : "ignoring returned value of type %qT, that must be used: %qs")
638 0 : : G_ ("ignoring returned value of type %qT, that must be used"));
639 0 : const char *raw_msg = msg ? (const char *) msg : "";
640 0 : auto_diagnostic_group d;
641 0 : if (warning_at (loc, OPT_Wunused_result, format, rettype, raw_msg))
642 : {
643 0 : if (fn)
644 0 : inform (DECL_SOURCE_LOCATION (fn), "in call to %qD, declared here",
645 : fn);
646 0 : inform (DECL_SOURCE_LOCATION (TYPE_NAME (rettype)),
647 : "%qT declared here", rettype);
648 : }
649 0 : }
650 : }
651 :
652 : location_t
653 11310 : expr_loc_or_loc (const_tree t, location_t or_loc)
654 : {
655 11310 : location_t loc = EXPR_LOCATION (t);
656 6650 : if (loc == UNKNOWN_LOCATION)
657 4660 : loc = or_loc;
658 11310 : return loc;
659 : }
660 :
661 : location_t
662 11310 : expr_loc_or_input_loc (const_tree t)
663 : {
664 11310 : return expr_loc_or_loc (t, input_location);
665 : }
666 :
667 : // FN is the callee of a CALL_EXPR or AGGR_INIT_EXPR; return the FUNCTION_DECL
668 : // if we can.
669 : tree
670 2194 : get_fndecl_from_callee (tree fn)
671 : {
672 2194 : if (fn == NULL_TREE)
673 : return fn;
674 2194 : if (TREE_CODE (fn) == FUNCTION_DECL)
675 : return fn;
676 2194 : tree type = TREE_TYPE (fn);
677 2194 : if (type == NULL_TREE || !INDIRECT_TYPE_P (type))
678 : return NULL_TREE;
679 :
680 2194 : STRIP_NOPS (fn);
681 2194 : if (TREE_CODE (fn) == ADDR_EXPR || TREE_CODE (fn) == FDESC_EXPR)
682 2056 : fn = TREE_OPERAND (fn, 0);
683 2194 : if (TREE_CODE (fn) == FUNCTION_DECL)
684 : return fn;
685 : return NULL_TREE;
686 : }
687 :
688 : tree
689 222 : pointer_offset_expression (tree base_tree, tree index_tree, location_t location)
690 : {
691 222 : tree element_type_tree = TREE_TYPE (TREE_TYPE (base_tree));
692 222 : if (base_tree == error_mark_node || TREE_TYPE (base_tree) == error_mark_node
693 444 : || index_tree == error_mark_node || element_type_tree == error_mark_node)
694 : return error_mark_node;
695 :
696 222 : tree element_size = TYPE_SIZE_UNIT (element_type_tree);
697 222 : index_tree = fold_convert_loc (location, sizetype, index_tree);
698 222 : tree offset
699 222 : = fold_build2_loc (location, MULT_EXPR, sizetype, index_tree, element_size);
700 :
701 222 : return fold_build2_loc (location, POINTER_PLUS_EXPR, TREE_TYPE (base_tree),
702 222 : base_tree, offset);
703 : }
704 :
705 : // forked from gcc/cp/tree.cc cp_walk_subtrees
706 : /* Apply FUNC to all language-specific sub-trees of TP in a pre-order
707 : traversal. Called from walk_tree. */
708 :
709 : tree
710 3 : rs_walk_subtrees (tree *tp, int *walk_subtrees_p, walk_tree_fn func, void *data,
711 : hash_set<tree> *pset)
712 : {
713 3 : enum tree_code code = TREE_CODE (*tp);
714 3 : tree result;
715 :
716 : #define WALK_SUBTREE(NODE) \
717 : do \
718 : { \
719 : result = rs_walk_tree (&(NODE), func, data, pset); \
720 : if (result) \
721 : goto out; \
722 : } \
723 : while (0)
724 :
725 3 : if (TYPE_P (*tp))
726 : {
727 : /* If *WALK_SUBTREES_P is 1, we're interested in the syntactic form of
728 : the argument, so don't look through typedefs, but do walk into
729 : template arguments for alias templates (and non-typedefed classes).
730 :
731 : If *WALK_SUBTREES_P > 1, we're interested in type identity or
732 : equivalence, so look through typedefs, ignoring template arguments for
733 : alias templates, and walk into template args of classes.
734 :
735 : See find_abi_tags_r for an example of setting *WALK_SUBTREES_P to 2
736 : when that's the behavior the walk_tree_fn wants. */
737 0 : if (*walk_subtrees_p == 1 && typedef_variant_p (*tp))
738 : {
739 0 : *walk_subtrees_p = 0;
740 0 : return NULL_TREE;
741 : }
742 : }
743 :
744 : /* Not one of the easy cases. We must explicitly go through the
745 : children. */
746 3 : result = NULL_TREE;
747 3 : switch (code)
748 : {
749 0 : case TREE_LIST:
750 0 : WALK_SUBTREE (TREE_PURPOSE (*tp));
751 : break;
752 :
753 0 : case RECORD_TYPE:
754 0 : if (TYPE_PTRMEMFUNC_P (*tp))
755 0 : WALK_SUBTREE (TYPE_PTRMEMFUNC_FN_TYPE_RAW (*tp));
756 : break;
757 :
758 0 : case CONSTRUCTOR:
759 0 : if (COMPOUND_LITERAL_P (*tp))
760 0 : WALK_SUBTREE (TREE_TYPE (*tp));
761 : break;
762 :
763 0 : case DECL_EXPR:
764 : /* User variables should be mentioned in BIND_EXPR_VARS
765 : and their initializers and sizes walked when walking
766 : the containing BIND_EXPR. Compiler temporaries are
767 : handled here. And also normal variables in templates,
768 : since do_poplevel doesn't build a BIND_EXPR then. */
769 0 : if (VAR_P (TREE_OPERAND (*tp, 0))
770 0 : && (DECL_ARTIFICIAL (TREE_OPERAND (*tp, 0))
771 0 : && !TREE_STATIC (TREE_OPERAND (*tp, 0))))
772 : {
773 0 : tree decl = TREE_OPERAND (*tp, 0);
774 0 : WALK_SUBTREE (DECL_INITIAL (decl));
775 0 : WALK_SUBTREE (DECL_SIZE (decl));
776 0 : WALK_SUBTREE (DECL_SIZE_UNIT (decl));
777 : }
778 : break;
779 :
780 : default:
781 : return NULL_TREE;
782 : }
783 :
784 : /* We didn't find what we were looking for. */
785 : out:
786 : return result;
787 :
788 : #undef WALK_SUBTREE
789 : }
790 :
791 : // forked from gcc/cp/tree.cc cp_expr_location
792 :
793 : /* Like EXPR_LOCATION, but also handle some tcc_exceptional that have
794 : locations. */
795 :
796 : location_t
797 11 : rs_expr_location (const_tree t_)
798 : {
799 11 : tree t = const_cast<tree> (t_);
800 11 : if (t == NULL_TREE)
801 : return UNKNOWN_LOCATION;
802 :
803 11 : return EXPR_LOCATION (t);
804 : }
805 :
806 : // forked from gcc/cp/class.cc is_really_empty_class
807 :
808 : /* Returns true if TYPE contains no actual data, just various
809 : possible combinations of empty classes. If IGNORE_VPTR is true,
810 : a vptr doesn't prevent the class from being considered empty. Typically
811 : we want to ignore the vptr on assignment, and not on initialization. */
812 :
813 : bool
814 1305 : is_really_empty_class (tree type, bool ignore_vptr)
815 : {
816 1305 : if (CLASS_TYPE_P (type))
817 : {
818 0 : tree field;
819 0 : tree binfo;
820 0 : tree base_binfo;
821 0 : int i;
822 :
823 : /* CLASSTYPE_EMPTY_P isn't set properly until the class is actually laid
824 : out, but we'd like to be able to check this before then. */
825 0 : if (COMPLETE_TYPE_P (type) && is_empty_class (type))
826 : return true;
827 :
828 0 : if (!ignore_vptr && TYPE_CONTAINS_VPTR_P (type))
829 : return false;
830 :
831 0 : for (binfo = TYPE_BINFO (type), i = 0;
832 0 : BINFO_BASE_ITERATE (binfo, i, base_binfo); ++i)
833 0 : if (!is_really_empty_class (BINFO_TYPE (base_binfo), ignore_vptr))
834 : return false;
835 0 : for (field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
836 0 : if (TREE_CODE (field) == FIELD_DECL
837 0 : && !DECL_ARTIFICIAL (field)
838 : /* An unnamed bit-field is not a data member. */
839 0 : && !DECL_UNNAMED_BIT_FIELD (field)
840 0 : && !is_really_empty_class (TREE_TYPE (field), ignore_vptr))
841 : return false;
842 : return true;
843 : }
844 1305 : else if (TREE_CODE (type) == ARRAY_TYPE)
845 8 : return (integer_zerop (array_type_nelts_top (type))
846 8 : || is_really_empty_class (TREE_TYPE (type), ignore_vptr));
847 : return false;
848 : }
849 :
850 : // forked from gcc/cp/class.cc is_empty_class
851 :
852 : /* Returns 1 if TYPE contains only padding bytes. */
853 :
854 : int
855 1 : is_empty_class (tree type)
856 : {
857 1 : if (type == error_mark_node)
858 : return 0;
859 :
860 1 : if (!CLASS_TYPE_P (type))
861 : return 0;
862 :
863 0 : return CLASSTYPE_EMPTY_P (type);
864 : }
865 :
866 : // forked from gcc/cp/tree.cc builtin_valid_in_constant_expr_p
867 :
868 : /* Test whether DECL is a builtin that may appear in a
869 : constant-expression. */
870 :
871 : bool
872 0 : builtin_valid_in_constant_expr_p (const_tree decl)
873 : {
874 0 : STRIP_ANY_LOCATION_WRAPPER (decl);
875 0 : if (TREE_CODE (decl) != FUNCTION_DECL)
876 : /* Not a function. */
877 : return false;
878 0 : if (DECL_BUILT_IN_CLASS (decl) != BUILT_IN_NORMAL)
879 : {
880 0 : if (fndecl_built_in_p (decl, BUILT_IN_FRONTEND))
881 0 : switch (DECL_FE_FUNCTION_CODE (decl))
882 : {
883 : case RS_BUILT_IN_IS_CONSTANT_EVALUATED:
884 : case RS_BUILT_IN_SOURCE_LOCATION:
885 : case RS_BUILT_IN_IS_CORRESPONDING_MEMBER:
886 : case RS_BUILT_IN_IS_POINTER_INTERCONVERTIBLE_WITH_CLASS:
887 : return true;
888 : default:
889 : break;
890 : }
891 : /* Not a built-in. */
892 : return false;
893 : }
894 0 : switch (DECL_FUNCTION_CODE (decl))
895 : {
896 : /* These always have constant results like the corresponding
897 : macros/symbol. */
898 : case BUILT_IN_FILE:
899 : case BUILT_IN_FUNCTION:
900 : case BUILT_IN_LINE:
901 :
902 : /* The following built-ins are valid in constant expressions
903 : when their arguments are. */
904 : case BUILT_IN_ADD_OVERFLOW_P:
905 : case BUILT_IN_SUB_OVERFLOW_P:
906 : case BUILT_IN_MUL_OVERFLOW_P:
907 :
908 : /* These have constant results even if their operands are
909 : non-constant. */
910 : case BUILT_IN_CONSTANT_P:
911 : case BUILT_IN_ATOMIC_ALWAYS_LOCK_FREE:
912 : return true;
913 : default:
914 : return false;
915 : }
916 : }
917 :
918 : // forked from gcc/cp/decl2.cc decl_maybe_constant_var_p
919 :
920 : /* Returns true if DECL could be a symbolic constant variable, depending on
921 : its initializer. */
922 :
923 : bool
924 0 : decl_maybe_constant_var_p (tree decl)
925 : {
926 0 : tree type = TREE_TYPE (decl);
927 0 : if (!VAR_P (decl))
928 : return false;
929 0 : if (DECL_DECLARED_CONSTEXPR_P (decl))
930 : return true;
931 0 : if (DECL_HAS_VALUE_EXPR_P (decl))
932 : /* A proxy isn't constant. */
933 : return false;
934 0 : if (TYPE_REF_P (type))
935 : /* References can be constant. */;
936 0 : else if (RS_TYPE_CONST_NON_VOLATILE_P (type)
937 0 : && INTEGRAL_OR_ENUMERATION_TYPE_P (type))
938 : /* And const integers. */;
939 : else
940 : return false;
941 :
942 0 : if (DECL_INITIAL (decl) && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
943 : /* We know the initializer, and it isn't constant. */
944 : return false;
945 : else
946 : return true;
947 : }
948 :
949 : // forked from gcc/cp/typeck.cc cp_type_quals
950 :
951 : /* Returns the type qualifiers for this type, including the qualifiers on the
952 : elements for an array type. */
953 :
954 : int
955 26 : rs_type_quals (const_tree type)
956 : {
957 26 : int quals;
958 : /* This CONST_CAST is okay because strip_array_types returns its
959 : argument unmodified and we assign it to a const_tree. */
960 26 : type = strip_array_types (const_cast<tree> (type));
961 26 : if (type == error_mark_node
962 : /* Quals on a FUNCTION_TYPE are memfn quals. */
963 26 : || TREE_CODE (type) == FUNCTION_TYPE)
964 : return TYPE_UNQUALIFIED;
965 26 : quals = TYPE_QUALS (type);
966 : /* METHOD and REFERENCE_TYPEs should never have quals. */
967 : // gcc_assert (
968 : // (TREE_CODE (type) != METHOD_TYPE && !TYPE_REF_P (type))
969 : // || ((quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) ==
970 : // TYPE_UNQUALIFIED));
971 26 : return quals;
972 : }
973 :
974 : // forked from gcc/cp/decl.cc cp_global_trees
975 :
976 : /* The following symbols are subsumed in the cp_global_trees array, and
977 : listed here individually for documentation purposes.
978 :
979 : C++ extensions
980 : tree wchar_decl_node;
981 :
982 : tree vtable_entry_type;
983 : tree delta_type_node;
984 : tree __t_desc_type_node;
985 :
986 : tree class_type_node;
987 : tree unknown_type_node;
988 :
989 : Array type `vtable_entry_type[]'
990 :
991 : tree vtbl_type_node;
992 : tree vtbl_ptr_type_node;
993 :
994 : Namespaces,
995 :
996 : tree std_node;
997 : tree abi_node;
998 :
999 : A FUNCTION_DECL which can call `abort'. Not necessarily the
1000 : one that the user will declare, but sufficient to be called
1001 : by routines that want to abort the program.
1002 :
1003 : tree abort_fndecl;
1004 :
1005 : Used by RTTI
1006 : tree type_info_type_node, tinfo_decl_id, tinfo_decl_type;
1007 : tree tinfo_var_id; */
1008 :
1009 : /* The following symbols are subsumed in the c_global_trees array, and
1010 : listed here individually for documentation purposes.
1011 :
1012 : INTEGER_TYPE and REAL_TYPE nodes for the standard data types.
1013 :
1014 : tree short_integer_type_node;
1015 : tree long_integer_type_node;
1016 : tree long_long_integer_type_node;
1017 :
1018 : tree short_unsigned_type_node;
1019 : tree long_unsigned_type_node;
1020 : tree long_long_unsigned_type_node;
1021 :
1022 : tree truthvalue_type_node;
1023 : tree truthvalue_false_node;
1024 : tree truthvalue_true_node;
1025 :
1026 : tree ptrdiff_type_node;
1027 :
1028 : tree unsigned_char_type_node;
1029 : tree signed_char_type_node;
1030 : tree wchar_type_node;
1031 :
1032 : tree char8_type_node;
1033 : tree char16_type_node;
1034 : tree char32_type_node;
1035 :
1036 : tree float_type_node;
1037 : tree double_type_node;
1038 : tree long_double_type_node;
1039 :
1040 : tree complex_integer_type_node;
1041 : tree complex_float_type_node;
1042 : tree complex_double_type_node;
1043 : tree complex_long_double_type_node;
1044 :
1045 : tree dfloat32_type_node;
1046 : tree dfloat64_type_node;
1047 : tree_dfloat128_type_node;
1048 :
1049 : tree intQI_type_node;
1050 : tree intHI_type_node;
1051 : tree intSI_type_node;
1052 : tree intDI_type_node;
1053 : tree intTI_type_node;
1054 :
1055 : tree unsigned_intQI_type_node;
1056 : tree unsigned_intHI_type_node;
1057 : tree unsigned_intSI_type_node;
1058 : tree unsigned_intDI_type_node;
1059 : tree unsigned_intTI_type_node;
1060 :
1061 : tree widest_integer_literal_type_node;
1062 : tree widest_unsigned_literal_type_node;
1063 :
1064 : Nodes for types `void *' and `const void *'.
1065 :
1066 : tree ptr_type_node, const_ptr_type_node;
1067 :
1068 : Nodes for types `char *' and `const char *'.
1069 :
1070 : tree string_type_node, const_string_type_node;
1071 :
1072 : Type `char[SOMENUMBER]'.
1073 : Used when an array of char is needed and the size is irrelevant.
1074 :
1075 : tree char_array_type_node;
1076 :
1077 : Type `wchar_t[SOMENUMBER]' or something like it.
1078 : Used when a wide string literal is created.
1079 :
1080 : tree wchar_array_type_node;
1081 :
1082 : Type `char8_t[SOMENUMBER]' or something like it.
1083 : Used when a UTF-8 string literal is created.
1084 :
1085 : tree char8_array_type_node;
1086 :
1087 : Type `char16_t[SOMENUMBER]' or something like it.
1088 : Used when a UTF-16 string literal is created.
1089 :
1090 : tree char16_array_type_node;
1091 :
1092 : Type `char32_t[SOMENUMBER]' or something like it.
1093 : Used when a UTF-32 string literal is created.
1094 :
1095 : tree char32_array_type_node;
1096 :
1097 : Type `int ()' -- used for implicit declaration of functions.
1098 :
1099 : tree default_function_type;
1100 :
1101 : A VOID_TYPE node, packaged in a TREE_LIST.
1102 :
1103 : tree void_list_node;
1104 :
1105 : The lazily created VAR_DECLs for __FUNCTION__, __PRETTY_FUNCTION__,
1106 : and __func__. (C doesn't generate __FUNCTION__ and__PRETTY_FUNCTION__
1107 : VAR_DECLS, but C++ does.)
1108 :
1109 : tree function_name_decl_node;
1110 : tree pretty_function_name_decl_node;
1111 : tree c99_function_name_decl_node;
1112 :
1113 : Stack of nested function name VAR_DECLs.
1114 :
1115 : tree saved_function_name_decls;
1116 :
1117 : */
1118 :
1119 : // forked from gcc/cp/module.cc fixed_trees
1120 :
1121 : static GTY (()) vec<tree, va_gc> *fixed_trees;
1122 :
1123 : // forked from gcc/cp/module.cc maybe_add_global
1124 :
1125 : /* VAL is a global tree, add it to the global vec if it is
1126 : interesting. Add some of its targets, if they too are
1127 : interesting. We do not add identifiers, as they can be re-found
1128 : via the identifier hash table. There is a cost to the number of
1129 : global trees. */
1130 :
1131 : static int
1132 0 : maybe_add_global (tree val, unsigned &crc)
1133 : {
1134 0 : int v = 0;
1135 :
1136 0 : if (val && !(TREE_CODE (val) == IDENTIFIER_NODE || TREE_VISITED (val)))
1137 : {
1138 0 : TREE_VISITED (val) = true;
1139 0 : crc = crc32_unsigned (crc, fixed_trees->length ());
1140 0 : vec_safe_push (fixed_trees, val);
1141 0 : v++;
1142 :
1143 0 : if (CODE_CONTAINS_STRUCT (TREE_CODE (val), TS_TYPED))
1144 0 : v += maybe_add_global (TREE_TYPE (val), crc);
1145 0 : if (CODE_CONTAINS_STRUCT (TREE_CODE (val), TS_TYPE_COMMON))
1146 0 : v += maybe_add_global (TYPE_NAME (val), crc);
1147 : }
1148 :
1149 0 : return v;
1150 : }
1151 :
1152 : // forked from gcc/cp/module.cc global_tree_arys
1153 :
1154 : /* Global trees. */
1155 : static const std::pair<tree *, unsigned> global_tree_arys[] = {
1156 : std::pair<tree *, unsigned> (cp_global_trees, CPTI_MODULE_HWM),
1157 : std::pair<tree *, unsigned> (c_global_trees, CTI_MODULE_HWM),
1158 : };
1159 :
1160 : // forked from gcc/cp/module.cc init_modules
1161 :
1162 : void
1163 0 : init_modules ()
1164 : {
1165 0 : unsigned crc = 0;
1166 0 : vec_alloc (fixed_trees, 200);
1167 :
1168 0 : const tree *ptr = global_tree_arys[0].first;
1169 0 : unsigned limit = global_tree_arys[0].second;
1170 0 : for (unsigned ix = 0; ix != limit; ix++, ptr++)
1171 : {
1172 0 : maybe_add_global (*ptr, crc);
1173 : }
1174 :
1175 : ptr = global_tree_arys[1].first;
1176 0 : limit = global_tree_arys[1].second;
1177 0 : for (unsigned ix = 0; ix != limit; ix++, ptr++)
1178 : {
1179 0 : maybe_add_global (*ptr, crc);
1180 : }
1181 0 : }
1182 :
1183 : // forked from gcc/cp/constexpr.cc var_in_constexpr_fn
1184 :
1185 : /* True if T was declared in a function declared to be constexpr, and
1186 : therefore potentially constant in C++14. */
1187 :
1188 : bool
1189 0 : var_in_constexpr_fn (tree t)
1190 : {
1191 0 : tree ctx = DECL_CONTEXT (t);
1192 0 : return (ctx && TREE_CODE (ctx) == FUNCTION_DECL
1193 0 : && DECL_DECLARED_CONSTEXPR_P (ctx));
1194 : }
1195 :
1196 : // forked from gcc/cp/name-lookup.cc member_vec_linear_search
1197 :
1198 : /* Linear search of (unordered) MEMBER_VEC for NAME. */
1199 :
1200 : static tree
1201 0 : member_vec_linear_search (vec<tree, va_gc> *member_vec, tree name)
1202 : {
1203 0 : for (int ix = member_vec->length (); ix--;)
1204 0 : if (tree binding = (*member_vec)[ix])
1205 0 : if (OVL_NAME (binding) == name)
1206 : return binding;
1207 :
1208 : return NULL_TREE;
1209 : }
1210 :
1211 : // forked from gcc/cp/name-lookup.cc member_vec_binary_search
1212 :
1213 : /* Binary search of (ordered) MEMBER_VEC for NAME. */
1214 :
1215 : static tree
1216 0 : member_vec_binary_search (vec<tree, va_gc> *member_vec, tree name)
1217 : {
1218 0 : for (unsigned lo = 0, hi = member_vec->length (); lo < hi;)
1219 : {
1220 0 : unsigned mid = (lo + hi) / 2;
1221 0 : tree binding = (*member_vec)[mid];
1222 0 : tree binding_name = OVL_NAME (binding);
1223 :
1224 0 : if (binding_name > name)
1225 : hi = mid;
1226 0 : else if (binding_name < name)
1227 0 : lo = mid + 1;
1228 : else
1229 : return binding;
1230 : }
1231 :
1232 : return NULL_TREE;
1233 : }
1234 :
1235 : // forked from gcc/cp/tree.cc is_overloaded_fn
1236 :
1237 : /* Returns nonzero if X is an expression for a (possibly overloaded)
1238 : function. If "f" is a function or function template, "f", "c->f",
1239 : "c.f", "C::f", and "f<int>" will all be considered possibly
1240 : overloaded functions. Returns 2 if the function is actually
1241 : overloaded, i.e., if it is impossible to know the type of the
1242 : function without performing overload resolution. */
1243 :
1244 : int
1245 5 : is_overloaded_fn (tree x)
1246 : {
1247 5 : STRIP_ANY_LOCATION_WRAPPER (x);
1248 :
1249 5 : if (TREE_CODE (x) == COMPONENT_REF)
1250 5 : x = TREE_OPERAND (x, 1);
1251 :
1252 5 : return OVL_P (x);
1253 : }
1254 :
1255 : // forked from gcc/cp/tree.cc ovl_make
1256 :
1257 : /* Make a raw overload node containing FN. */
1258 :
1259 : tree
1260 0 : ovl_make (tree fn, tree next)
1261 : {
1262 0 : tree result = make_node (OVERLOAD);
1263 :
1264 0 : if (TREE_CODE (fn) == OVERLOAD)
1265 0 : OVL_NESTED_P (result) = true;
1266 :
1267 0 : TREE_TYPE (result) = (next ? unknown_type_node : TREE_TYPE (fn));
1268 0 : if (next && TREE_CODE (next) == OVERLOAD && OVL_DEDUP_P (next))
1269 0 : OVL_DEDUP_P (result) = true;
1270 0 : OVL_FUNCTION (result) = fn;
1271 0 : OVL_CHAIN (result) = next;
1272 0 : return result;
1273 : }
1274 :
1275 : // forked from gcc/cp/name-lookup.cc lookup_add
1276 :
1277 : /* Add a set of new FNS into a lookup. */
1278 :
1279 : tree
1280 0 : lookup_add (tree fns, tree lookup)
1281 : {
1282 0 : if (fns == error_mark_node || lookup == error_mark_node)
1283 0 : return error_mark_node;
1284 :
1285 0 : lookup = fns;
1286 :
1287 : return lookup;
1288 : }
1289 :
1290 : // forked from gcc/cp/typeck.cc type_memfn_quals
1291 :
1292 : /* Returns the function-cv-quals for TYPE, which must be a FUNCTION_TYPE or
1293 : METHOD_TYPE. */
1294 :
1295 : int
1296 0 : type_memfn_quals (const_tree type)
1297 : {
1298 0 : if (TREE_CODE (type) == FUNCTION_TYPE)
1299 0 : return TYPE_QUALS (type);
1300 0 : else if (TREE_CODE (type) == METHOD_TYPE)
1301 0 : return rs_type_quals (class_of_this_parm (type));
1302 : else
1303 0 : rust_unreachable ();
1304 : }
1305 :
1306 : // forked from gcc/cp/pt.cc find_parameter_pack_data
1307 :
1308 : /* Structure used to track the progress of find_parameter_packs_r. */
1309 : struct find_parameter_pack_data
1310 : {
1311 : /* TREE_LIST that will contain all of the parameter packs found by
1312 : the traversal. */
1313 : tree *parameter_packs;
1314 :
1315 : /* Set of AST nodes that have been visited by the traversal. */
1316 : hash_set<tree> *visited;
1317 :
1318 : /* True iff we're making a type pack expansion. */
1319 : bool type_pack_expansion_p;
1320 :
1321 : /* True iff we found a subtree that has the extra args mechanism. */
1322 : bool found_extra_args_tree_p = false;
1323 : };
1324 :
1325 : // forked from gcc/cp/lex.cc conv_type_hasher
1326 :
1327 : /* Hasher for the conversion operator name hash table. */
1328 : struct rust_conv_type_hasher : ggc_ptr_hash<tree_node>
1329 : {
1330 : /* Hash NODE, an identifier node in the table. TYPE_UID is
1331 : suitable, as we're not concerned about matching canonicalness
1332 : here. */
1333 0 : static hashval_t hash (tree node)
1334 : {
1335 0 : return (hashval_t) TYPE_UID (TREE_TYPE (node));
1336 : }
1337 :
1338 : /* Compare NODE, an identifier node in the table, against TYPE, an
1339 : incoming TYPE being looked up. */
1340 0 : static bool equal (tree node, tree type) { return TREE_TYPE (node) == type; }
1341 : };
1342 :
1343 : static GTY (()) hash_table<rust_conv_type_hasher> *conv_type_names;
1344 :
1345 : // forked from gcc/cp/lex.cc make_conv_op_name
1346 :
1347 : /* Return an identifier for a conversion operator to TYPE. We can get
1348 : from the returned identifier to the type. We store TYPE, which is
1349 : not necessarily the canonical type, which allows us to report the
1350 : form the user used in error messages. All these identifiers are
1351 : not in the identifier hash table, and have the same string name.
1352 : These IDENTIFIERS are not in the identifier hash table, and all
1353 : have the same IDENTIFIER_STRING. */
1354 :
1355 : tree
1356 0 : make_conv_op_name (tree type)
1357 : {
1358 0 : if (type == error_mark_node)
1359 : return error_mark_node;
1360 :
1361 0 : if (conv_type_names == NULL)
1362 0 : conv_type_names = hash_table<rust_conv_type_hasher>::create_ggc (31);
1363 :
1364 0 : tree *slot
1365 0 : = conv_type_names->find_slot_with_hash (type, (hashval_t) TYPE_UID (type),
1366 : INSERT);
1367 0 : tree identifier = *slot;
1368 0 : if (!identifier)
1369 : {
1370 : /* Create a raw IDENTIFIER outside of the identifier hash
1371 : table. */
1372 0 : identifier = copy_node (conv_op_identifier);
1373 :
1374 : /* Just in case something managed to bind. */
1375 0 : IDENTIFIER_BINDING (identifier) = NULL;
1376 :
1377 : /* Hang TYPE off the identifier so it can be found easily later
1378 : when performing conversions. */
1379 0 : TREE_TYPE (identifier) = type;
1380 :
1381 0 : *slot = identifier;
1382 : }
1383 :
1384 : return identifier;
1385 : }
1386 :
1387 : // forked from gcc/cp/pt.cc builtin_pack_fn_p
1388 :
1389 : /* True iff FN is a function representing a built-in variadic parameter
1390 : pack. */
1391 :
1392 : bool
1393 0 : builtin_pack_fn_p (tree fn)
1394 : {
1395 0 : if (!fn || TREE_CODE (fn) != FUNCTION_DECL
1396 0 : || !DECL_IS_UNDECLARED_BUILTIN (fn))
1397 : return false;
1398 :
1399 0 : if (id_equal (DECL_NAME (fn), "__integer_pack"))
1400 : return true;
1401 :
1402 : return false;
1403 : }
1404 :
1405 : // forked from gcc/cp/pt.cc builtin_pack_call_p
1406 :
1407 : /* True iff CALL is a call to a function representing a built-in variadic
1408 : parameter pack. */
1409 :
1410 : static bool
1411 0 : builtin_pack_call_p (tree call)
1412 : {
1413 0 : if (TREE_CODE (call) != CALL_EXPR)
1414 : return false;
1415 0 : return builtin_pack_fn_p (CALL_EXPR_FN (call));
1416 : }
1417 :
1418 : //// forked from gcc/cp/pt.cc has_extra_args_mechanism_p
1419 : //
1420 : ///* Return true if the tree T has the extra args mechanism for
1421 : // avoiding partial instantiation. */
1422 : //
1423 : // static bool
1424 : // has_extra_args_mechanism_p (const_tree t)
1425 : //{
1426 : // return false;
1427 : //}
1428 :
1429 : // forked from gcc/cp/pt.cc find_parameter_packs_r
1430 :
1431 : /* Identifies all of the argument packs that occur in a template
1432 : argument and appends them to the TREE_LIST inside DATA, which is a
1433 : find_parameter_pack_data structure. This is a subroutine of
1434 : make_pack_expansion and uses_parameter_packs. */
1435 : static tree
1436 0 : find_parameter_packs_r (tree *tp, int *walk_subtrees, void *data)
1437 : {
1438 0 : tree t = *tp;
1439 0 : struct find_parameter_pack_data *ppd
1440 : = (struct find_parameter_pack_data *) data;
1441 0 : bool parameter_pack_p = false;
1442 :
1443 : #define WALK_SUBTREE(NODE) \
1444 : rs_walk_tree (&(NODE), &find_parameter_packs_r, ppd, ppd->visited)
1445 :
1446 : /* Don't look through typedefs; we are interested in whether a
1447 : parameter pack is actually written in the expression/type we're
1448 : looking at, not the target type. */
1449 0 : if (TYPE_P (t) && typedef_variant_p (t))
1450 : {
1451 0 : *walk_subtrees = 0;
1452 0 : return NULL_TREE;
1453 : }
1454 :
1455 : /* Identify whether this is a parameter pack or not. */
1456 0 : switch (TREE_CODE (t))
1457 : {
1458 : case FIELD_DECL:
1459 : case PARM_DECL:
1460 : break;
1461 :
1462 : case VAR_DECL:
1463 : break;
1464 :
1465 0 : case CALL_EXPR:
1466 0 : if (builtin_pack_call_p (t))
1467 : parameter_pack_p = true;
1468 : break;
1469 :
1470 : case BASES:
1471 : parameter_pack_p = true;
1472 : break;
1473 : default:
1474 : /* Not a parameter pack. */
1475 : break;
1476 : }
1477 :
1478 : if (parameter_pack_p)
1479 : {
1480 : /* Add this parameter pack to the list. */
1481 0 : *ppd->parameter_packs = tree_cons (NULL_TREE, t, *ppd->parameter_packs);
1482 : }
1483 :
1484 0 : if (TYPE_P (t))
1485 0 : rs_walk_tree (&TYPE_CONTEXT (t), &find_parameter_packs_r, ppd,
1486 : ppd->visited);
1487 :
1488 : /* This switch statement will return immediately if we don't find a
1489 : parameter pack. ??? Should some of these be in cp_walk_subtrees? */
1490 0 : switch (TREE_CODE (t))
1491 : {
1492 0 : case DECL_EXPR:
1493 0 : {
1494 0 : tree decl = DECL_EXPR_DECL (t);
1495 0 : if (is_typedef_decl (decl))
1496 : /* Since we stop at typedefs above, we need to look through them at
1497 : the point of the DECL_EXPR. */
1498 0 : rs_walk_tree (&DECL_ORIGINAL_TYPE (decl), &find_parameter_packs_r,
1499 : ppd, ppd->visited);
1500 : return NULL_TREE;
1501 : }
1502 :
1503 0 : case INTEGER_TYPE:
1504 0 : rs_walk_tree (&TYPE_MAX_VALUE (t), &find_parameter_packs_r, ppd,
1505 : ppd->visited);
1506 0 : *walk_subtrees = 0;
1507 0 : return NULL_TREE;
1508 :
1509 0 : case IDENTIFIER_NODE:
1510 0 : rs_walk_tree (&TREE_TYPE (t), &find_parameter_packs_r, ppd, ppd->visited);
1511 0 : *walk_subtrees = 0;
1512 0 : return NULL_TREE;
1513 :
1514 0 : case DECLTYPE_TYPE:
1515 0 : {
1516 : /* When traversing a DECLTYPE_TYPE_EXPR, we need to set
1517 : type_pack_expansion_p to false so that any placeholders
1518 : within the expression don't get marked as parameter packs. */
1519 0 : bool type_pack_expansion_p = ppd->type_pack_expansion_p;
1520 0 : ppd->type_pack_expansion_p = false;
1521 0 : rs_walk_tree (&DECLTYPE_TYPE_EXPR (t), &find_parameter_packs_r, ppd,
1522 : ppd->visited);
1523 0 : ppd->type_pack_expansion_p = type_pack_expansion_p;
1524 0 : *walk_subtrees = 0;
1525 0 : return NULL_TREE;
1526 : }
1527 :
1528 0 : case IF_STMT:
1529 0 : rs_walk_tree (&IF_COND (t), &find_parameter_packs_r, ppd, ppd->visited);
1530 0 : rs_walk_tree (&THEN_CLAUSE (t), &find_parameter_packs_r, ppd,
1531 : ppd->visited);
1532 0 : rs_walk_tree (&ELSE_CLAUSE (t), &find_parameter_packs_r, ppd,
1533 : ppd->visited);
1534 : /* Don't walk into IF_STMT_EXTRA_ARGS. */
1535 0 : *walk_subtrees = 0;
1536 0 : return NULL_TREE;
1537 :
1538 0 : case FUNCTION_TYPE:
1539 0 : case METHOD_TYPE:
1540 0 : WALK_SUBTREE (TYPE_RAISES_EXCEPTIONS (t));
1541 0 : break;
1542 :
1543 : default:
1544 : return NULL_TREE;
1545 : }
1546 :
1547 : #undef WALK_SUBTREE
1548 :
1549 0 : return NULL_TREE;
1550 : }
1551 :
1552 : // forked from gcc/cp/typeck.cc type_memfn_rqual
1553 :
1554 : /* Returns the function-ref-qualifier for TYPE */
1555 :
1556 : rs_ref_qualifier
1557 0 : type_memfn_rqual (const_tree type)
1558 : {
1559 0 : gcc_assert (FUNC_OR_METHOD_TYPE_P (type));
1560 :
1561 0 : if (!FUNCTION_REF_QUALIFIED (type))
1562 : return REF_QUAL_NONE;
1563 0 : else if (FUNCTION_RVALUE_QUALIFIED (type))
1564 : return REF_QUAL_RVALUE;
1565 : else
1566 0 : return REF_QUAL_LVALUE;
1567 : }
1568 :
1569 : // forked from gcc/cp/lex.cc maybe_add_lang_type_raw
1570 :
1571 : /* Add a raw lang_type to T, a type, should it need one. */
1572 :
1573 : bool
1574 0 : maybe_add_lang_type_raw (tree t)
1575 : {
1576 0 : if (!RECORD_OR_UNION_CODE_P (TREE_CODE (t)))
1577 : return false;
1578 :
1579 0 : auto *lt = (struct lang_type *) (ggc_internal_cleared_alloc (
1580 : sizeof (struct lang_type)));
1581 0 : TYPE_LANG_SPECIFIC (t) = lt;
1582 :
1583 0 : if (GATHER_STATISTICS)
1584 : {
1585 : tree_node_counts[(int) lang_type] += 1;
1586 : tree_node_sizes[(int) lang_type] += sizeof (struct lang_type);
1587 : }
1588 :
1589 0 : return true;
1590 : }
1591 :
1592 : // forked from gcc/c-family/c-lex.cc get_fileinfo
1593 :
1594 : static splay_tree file_info_tree;
1595 :
1596 : struct c_fileinfo *
1597 0 : get_fileinfo (const char *name)
1598 : {
1599 0 : splay_tree_node n;
1600 0 : struct c_fileinfo *fi;
1601 :
1602 0 : if (!file_info_tree)
1603 0 : file_info_tree = splay_tree_new (splay_tree_compare_strings, 0,
1604 : splay_tree_delete_pointers);
1605 :
1606 0 : n = splay_tree_lookup (file_info_tree, (splay_tree_key) name);
1607 0 : if (n)
1608 0 : return (struct c_fileinfo *) n->value;
1609 :
1610 0 : fi = XNEW (struct c_fileinfo);
1611 0 : fi->time = 0;
1612 0 : fi->interface_only = 0;
1613 0 : fi->interface_unknown = 1;
1614 0 : splay_tree_insert (file_info_tree, (splay_tree_key) name,
1615 : (splay_tree_value) fi);
1616 0 : return fi;
1617 : }
1618 :
1619 : // forked from gcc/cp/lex.cc cxx_make_type
1620 :
1621 : tree
1622 0 : cxx_make_type (enum tree_code code MEM_STAT_DECL)
1623 : {
1624 0 : tree t = make_node (code PASS_MEM_STAT);
1625 :
1626 0 : if (maybe_add_lang_type_raw (t))
1627 : {
1628 : /* Set up some flags that give proper default behavior. */
1629 0 : struct c_fileinfo *finfo = get_fileinfo (LOCATION_FILE (input_location));
1630 0 : SET_CLASSTYPE_INTERFACE_UNKNOWN_X (t, finfo->interface_unknown);
1631 0 : CLASSTYPE_INTERFACE_ONLY (t) = finfo->interface_only;
1632 : }
1633 :
1634 0 : if (code == RECORD_TYPE || code == UNION_TYPE)
1635 0 : TYPE_CXX_ODR_P (t) = 1;
1636 :
1637 0 : return t;
1638 : }
1639 :
1640 : // forked from gcc/cp/tree.cc build_min_array_type
1641 :
1642 : /* Build an ARRAY_TYPE without laying it out. */
1643 :
1644 : static tree
1645 0 : build_min_array_type (tree elt_type, tree index_type)
1646 : {
1647 0 : tree t = cxx_make_type (ARRAY_TYPE);
1648 0 : TREE_TYPE (t) = elt_type;
1649 0 : TYPE_DOMAIN (t) = index_type;
1650 0 : return t;
1651 : }
1652 :
1653 : // forked from gcc/cp/name-lookup.cc resort_data
1654 :
1655 : } // namespace Rust
1656 :
1657 : static struct
1658 : {
1659 : gt_pointer_operator new_value;
1660 : void *cookie;
1661 : } resort_data;
1662 :
1663 : // forked from gcc/cp/name-lookup.cc resort_member_name_cmp
1664 :
1665 : /* This routine compares two fields like member_name_cmp but using the
1666 : pointer operator in resort_field_decl_data. We don't have to deal
1667 : with duplicates here. */
1668 :
1669 : static int
1670 0 : resort_member_name_cmp (const void *a_p, const void *b_p)
1671 : {
1672 0 : tree a = *(const tree *) a_p;
1673 0 : tree b = *(const tree *) b_p;
1674 0 : tree name_a = OVL_NAME (a);
1675 0 : tree name_b = OVL_NAME (b);
1676 :
1677 0 : resort_data.new_value (&name_a, &name_a, resort_data.cookie);
1678 0 : resort_data.new_value (&name_b, &name_b, resort_data.cookie);
1679 :
1680 0 : gcc_checking_assert (name_a != name_b);
1681 :
1682 0 : return name_a < name_b ? -1 : +1;
1683 : }
1684 :
1685 : // forked from gcc/cp/name-lookup.cc resort_type_member_vec
1686 :
1687 : /* Resort CLASSTYPE_MEMBER_VEC because pointers have been reordered. */
1688 :
1689 : void
1690 0 : resort_type_member_vec (void *obj, void * /*orig_obj*/,
1691 : gt_pointer_operator new_value, void *cookie)
1692 : {
1693 0 : if (vec<tree, va_gc> *member_vec = (vec<tree, va_gc> *) obj)
1694 : {
1695 0 : resort_data.new_value = new_value;
1696 0 : resort_data.cookie = cookie;
1697 0 : member_vec->qsort (resort_member_name_cmp);
1698 : }
1699 0 : }
1700 :
1701 : namespace Rust {
1702 :
1703 : // forked from gcc/cp/name-lookup.cc fields_linear_search
1704 :
1705 : /* Linear search of (partially ordered) fields of KLASS for NAME. */
1706 :
1707 : static tree
1708 0 : fields_linear_search (tree klass, tree name, bool want_type)
1709 : {
1710 0 : for (tree fields = TYPE_FIELDS (klass); fields; fields = DECL_CHAIN (fields))
1711 : {
1712 0 : tree decl = fields;
1713 :
1714 0 : if (DECL_NAME (decl) != name)
1715 0 : continue;
1716 :
1717 0 : if (DECL_DECLARES_FUNCTION_P (decl))
1718 : /* Functions are found separately. */
1719 0 : continue;
1720 :
1721 0 : if (!want_type || DECL_DECLARES_TYPE_P (decl))
1722 : return decl;
1723 : }
1724 :
1725 : return NULL_TREE;
1726 : }
1727 :
1728 : // forked from gcc/cp/except.cc canonnothrow_spec_pical_eh_spec
1729 :
1730 : /* Return true iff SPEC is throw() or noexcept(true). */
1731 :
1732 : bool
1733 0 : nothrow_spec_p (const_tree spec)
1734 : {
1735 0 : if (spec == empty_except_spec || spec == noexcept_true_spec)
1736 : return true;
1737 :
1738 0 : gcc_assert (!spec || TREE_VALUE (spec) || spec == noexcept_false_spec
1739 : || TREE_PURPOSE (spec) == error_mark_node);
1740 :
1741 : return false;
1742 : }
1743 :
1744 : // forked from gcc/cp/tree.cc may_get_fns
1745 :
1746 : /* Get the overload set FROM refers to. Returns NULL if it's not an
1747 : overload set. */
1748 :
1749 : tree
1750 0 : maybe_get_fns (tree from)
1751 : {
1752 0 : STRIP_ANY_LOCATION_WRAPPER (from);
1753 :
1754 : /* A baselink is also considered an overloaded function. */
1755 0 : if (TREE_CODE (from) == COMPONENT_REF)
1756 0 : from = TREE_OPERAND (from, 1);
1757 :
1758 0 : if (OVL_P (from))
1759 0 : return from;
1760 :
1761 : return NULL;
1762 : }
1763 :
1764 : // forked from gcc/cp/tree.cc get_fns
1765 :
1766 : /* FROM refers to an overload set. Return that set (or die). */
1767 :
1768 : tree
1769 0 : get_fns (tree from)
1770 : {
1771 0 : tree res = maybe_get_fns (from);
1772 :
1773 0 : gcc_assert (res);
1774 0 : return res;
1775 : }
1776 :
1777 : // forked from gcc/cp/tree.cc get_first_fn
1778 :
1779 : /* Return the first function of the overload set FROM refers to. */
1780 :
1781 : tree
1782 0 : get_first_fn (tree from)
1783 : {
1784 0 : return OVL_FIRST (get_fns (from));
1785 : }
1786 :
1787 : // forked from gcc/cp/tree.cc dependent_name
1788 :
1789 : /* X is the CALL_EXPR_FN of a CALL_EXPR. If X represents a dependent name
1790 : (14.6.2), return the IDENTIFIER_NODE for that name. Otherwise, return
1791 : NULL_TREE. */
1792 :
1793 : tree
1794 0 : dependent_name (tree x)
1795 : {
1796 : /* FIXME a dependent name must be unqualified, but this function doesn't
1797 : distinguish between qualified and unqualified identifiers. */
1798 0 : if (identifier_p (x))
1799 : return x;
1800 :
1801 0 : if (OVL_P (x))
1802 0 : return OVL_NAME (x);
1803 : return NULL_TREE;
1804 : }
1805 :
1806 : // forked from gcc/cp/tree.cc called_fns_equal
1807 :
1808 : /* Subroutine of rs_tree_equal: t1 and t2 are the CALL_EXPR_FNs of two
1809 : CALL_EXPRS. Return whether they are equivalent. */
1810 :
1811 : static bool
1812 0 : called_fns_equal (tree t1, tree t2)
1813 : {
1814 : /* Core 1321: dependent names are equivalent even if the overload sets
1815 : are different. But do compare explicit template arguments. */
1816 0 : tree name1 = dependent_name (t1);
1817 0 : tree name2 = dependent_name (t2);
1818 0 : if (name1 || name2)
1819 : {
1820 0 : tree targs1 = NULL_TREE, targs2 = NULL_TREE;
1821 :
1822 0 : if (name1 != name2)
1823 : return false;
1824 :
1825 : /* FIXME dependent_name currently returns an unqualified name regardless
1826 : of whether the function was named with a qualified- or unqualified-id.
1827 : Until that's fixed, check that we aren't looking at overload sets from
1828 : different scopes. */
1829 0 : if (is_overloaded_fn (t1) && is_overloaded_fn (t2)
1830 0 : && (DECL_CONTEXT (get_first_fn (t1))
1831 0 : != DECL_CONTEXT (get_first_fn (t2))))
1832 : return false;
1833 :
1834 0 : return rs_tree_equal (targs1, targs2);
1835 : }
1836 : else
1837 0 : return rs_tree_equal (t1, t2);
1838 : }
1839 :
1840 : // forked from gcc/cp/tree.cc canonical_eh_spec
1841 :
1842 : /* Return the canonical version of exception-specification RAISES for a C++17
1843 : function type, for use in type comparison and building TYPE_CANONICAL. */
1844 :
1845 : tree
1846 0 : canonical_eh_spec (tree raises)
1847 : {
1848 0 : if (raises == NULL_TREE)
1849 : return raises;
1850 0 : else if (nothrow_spec_p (raises))
1851 : /* throw() -> noexcept. */
1852 0 : return noexcept_true_spec;
1853 : else
1854 : /* For C++17 type matching, anything else -> nothing. */
1855 : return NULL_TREE;
1856 : }
1857 :
1858 : /* Like cp_tree_operand_length, but takes a tree_code CODE. */
1859 :
1860 : int
1861 0 : rs_tree_code_length (enum tree_code code)
1862 : {
1863 0 : gcc_assert (TREE_CODE_CLASS (code) != tcc_vl_exp);
1864 :
1865 0 : switch (code)
1866 : {
1867 : case PREINCREMENT_EXPR:
1868 : case PREDECREMENT_EXPR:
1869 : case POSTINCREMENT_EXPR:
1870 : case POSTDECREMENT_EXPR:
1871 : return 1;
1872 :
1873 0 : case ARRAY_REF:
1874 0 : return 2;
1875 :
1876 0 : default:
1877 0 : return TREE_CODE_LENGTH (code);
1878 : }
1879 : }
1880 :
1881 : // forked from gcc/cp/tree.cc rs_tree_operand_length
1882 :
1883 : /* Return the number of operands in T that we care about for things like
1884 : mangling. */
1885 :
1886 : int
1887 0 : rs_tree_operand_length (const_tree t)
1888 : {
1889 0 : enum tree_code code = TREE_CODE (t);
1890 :
1891 0 : if (TREE_CODE_CLASS (code) == tcc_vl_exp)
1892 0 : return VL_EXP_OPERAND_LENGTH (t);
1893 :
1894 0 : return rs_tree_code_length (code);
1895 : }
1896 :
1897 : // forked from gcc/cp/tree.cc cp_tree_equal
1898 :
1899 : /* Return truthvalue of whether T1 is the same tree structure as T2.
1900 : Return 1 if they are the same. Return 0 if they are different. */
1901 :
1902 : bool
1903 0 : rs_tree_equal (tree t1, tree t2)
1904 : {
1905 0 : enum tree_code code1, code2;
1906 :
1907 0 : if (t1 == t2)
1908 : return true;
1909 0 : if (!t1 || !t2)
1910 : return false;
1911 :
1912 0 : code1 = TREE_CODE (t1);
1913 0 : code2 = TREE_CODE (t2);
1914 :
1915 0 : if (code1 != code2)
1916 : return false;
1917 :
1918 0 : if (CONSTANT_CLASS_P (t1) && !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
1919 : return false;
1920 :
1921 0 : switch (code1)
1922 : {
1923 0 : case VOID_CST:
1924 : /* There's only a single VOID_CST node, so we should never reach
1925 : here. */
1926 0 : rust_unreachable ();
1927 :
1928 0 : case INTEGER_CST:
1929 0 : return tree_int_cst_equal (t1, t2);
1930 :
1931 0 : case REAL_CST:
1932 0 : return real_identical (&TREE_REAL_CST (t1), &TREE_REAL_CST (t2));
1933 :
1934 0 : case STRING_CST:
1935 0 : return TREE_STRING_LENGTH (t1) == TREE_STRING_LENGTH (t2)
1936 0 : && !memcmp (TREE_STRING_POINTER (t1), TREE_STRING_POINTER (t2),
1937 0 : TREE_STRING_LENGTH (t1));
1938 :
1939 0 : case FIXED_CST:
1940 0 : return FIXED_VALUES_IDENTICAL (TREE_FIXED_CST (t1), TREE_FIXED_CST (t2));
1941 :
1942 0 : case COMPLEX_CST:
1943 0 : return rs_tree_equal (TREE_REALPART (t1), TREE_REALPART (t2))
1944 0 : && rs_tree_equal (TREE_IMAGPART (t1), TREE_IMAGPART (t2));
1945 :
1946 0 : case VECTOR_CST:
1947 0 : return operand_equal_p (t1, t2, OEP_ONLY_CONST);
1948 :
1949 0 : case CONSTRUCTOR:
1950 : /* We need to do this when determining whether or not two
1951 : non-type pointer to member function template arguments
1952 : are the same. */
1953 0 : if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))
1954 0 : || CONSTRUCTOR_NELTS (t1) != CONSTRUCTOR_NELTS (t2))
1955 : return false;
1956 : {
1957 : tree field, value;
1958 : unsigned int i;
1959 0 : FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t1), i, field, value)
1960 : {
1961 0 : constructor_elt *elt2 = CONSTRUCTOR_ELT (t2, i);
1962 0 : if (!rs_tree_equal (field, elt2->index)
1963 0 : || !rs_tree_equal (value, elt2->value))
1964 0 : return false;
1965 : }
1966 : }
1967 : return true;
1968 :
1969 0 : case TREE_LIST:
1970 0 : if (!rs_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2)))
1971 : return false;
1972 0 : if (!rs_tree_equal (TREE_VALUE (t1), TREE_VALUE (t2)))
1973 : return false;
1974 0 : return rs_tree_equal (TREE_CHAIN (t1), TREE_CHAIN (t2));
1975 :
1976 0 : case SAVE_EXPR:
1977 0 : return rs_tree_equal (TREE_OPERAND (t1, 0), TREE_OPERAND (t2, 0));
1978 :
1979 0 : case CALL_EXPR:
1980 0 : {
1981 0 : if (KOENIG_LOOKUP_P (t1) != KOENIG_LOOKUP_P (t2))
1982 : return false;
1983 :
1984 0 : if (!called_fns_equal (CALL_EXPR_FN (t1), CALL_EXPR_FN (t2)))
1985 : return false;
1986 :
1987 0 : call_expr_arg_iterator iter1, iter2;
1988 0 : init_call_expr_arg_iterator (t1, &iter1);
1989 0 : init_call_expr_arg_iterator (t2, &iter2);
1990 0 : if (iter1.n != iter2.n)
1991 : return false;
1992 :
1993 0 : while (more_call_expr_args_p (&iter1))
1994 : {
1995 0 : tree arg1 = next_call_expr_arg (&iter1);
1996 0 : tree arg2 = next_call_expr_arg (&iter2);
1997 :
1998 0 : gcc_checking_assert (arg1 && arg2);
1999 0 : if (!rs_tree_equal (arg1, arg2))
2000 : return false;
2001 : }
2002 :
2003 : return true;
2004 : }
2005 :
2006 0 : case TARGET_EXPR:
2007 0 : {
2008 0 : tree o1 = TREE_OPERAND (t1, 0);
2009 0 : tree o2 = TREE_OPERAND (t2, 0);
2010 :
2011 : /* Special case: if either target is an unallocated VAR_DECL,
2012 : it means that it's going to be unified with whatever the
2013 : TARGET_EXPR is really supposed to initialize, so treat it
2014 : as being equivalent to anything. */
2015 0 : if (VAR_P (o1) && DECL_NAME (o1) == NULL_TREE && !DECL_RTL_SET_P (o1))
2016 : /*Nop*/;
2017 0 : else if (VAR_P (o2) && DECL_NAME (o2) == NULL_TREE
2018 0 : && !DECL_RTL_SET_P (o2))
2019 : /*Nop*/;
2020 0 : else if (!rs_tree_equal (o1, o2))
2021 : return false;
2022 :
2023 0 : return rs_tree_equal (TREE_OPERAND (t1, 1), TREE_OPERAND (t2, 1));
2024 : }
2025 :
2026 0 : case PARM_DECL:
2027 : /* For comparing uses of parameters in late-specified return types
2028 : with an out-of-class definition of the function, but can also come
2029 : up for expressions that involve 'this' in a member function
2030 : template. */
2031 :
2032 0 : if (same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2033 : {
2034 0 : if (DECL_ARTIFICIAL (t1) ^ DECL_ARTIFICIAL (t2))
2035 : return false;
2036 0 : if (CONSTRAINT_VAR_P (t1) ^ CONSTRAINT_VAR_P (t2))
2037 : return false;
2038 0 : if (DECL_ARTIFICIAL (t1)
2039 0 : || (DECL_PARM_LEVEL (t1) == DECL_PARM_LEVEL (t2)
2040 0 : && DECL_PARM_INDEX (t1) == DECL_PARM_INDEX (t2)))
2041 : return true;
2042 : }
2043 : return false;
2044 :
2045 : case VAR_DECL:
2046 : case CONST_DECL:
2047 : case FIELD_DECL:
2048 : case FUNCTION_DECL:
2049 : case IDENTIFIER_NODE:
2050 : case SSA_NAME:
2051 : return false;
2052 :
2053 : case TREE_VEC:
2054 : return true;
2055 :
2056 0 : case NON_LVALUE_EXPR:
2057 0 : case VIEW_CONVERT_EXPR:
2058 : /* Used for location wrappers with possibly NULL types. */
2059 0 : if (!TREE_TYPE (t1) || !TREE_TYPE (t2))
2060 : {
2061 0 : if (TREE_TYPE (t1) || TREE_TYPE (t2))
2062 : return false;
2063 : break;
2064 : }
2065 :
2066 : default:
2067 : break;
2068 : }
2069 :
2070 0 : switch (TREE_CODE_CLASS (code1))
2071 : {
2072 0 : case tcc_unary:
2073 0 : case tcc_binary:
2074 0 : case tcc_comparison:
2075 0 : case tcc_expression:
2076 0 : case tcc_vl_exp:
2077 0 : case tcc_reference:
2078 0 : case tcc_statement:
2079 0 : {
2080 0 : int n = rs_tree_operand_length (t1);
2081 0 : if (TREE_CODE_CLASS (code1) == tcc_vl_exp
2082 0 : && n != TREE_OPERAND_LENGTH (t2))
2083 : return false;
2084 :
2085 0 : for (int i = 0; i < n; ++i)
2086 0 : if (!rs_tree_equal (TREE_OPERAND (t1, i), TREE_OPERAND (t2, i)))
2087 : return false;
2088 :
2089 : return true;
2090 : }
2091 :
2092 0 : case tcc_type:
2093 0 : return same_type_p (t1, t2);
2094 :
2095 0 : default:
2096 0 : rust_unreachable ();
2097 : }
2098 :
2099 : /* We can get here with --disable-checking. */
2100 : return false;
2101 : }
2102 :
2103 : // forked from gcc/cp/class.cc publicly_uniquely_derived_p
2104 :
2105 : /* TRUE iff TYPE is publicly & uniquely derived from PARENT. */
2106 :
2107 : bool
2108 0 : publicly_uniquely_derived_p (tree, tree)
2109 : {
2110 0 : return false;
2111 : }
2112 :
2113 : // forked from gcc/cp/typeck.cc comp_except_types
2114 :
2115 : /* Compare two exception specifier types for exactness or subsetness, if
2116 : allowed. Returns false for mismatch, true for match (same, or
2117 : derived and !exact).
2118 :
2119 : [except.spec] "If a class X ... objects of class X or any class publicly
2120 : and unambiguously derived from X. Similarly, if a pointer type Y * ...
2121 : exceptions of type Y * or that are pointers to any type publicly and
2122 : unambiguously derived from Y. Otherwise a function only allows exceptions
2123 : that have the same type ..."
2124 : This does not mention cv qualifiers and is different to what throw
2125 : [except.throw] and catch [except.catch] will do. They will ignore the
2126 : top level cv qualifiers, and allow qualifiers in the pointer to class
2127 : example.
2128 :
2129 : We implement the letter of the standard. */
2130 :
2131 : static bool
2132 0 : comp_except_types (tree a, tree b, bool exact)
2133 : {
2134 0 : if (same_type_p (a, b))
2135 : return true;
2136 0 : else if (!exact)
2137 : {
2138 0 : if (rs_type_quals (a) || rs_type_quals (b))
2139 0 : return false;
2140 :
2141 0 : if (TYPE_PTR_P (a) && TYPE_PTR_P (b))
2142 : {
2143 0 : a = TREE_TYPE (a);
2144 0 : b = TREE_TYPE (b);
2145 0 : if (rs_type_quals (a) || rs_type_quals (b))
2146 0 : return false;
2147 : }
2148 :
2149 0 : if (TREE_CODE (a) != RECORD_TYPE || TREE_CODE (b) != RECORD_TYPE)
2150 : return false;
2151 :
2152 0 : if (publicly_uniquely_derived_p (a, b))
2153 : return true;
2154 : }
2155 : return false;
2156 : }
2157 :
2158 : // forked from gcc/cp/typeck.cc comp_except_specs
2159 :
2160 : /* Return true if TYPE1 and TYPE2 are equivalent exception specifiers.
2161 : If EXACT is ce_derived, T2 can be stricter than T1 (according to 15.4/5).
2162 : If EXACT is ce_type, the C++17 type compatibility rules apply.
2163 : If EXACT is ce_normal, the compatibility rules in 15.4/3 apply.
2164 : If EXACT is ce_exact, the specs must be exactly the same. Exception lists
2165 : are unordered, but we've already filtered out duplicates. Most lists will
2166 : be in order, we should try to make use of that. */
2167 :
2168 : bool
2169 0 : comp_except_specs (const_tree t1, const_tree t2, int exact)
2170 : {
2171 0 : const_tree probe;
2172 0 : const_tree base;
2173 0 : int length = 0;
2174 :
2175 0 : if (t1 == t2)
2176 : return true;
2177 :
2178 : /* First handle noexcept. */
2179 0 : if (exact < ce_exact)
2180 : {
2181 0 : if (exact == ce_type
2182 0 : && (canonical_eh_spec (const_cast<tree> (t1))
2183 0 : == canonical_eh_spec (const_cast<tree> (t2))))
2184 : return true;
2185 :
2186 : /* noexcept(false) is compatible with no exception-specification,
2187 : and less strict than any spec. */
2188 0 : if (t1 == noexcept_false_spec)
2189 0 : return t2 == NULL_TREE || exact == ce_derived;
2190 : /* Even a derived noexcept(false) is compatible with no
2191 : exception-specification. */
2192 0 : if (t2 == noexcept_false_spec)
2193 0 : return t1 == NULL_TREE;
2194 :
2195 : /* Otherwise, if we aren't looking for an exact match, noexcept is
2196 : equivalent to throw(). */
2197 0 : if (t1 == noexcept_true_spec)
2198 0 : t1 = empty_except_spec;
2199 0 : if (t2 == noexcept_true_spec)
2200 0 : t2 = empty_except_spec;
2201 : }
2202 :
2203 : /* If any noexcept is left, it is only comparable to itself;
2204 : either we're looking for an exact match or we're redeclaring a
2205 : template with dependent noexcept. */
2206 0 : if ((t1 && TREE_PURPOSE (t1)) || (t2 && TREE_PURPOSE (t2)))
2207 0 : return (t1 && t2 && rs_tree_equal (TREE_PURPOSE (t1), TREE_PURPOSE (t2)));
2208 :
2209 0 : if (t1 == NULL_TREE) /* T1 is ... */
2210 0 : return t2 == NULL_TREE || exact == ce_derived;
2211 0 : if (!TREE_VALUE (t1)) /* t1 is EMPTY */
2212 0 : return t2 != NULL_TREE && !TREE_VALUE (t2);
2213 0 : if (t2 == NULL_TREE) /* T2 is ... */
2214 : return false;
2215 0 : if (TREE_VALUE (t1) && !TREE_VALUE (t2)) /* T2 is EMPTY, T1 is not */
2216 0 : return exact == ce_derived;
2217 :
2218 : /* Neither set is ... or EMPTY, make sure each part of T2 is in T1.
2219 : Count how many we find, to determine exactness. For exact matching and
2220 : ordered T1, T2, this is an O(n) operation, otherwise its worst case is
2221 : O(nm). */
2222 0 : for (base = t1; t2 != NULL_TREE; t2 = TREE_CHAIN (t2))
2223 : {
2224 0 : for (probe = base; probe != NULL_TREE; probe = TREE_CHAIN (probe))
2225 : {
2226 0 : tree a = TREE_VALUE (probe);
2227 0 : tree b = TREE_VALUE (t2);
2228 :
2229 0 : if (comp_except_types (a, b, exact))
2230 : {
2231 0 : if (probe == base && exact > ce_derived)
2232 0 : base = TREE_CHAIN (probe);
2233 0 : length++;
2234 0 : break;
2235 : }
2236 : }
2237 0 : if (probe == NULL_TREE)
2238 : return false;
2239 : }
2240 0 : return exact == ce_derived || base == NULL_TREE || length == list_length (t1);
2241 : }
2242 :
2243 : // forked from gcc/cp/typeck.cc compparms
2244 :
2245 : /* Subroutines of `comptypes'. */
2246 :
2247 : /* Return true if two parameter type lists PARMS1 and PARMS2 are
2248 : equivalent in the sense that functions with those parameter types
2249 : can have equivalent types. The two lists must be equivalent,
2250 : element by element. */
2251 :
2252 : bool
2253 0 : compparms (const_tree parms1, const_tree parms2)
2254 : {
2255 0 : const_tree t1, t2;
2256 :
2257 : /* An unspecified parmlist matches any specified parmlist
2258 : whose argument types don't need default promotions. */
2259 :
2260 0 : for (t1 = parms1, t2 = parms2; t1 || t2;
2261 0 : t1 = TREE_CHAIN (t1), t2 = TREE_CHAIN (t2))
2262 : {
2263 : /* If one parmlist is shorter than the other,
2264 : they fail to match. */
2265 0 : if (!t1 || !t2)
2266 : return false;
2267 0 : if (!same_type_p (TREE_VALUE (t1), TREE_VALUE (t2)))
2268 : return false;
2269 : }
2270 : return true;
2271 : }
2272 :
2273 : /* Set TYPE_CANONICAL like build_array_type_1, but using
2274 : build_cplus_array_type. */
2275 :
2276 : static void
2277 0 : set_array_type_canon (tree t, tree elt_type, tree index_type, bool dep)
2278 : {
2279 : /* Set the canonical type for this new node. */
2280 0 : if (TYPE_STRUCTURAL_EQUALITY_P (elt_type)
2281 0 : || (index_type && TYPE_STRUCTURAL_EQUALITY_P (index_type)))
2282 0 : SET_TYPE_STRUCTURAL_EQUALITY (t);
2283 0 : else if (TYPE_CANONICAL (elt_type) != elt_type
2284 0 : || (index_type && TYPE_CANONICAL (index_type) != index_type))
2285 0 : TYPE_CANONICAL (t)
2286 0 : = build_cplus_array_type (TYPE_CANONICAL (elt_type),
2287 0 : index_type ? TYPE_CANONICAL (index_type)
2288 : : index_type,
2289 : dep);
2290 : else
2291 0 : TYPE_CANONICAL (t) = t;
2292 0 : }
2293 :
2294 : // forked from gcc/cp/tree.cc cplus_array_info
2295 :
2296 : struct cplus_array_info
2297 : {
2298 : tree type;
2299 : tree domain;
2300 : };
2301 :
2302 : // forked from gcc/cp/tree.cc cplus_array_hasher
2303 :
2304 : struct rust_cplus_array_hasher : ggc_ptr_hash<tree_node>
2305 : {
2306 : typedef cplus_array_info *compare_type;
2307 :
2308 : static hashval_t hash (tree t);
2309 : static bool equal (tree, cplus_array_info *);
2310 : };
2311 :
2312 : /* Hash an ARRAY_TYPE. K is really of type `tree'. */
2313 :
2314 : hashval_t
2315 0 : rust_cplus_array_hasher::hash (tree t)
2316 : {
2317 0 : hashval_t hash;
2318 :
2319 0 : hash = TYPE_UID (TREE_TYPE (t));
2320 0 : if (TYPE_DOMAIN (t))
2321 0 : hash ^= TYPE_UID (TYPE_DOMAIN (t));
2322 0 : return hash;
2323 : }
2324 :
2325 : /* Compare two ARRAY_TYPEs. K1 is really of type `tree', K2 is really
2326 : of type `cplus_array_info*'. */
2327 :
2328 : bool
2329 0 : rust_cplus_array_hasher::equal (tree t1, cplus_array_info *t2)
2330 : {
2331 0 : return (TREE_TYPE (t1) == t2->type && TYPE_DOMAIN (t1) == t2->domain);
2332 : }
2333 :
2334 : // forked from gcc/cp/tree.cc cplus_array_htab
2335 :
2336 : /* Hash table containing dependent array types, which are unsuitable for
2337 : the language-independent type hash table. */
2338 : static GTY (()) hash_table<rust_cplus_array_hasher> *cplus_array_htab;
2339 :
2340 : // forked from gcc/cp/tree.cc is_byte_access_type
2341 :
2342 : /* Returns true if TYPE is char, unsigned char, or std::byte. */
2343 :
2344 : bool
2345 0 : is_byte_access_type (tree type)
2346 : {
2347 0 : type = TYPE_MAIN_VARIANT (type);
2348 0 : if (type == char_type_node || type == unsigned_char_type_node)
2349 : return true;
2350 :
2351 0 : return (TREE_CODE (type) == ENUMERAL_TYPE && TYPE_CONTEXT (type) == std_node
2352 0 : && !strcmp ("byte", TYPE_NAME_STRING (type)));
2353 : }
2354 :
2355 : // forked from gcc/cp/tree.cc build_cplus_array_type
2356 :
2357 : /* Like build_array_type, but handle special C++ semantics: an array of a
2358 : variant element type is a variant of the array of the main variant of
2359 : the element type. IS_DEPENDENT is -ve if we should determine the
2360 : dependency. Otherwise its bool value indicates dependency. */
2361 :
2362 : tree
2363 0 : build_cplus_array_type (tree elt_type, tree index_type, int dependent)
2364 : {
2365 0 : tree t;
2366 :
2367 0 : if (elt_type == error_mark_node || index_type == error_mark_node)
2368 : return error_mark_node;
2369 :
2370 0 : if (dependent < 0)
2371 : dependent = 0;
2372 :
2373 0 : if (elt_type != TYPE_MAIN_VARIANT (elt_type))
2374 : /* Start with an array of the TYPE_MAIN_VARIANT. */
2375 0 : t = build_cplus_array_type (TYPE_MAIN_VARIANT (elt_type), index_type,
2376 : dependent);
2377 0 : else if (dependent)
2378 : {
2379 : /* Since type_hash_canon calls layout_type, we need to use our own
2380 : hash table. */
2381 0 : cplus_array_info cai;
2382 0 : hashval_t hash;
2383 :
2384 0 : if (cplus_array_htab == NULL)
2385 0 : cplus_array_htab = hash_table<rust_cplus_array_hasher>::create_ggc (61);
2386 :
2387 0 : hash = TYPE_UID (elt_type);
2388 0 : if (index_type)
2389 0 : hash ^= TYPE_UID (index_type);
2390 0 : cai.type = elt_type;
2391 0 : cai.domain = index_type;
2392 :
2393 0 : tree *e = cplus_array_htab->find_slot_with_hash (&cai, hash, INSERT);
2394 0 : if (*e)
2395 : /* We have found the type: we're done. */
2396 0 : return (tree) *e;
2397 : else
2398 : {
2399 : /* Build a new array type. */
2400 0 : t = build_min_array_type (elt_type, index_type);
2401 :
2402 : /* Store it in the hash table. */
2403 0 : *e = t;
2404 :
2405 : /* Set the canonical type for this new node. */
2406 0 : set_array_type_canon (t, elt_type, index_type, dependent);
2407 :
2408 : /* Mark it as dependent now, this saves time later. */
2409 0 : TYPE_DEPENDENT_P_VALID (t) = true;
2410 0 : TYPE_DEPENDENT_P (t) = true;
2411 : }
2412 : }
2413 : else
2414 : {
2415 0 : bool typeless_storage = is_byte_access_type (elt_type);
2416 0 : t = build_array_type (elt_type, index_type, typeless_storage);
2417 :
2418 : /* Mark as non-dependenty now, this will save time later. */
2419 0 : TYPE_DEPENDENT_P_VALID (t) = true;
2420 : }
2421 :
2422 : /* Now check whether we already have this array variant. */
2423 0 : if (elt_type != TYPE_MAIN_VARIANT (elt_type))
2424 : {
2425 : tree m = t;
2426 0 : for (t = m; t; t = TYPE_NEXT_VARIANT (t))
2427 0 : if (TREE_TYPE (t) == elt_type && TYPE_NAME (t) == NULL_TREE
2428 0 : && TYPE_ATTRIBUTES (t) == NULL_TREE)
2429 : break;
2430 0 : if (!t)
2431 : {
2432 0 : t = build_min_array_type (elt_type, index_type);
2433 : /* Mark dependency now, this saves time later. */
2434 0 : TYPE_DEPENDENT_P_VALID (t) = true;
2435 0 : TYPE_DEPENDENT_P (t) = dependent;
2436 0 : set_array_type_canon (t, elt_type, index_type, dependent);
2437 0 : if (!dependent)
2438 : {
2439 0 : layout_type (t);
2440 : /* Make sure sizes are shared with the main variant.
2441 : layout_type can't be called after setting TYPE_NEXT_VARIANT,
2442 : as it will overwrite alignment etc. of all variants. */
2443 0 : TYPE_SIZE (t) = TYPE_SIZE (m);
2444 0 : TYPE_SIZE_UNIT (t) = TYPE_SIZE_UNIT (m);
2445 0 : TYPE_TYPELESS_STORAGE (t) = TYPE_TYPELESS_STORAGE (m);
2446 : }
2447 :
2448 0 : TYPE_MAIN_VARIANT (t) = m;
2449 0 : TYPE_NEXT_VARIANT (t) = TYPE_NEXT_VARIANT (m);
2450 0 : TYPE_NEXT_VARIANT (m) = t;
2451 : }
2452 : }
2453 :
2454 : /* Avoid spurious warnings with VLAs (c++/54583). */
2455 0 : if (TYPE_SIZE (t) && EXPR_P (TYPE_SIZE (t)))
2456 0 : suppress_warning (TYPE_SIZE (t), OPT_Wunused);
2457 :
2458 : /* Push these needs up to the ARRAY_TYPE so that initialization takes
2459 : place more easily. */
2460 0 : bool needs_ctor
2461 0 : = (TYPE_NEEDS_CONSTRUCTING (t) = TYPE_NEEDS_CONSTRUCTING (elt_type));
2462 0 : bool needs_dtor = (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
2463 0 : = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (elt_type));
2464 :
2465 0 : if (!dependent && t == TYPE_MAIN_VARIANT (t) && !COMPLETE_TYPE_P (t)
2466 0 : && COMPLETE_TYPE_P (elt_type))
2467 : {
2468 : /* The element type has been completed since the last time we saw
2469 : this array type; update the layout and 'tor flags for any variants
2470 : that need it. */
2471 0 : layout_type (t);
2472 0 : for (tree v = TYPE_NEXT_VARIANT (t); v; v = TYPE_NEXT_VARIANT (v))
2473 : {
2474 0 : TYPE_NEEDS_CONSTRUCTING (v) = needs_ctor;
2475 0 : TYPE_HAS_NONTRIVIAL_DESTRUCTOR (v) = needs_dtor;
2476 : }
2477 : }
2478 :
2479 : return t;
2480 : }
2481 :
2482 : // forked from gcc/cp/tree.cc cp_build_qualified_type_real
2483 :
2484 : /* Make a variant of TYPE, qualified with the TYPE_QUALS. Handles
2485 : arrays correctly. In particular, if TYPE is an array of T's, and
2486 : TYPE_QUALS is non-empty, returns an array of qualified T's.
2487 :
2488 : FLAGS determines how to deal with ill-formed qualifications. If
2489 : tf_ignore_bad_quals is set, then bad qualifications are dropped
2490 : (this is permitted if TYPE was introduced via a typedef or template
2491 : type parameter). If bad qualifications are dropped and tf_warning
2492 : is set, then a warning is issued for non-const qualifications. If
2493 : tf_ignore_bad_quals is not set and tf_error is not set, we
2494 : return error_mark_node. Otherwise, we issue an error, and ignore
2495 : the qualifications.
2496 :
2497 : Qualification of a reference type is valid when the reference came
2498 : via a typedef or template type argument. [dcl.ref] No such
2499 : dispensation is provided for qualifying a function type. [dcl.fct]
2500 : DR 295 queries this and the proposed resolution brings it into line
2501 : with qualifying a reference. We implement the DR. We also behave
2502 : in a similar manner for restricting non-pointer types. */
2503 :
2504 : tree
2505 18 : rs_build_qualified_type_real (tree type, int type_quals,
2506 : tsubst_flags_t complain)
2507 : {
2508 18 : tree result;
2509 18 : int bad_quals = TYPE_UNQUALIFIED;
2510 :
2511 18 : if (type == error_mark_node)
2512 : return type;
2513 :
2514 18 : if (type_quals == rs_type_quals (type))
2515 : return type;
2516 :
2517 9 : if (TREE_CODE (type) == ARRAY_TYPE)
2518 : {
2519 : /* In C++, the qualification really applies to the array element
2520 : type. Obtain the appropriately qualified element type. */
2521 0 : tree t;
2522 0 : tree element_type
2523 0 : = rs_build_qualified_type_real (TREE_TYPE (type), type_quals, complain);
2524 :
2525 0 : if (element_type == error_mark_node)
2526 : return error_mark_node;
2527 :
2528 : /* See if we already have an identically qualified type. Tests
2529 : should be equivalent to those in check_qualified_type. */
2530 0 : for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
2531 0 : if (TREE_TYPE (t) == element_type && TYPE_NAME (t) == TYPE_NAME (type)
2532 0 : && TYPE_CONTEXT (t) == TYPE_CONTEXT (type)
2533 0 : && attribute_list_equal (TYPE_ATTRIBUTES (t),
2534 0 : TYPE_ATTRIBUTES (type)))
2535 : break;
2536 :
2537 0 : if (!t)
2538 : {
2539 : /* If we already know the dependentness, tell the array type
2540 : constructor. This is important for module streaming, as we cannot
2541 : dynamically determine that on read in. */
2542 0 : t = build_cplus_array_type (element_type, TYPE_DOMAIN (type),
2543 0 : TYPE_DEPENDENT_P_VALID (type)
2544 0 : ? int (TYPE_DEPENDENT_P (type))
2545 : : -1);
2546 :
2547 : /* Keep the typedef name. */
2548 0 : if (TYPE_NAME (t) != TYPE_NAME (type))
2549 : {
2550 0 : t = build_variant_type_copy (t);
2551 0 : TYPE_NAME (t) = TYPE_NAME (type);
2552 0 : SET_TYPE_ALIGN (t, TYPE_ALIGN (type));
2553 0 : TYPE_USER_ALIGN (t) = TYPE_USER_ALIGN (type);
2554 : }
2555 : }
2556 :
2557 : /* Even if we already had this variant, we update
2558 : TYPE_NEEDS_CONSTRUCTING and TYPE_HAS_NONTRIVIAL_DESTRUCTOR in case
2559 : they changed since the variant was originally created.
2560 :
2561 : This seems hokey; if there is some way to use a previous
2562 : variant *without* coming through here,
2563 : TYPE_NEEDS_CONSTRUCTING will never be updated. */
2564 0 : TYPE_NEEDS_CONSTRUCTING (t)
2565 0 : = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (element_type));
2566 0 : TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
2567 0 : = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TYPE_MAIN_VARIANT (element_type));
2568 0 : return t;
2569 : }
2570 :
2571 : /* A reference or method type shall not be cv-qualified.
2572 : [dcl.ref], [dcl.fct]. This used to be an error, but as of DR 295
2573 : (in CD1) we always ignore extra cv-quals on functions. */
2574 :
2575 : /* [dcl.ref/1] Cv-qualified references are ill-formed except when
2576 : the cv-qualifiers are introduced through the use of a typedef-name
2577 : ([dcl.typedef], [temp.param]) or decltype-specifier
2578 : ([dcl.type.decltype]),in which case the cv-qualifiers are
2579 : ignored. */
2580 9 : if (type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)
2581 0 : && (TYPE_REF_P (type) || FUNC_OR_METHOD_TYPE_P (type)))
2582 : {
2583 0 : if (TYPE_REF_P (type)
2584 0 : && (!typedef_variant_p (type) || FUNC_OR_METHOD_TYPE_P (type)))
2585 : bad_quals |= type_quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
2586 0 : type_quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
2587 : }
2588 :
2589 : /* But preserve any function-cv-quals on a FUNCTION_TYPE. */
2590 9 : if (TREE_CODE (type) == FUNCTION_TYPE)
2591 0 : type_quals |= type_memfn_quals (type);
2592 :
2593 : /* A restrict-qualified type must be a pointer (or reference)
2594 : to object or incomplete type. */
2595 9 : if ((type_quals & TYPE_QUAL_RESTRICT) && TREE_CODE (type) != TYPENAME_TYPE
2596 0 : && !INDIRECT_TYPE_P (type))
2597 : {
2598 0 : bad_quals |= TYPE_QUAL_RESTRICT;
2599 0 : type_quals &= ~TYPE_QUAL_RESTRICT;
2600 : }
2601 :
2602 9 : if (bad_quals == TYPE_UNQUALIFIED || (complain & tf_ignore_bad_quals))
2603 : /*OK*/;
2604 0 : else if (!(complain & tf_error))
2605 0 : return error_mark_node;
2606 : else
2607 : {
2608 0 : tree bad_type = build_qualified_type (ptr_type_node, bad_quals);
2609 0 : error ("%qV qualifiers cannot be applied to %qT", bad_type, type);
2610 : }
2611 :
2612 : /* Retrieve (or create) the appropriately qualified variant. */
2613 9 : result = build_qualified_type (type, type_quals);
2614 :
2615 9 : return result;
2616 : }
2617 :
2618 : // forked from gcc/cp/c-common.cc vector_targets_convertible_p
2619 :
2620 : /* vector_targets_convertible_p is used for vector pointer types. The
2621 : callers perform various checks that the qualifiers are satisfactory,
2622 : while OTOH vector_targets_convertible_p ignores the number of elements
2623 : in the vectors. That's fine with vector pointers as we can consider,
2624 : say, a vector of 8 elements as two consecutive vectors of 4 elements,
2625 : and that does not require and conversion of the pointer values.
2626 : In contrast, vector_types_convertible_p and
2627 : vector_types_compatible_elements_p are used for vector value types. */
2628 : /* True if pointers to distinct types T1 and T2 can be converted to
2629 : each other without an explicit cast. Only returns true for opaque
2630 : vector types. */
2631 : bool
2632 0 : vector_targets_convertible_p (const_tree t1, const_tree t2)
2633 : {
2634 0 : if (VECTOR_TYPE_P (t1) && VECTOR_TYPE_P (t2)
2635 0 : && (TYPE_VECTOR_OPAQUE (t1) || TYPE_VECTOR_OPAQUE (t2))
2636 0 : && tree_int_cst_equal (TYPE_SIZE (t1), TYPE_SIZE (t2)))
2637 : return true;
2638 :
2639 : return false;
2640 : }
2641 :
2642 : // forked from gcc/cp/typeck.cc comp_array_types
2643 :
2644 : /* Compare the array types T1 and T2. CB says how we should behave when
2645 : comparing array bounds: bounds_none doesn't allow dimensionless arrays,
2646 : bounds_either says than any array can be [], bounds_first means that
2647 : onlt T1 can be an array with unknown bounds. STRICT is true if
2648 : qualifiers must match when comparing the types of the array elements. */
2649 :
2650 : static bool
2651 0 : comp_array_types (const_tree t1, const_tree t2, compare_bounds_t cb,
2652 : bool strict)
2653 : {
2654 0 : tree d1;
2655 0 : tree d2;
2656 0 : tree max1, max2;
2657 :
2658 0 : if (t1 == t2)
2659 : return true;
2660 :
2661 : /* The type of the array elements must be the same. */
2662 0 : if (strict ? !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2))
2663 0 : : !similar_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2664 : return false;
2665 :
2666 0 : d1 = TYPE_DOMAIN (t1);
2667 0 : d2 = TYPE_DOMAIN (t2);
2668 :
2669 0 : if (d1 == d2)
2670 : return true;
2671 :
2672 : /* If one of the arrays is dimensionless, and the other has a
2673 : dimension, they are of different types. However, it is valid to
2674 : write:
2675 :
2676 : extern int a[];
2677 : int a[3];
2678 :
2679 : by [basic.link]:
2680 :
2681 : declarations for an array object can specify
2682 : array types that differ by the presence or absence of a major
2683 : array bound (_dcl.array_). */
2684 0 : if (!d1 && d2)
2685 0 : return cb >= bounds_either;
2686 0 : else if (d1 && !d2)
2687 0 : return cb == bounds_either;
2688 :
2689 : /* Check that the dimensions are the same. */
2690 :
2691 0 : if (!rs_tree_equal (TYPE_MIN_VALUE (d1), TYPE_MIN_VALUE (d2)))
2692 : return false;
2693 0 : max1 = TYPE_MAX_VALUE (d1);
2694 0 : max2 = TYPE_MAX_VALUE (d2);
2695 :
2696 0 : if (!rs_tree_equal (max1, max2))
2697 : return false;
2698 :
2699 : return true;
2700 : }
2701 :
2702 : // forked from gcc/cp/typeck.cc same_type_ignoring_top_level_qualifiers_p
2703 :
2704 : /* Returns nonzero iff TYPE1 and TYPE2 are the same type, ignoring
2705 : top-level qualifiers. */
2706 :
2707 : bool
2708 9 : same_type_ignoring_top_level_qualifiers_p (tree type1, tree type2)
2709 : {
2710 9 : if (type1 == error_mark_node || type2 == error_mark_node)
2711 : return false;
2712 9 : if (type1 == type2)
2713 : return true;
2714 :
2715 8 : type1 = rs_build_qualified_type (type1, TYPE_UNQUALIFIED);
2716 8 : type2 = rs_build_qualified_type (type2, TYPE_UNQUALIFIED);
2717 8 : return same_type_p (type1, type2);
2718 : }
2719 :
2720 : // forked from gcc/cp/typeck.cc comp_ptr_ttypes_const
2721 :
2722 : /* Return true if TO and FROM (both of which are POINTER_TYPEs or
2723 : pointer-to-member types) are the same, ignoring cv-qualification at
2724 : all levels. CB says how we should behave when comparing array bounds. */
2725 :
2726 : bool
2727 0 : comp_ptr_ttypes_const (tree to, tree from, compare_bounds_t cb)
2728 : {
2729 0 : bool is_opaque_pointer = false;
2730 :
2731 0 : for (;; to = TREE_TYPE (to), from = TREE_TYPE (from))
2732 : {
2733 0 : if (TREE_CODE (to) != TREE_CODE (from))
2734 : return false;
2735 :
2736 0 : if (TREE_CODE (from) == OFFSET_TYPE
2737 0 : && same_type_p (TYPE_OFFSET_BASETYPE (from),
2738 : TYPE_OFFSET_BASETYPE (to)))
2739 0 : continue;
2740 :
2741 0 : if (VECTOR_TYPE_P (to))
2742 0 : is_opaque_pointer = vector_targets_convertible_p (to, from);
2743 :
2744 0 : if (TREE_CODE (to) == ARRAY_TYPE
2745 : /* Ignore cv-qualification, but if we see e.g. int[3] and int[4],
2746 : we must fail. */
2747 0 : && !comp_array_types (to, from, cb, /*strict=*/false))
2748 : return false;
2749 :
2750 : /* CWG 330 says we need to look through arrays. */
2751 0 : if (!TYPE_PTR_P (to) && TREE_CODE (to) != ARRAY_TYPE)
2752 0 : return (is_opaque_pointer
2753 0 : || same_type_ignoring_top_level_qualifiers_p (to, from));
2754 : }
2755 : }
2756 :
2757 : // forked from gcc/cp/typeck.cc similar_type_p
2758 :
2759 : /* Returns nonzero iff TYPE1 and TYPE2 are similar, as per [conv.qual]. */
2760 :
2761 : bool
2762 0 : similar_type_p (tree type1, tree type2)
2763 : {
2764 0 : if (type1 == error_mark_node || type2 == error_mark_node)
2765 : return false;
2766 :
2767 : /* Informally, two types are similar if, ignoring top-level cv-qualification:
2768 : * they are the same type; or
2769 : * they are both pointers, and the pointed-to types are similar; or
2770 : * they are both pointers to member of the same class, and the types of
2771 : the pointed-to members are similar; or
2772 : * they are both arrays of the same size or both arrays of unknown bound,
2773 : and the array element types are similar. */
2774 :
2775 0 : if (same_type_ignoring_top_level_qualifiers_p (type1, type2))
2776 : return true;
2777 :
2778 0 : if ((TYPE_PTR_P (type1) && TYPE_PTR_P (type2))
2779 0 : || (TYPE_PTRDATAMEM_P (type1) && TYPE_PTRDATAMEM_P (type2))
2780 0 : || (TREE_CODE (type1) == ARRAY_TYPE && TREE_CODE (type2) == ARRAY_TYPE))
2781 0 : return comp_ptr_ttypes_const (type1, type2, bounds_either);
2782 :
2783 : return false;
2784 : }
2785 :
2786 : // forked from gcc/cp/typeck.cc structural_comptypes
2787 : // note: this fork only handles strict == COMPARE_STRICT
2788 : // if you pass in any other value for strict i.e. COMPARE_BASE,
2789 : // COMPARE_DERIVED, COMPARE_REDECLARATION or COMPARE_STRUCTURAL
2790 : // see the original function in gcc/cp/typeck.cc and port the required bits
2791 : // specifically under case UNION_TYPE.
2792 :
2793 : /* Subroutine in comptypes. */
2794 :
2795 : static bool
2796 3 : structural_comptypes (tree t1, tree t2, int strict)
2797 : {
2798 : /* Both should be types that are not obviously the same. */
2799 3 : gcc_checking_assert (t1 != t2 && TYPE_P (t1) && TYPE_P (t2));
2800 :
2801 3 : if (TYPE_PTRMEMFUNC_P (t1))
2802 0 : t1 = TYPE_PTRMEMFUNC_FN_TYPE (t1);
2803 3 : if (TYPE_PTRMEMFUNC_P (t2))
2804 0 : t2 = TYPE_PTRMEMFUNC_FN_TYPE (t2);
2805 :
2806 : /* Different classes of types can't be compatible. */
2807 3 : if (TREE_CODE (t1) != TREE_CODE (t2))
2808 : return false;
2809 :
2810 : /* Qualifiers must match. For array types, we will check when we
2811 : recur on the array element types. */
2812 3 : if (TREE_CODE (t1) != ARRAY_TYPE && rs_type_quals (t1) != rs_type_quals (t2))
2813 : return false;
2814 1 : if (TREE_CODE (t1) == FUNCTION_TYPE
2815 1 : && type_memfn_quals (t1) != type_memfn_quals (t2))
2816 : return false;
2817 : /* Need to check this before TYPE_MAIN_VARIANT.
2818 : FIXME function qualifiers should really change the main variant. */
2819 1 : if (FUNC_OR_METHOD_TYPE_P (t1))
2820 : {
2821 0 : if (type_memfn_rqual (t1) != type_memfn_rqual (t2))
2822 : return false;
2823 0 : if (/* cxx_dialect >= cxx17 && */
2824 0 : !comp_except_specs (TYPE_RAISES_EXCEPTIONS (t1),
2825 0 : TYPE_RAISES_EXCEPTIONS (t2), ce_type))
2826 : return false;
2827 : }
2828 :
2829 : /* Allow for two different type nodes which have essentially the same
2830 : definition. Note that we already checked for equality of the type
2831 : qualifiers (just above). */
2832 1 : if (TREE_CODE (t1) != ARRAY_TYPE
2833 1 : && TYPE_MAIN_VARIANT (t1) == TYPE_MAIN_VARIANT (t2))
2834 : return true;
2835 :
2836 : /* Compare the types. Return false on known not-same. Break on not
2837 : known. Never return true from this switch -- you'll break
2838 : specialization comparison. */
2839 0 : switch (TREE_CODE (t1))
2840 : {
2841 : case VOID_TYPE:
2842 : case BOOLEAN_TYPE:
2843 : /* All void and bool types are the same. */
2844 : break;
2845 :
2846 0 : case OPAQUE_TYPE:
2847 0 : case INTEGER_TYPE:
2848 0 : case FIXED_POINT_TYPE:
2849 0 : case REAL_TYPE:
2850 : /* With these nodes, we can't determine type equivalence by
2851 : looking at what is stored in the nodes themselves, because
2852 : two nodes might have different TYPE_MAIN_VARIANTs but still
2853 : represent the same type. For example, wchar_t and int could
2854 : have the same properties (TYPE_PRECISION, TYPE_MIN_VALUE,
2855 : TYPE_MAX_VALUE, etc.), but have different TYPE_MAIN_VARIANTs
2856 : and are distinct types. On the other hand, int and the
2857 : following typedef
2858 :
2859 : typedef int INT __attribute((may_alias));
2860 :
2861 : have identical properties, different TYPE_MAIN_VARIANTs, but
2862 : represent the same type. The canonical type system keeps
2863 : track of equivalence in this case, so we fall back on it. */
2864 0 : if (TYPE_CANONICAL (t1) != TYPE_CANONICAL (t2))
2865 : return false;
2866 :
2867 : /* We don't need or want the attribute comparison. */
2868 : return true;
2869 :
2870 : case RECORD_TYPE:
2871 : case UNION_TYPE:
2872 : return false;
2873 :
2874 0 : case OFFSET_TYPE:
2875 0 : if (!comptypes (TYPE_OFFSET_BASETYPE (t1), TYPE_OFFSET_BASETYPE (t2),
2876 : strict & ~COMPARE_REDECLARATION))
2877 : return false;
2878 0 : if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2879 : return false;
2880 : break;
2881 :
2882 0 : case REFERENCE_TYPE:
2883 0 : if (TYPE_REF_IS_RVALUE (t1) != TYPE_REF_IS_RVALUE (t2))
2884 : return false;
2885 : /* fall through to checks for pointer types */
2886 0 : gcc_fallthrough ();
2887 :
2888 0 : case POINTER_TYPE:
2889 0 : if (TYPE_MODE (t1) != TYPE_MODE (t2)
2890 0 : || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2891 0 : return false;
2892 : break;
2893 :
2894 0 : case METHOD_TYPE:
2895 0 : case FUNCTION_TYPE:
2896 : /* Exception specs and memfn_rquals were checked above. */
2897 0 : if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2898 : return false;
2899 0 : if (!compparms (TYPE_ARG_TYPES (t1), TYPE_ARG_TYPES (t2)))
2900 : return false;
2901 : break;
2902 :
2903 0 : case ARRAY_TYPE:
2904 : /* Target types must match incl. qualifiers. */
2905 0 : if (!comp_array_types (t1, t2,
2906 0 : ((strict & COMPARE_REDECLARATION) ? bounds_either
2907 : : bounds_none),
2908 : /*strict=*/true))
2909 : return false;
2910 : break;
2911 :
2912 0 : case COMPLEX_TYPE:
2913 0 : if (!same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2914 : return false;
2915 : break;
2916 :
2917 0 : case VECTOR_TYPE:
2918 0 : if (gnu_vector_type_p (t1) != gnu_vector_type_p (t2)
2919 0 : || maybe_ne (TYPE_VECTOR_SUBPARTS (t1), TYPE_VECTOR_SUBPARTS (t2))
2920 0 : || !same_type_p (TREE_TYPE (t1), TREE_TYPE (t2)))
2921 0 : return false;
2922 : break;
2923 :
2924 : default:
2925 : return false;
2926 : }
2927 :
2928 : /* If we get here, we know that from a target independent POV the
2929 : types are the same. Make sure the target attributes are also
2930 : the same. */
2931 0 : if (!comp_type_attributes (t1, t2))
2932 : return false;
2933 :
2934 : return true;
2935 : }
2936 :
2937 : // forked from gcc/cp/typeck.cc comptypes
2938 :
2939 : /* Return true if T1 and T2 are related as allowed by STRICT. STRICT
2940 : is a bitwise-or of the COMPARE_* flags. */
2941 :
2942 : bool
2943 11 : comptypes (tree t1, tree t2, int strict)
2944 : {
2945 11 : gcc_checking_assert (t1 && t2);
2946 :
2947 : /* TYPE_ARGUMENT_PACKS are not really types. */
2948 11 : gcc_checking_assert (TREE_CODE (t1) != TYPE_ARGUMENT_PACK
2949 : && TREE_CODE (t2) != TYPE_ARGUMENT_PACK);
2950 :
2951 11 : if (t1 == t2)
2952 : return true;
2953 :
2954 : /* Suppress errors caused by previously reported errors. */
2955 3 : if (t1 == error_mark_node || t2 == error_mark_node)
2956 : return false;
2957 :
2958 3 : if (strict == COMPARE_STRICT)
2959 : {
2960 3 : if (TYPE_STRUCTURAL_EQUALITY_P (t1) || TYPE_STRUCTURAL_EQUALITY_P (t2))
2961 : /* At least one of the types requires structural equality, so
2962 : perform a deep check. */
2963 1 : return structural_comptypes (t1, t2, strict);
2964 :
2965 2 : if (!flag_checking)
2966 0 : return TYPE_CANONICAL (t1) == TYPE_CANONICAL (t2);
2967 : else
2968 2 : return structural_comptypes (t1, t2, strict);
2969 : }
2970 0 : else if (strict == COMPARE_STRUCTURAL)
2971 0 : return structural_comptypes (t1, t2, COMPARE_STRICT);
2972 : else
2973 0 : return structural_comptypes (t1, t2, strict);
2974 : }
2975 :
2976 : // forked from gcc/cp/decl.cc next_initializable_field
2977 :
2978 : /* FIELD is an element of TYPE_FIELDS or NULL. In the former case, the value
2979 : returned is the next FIELD_DECL (possibly FIELD itself) that can be
2980 : initialized. If there are no more such fields, the return value
2981 : will be NULL. */
2982 :
2983 : tree
2984 0 : next_initializable_field (tree field)
2985 : {
2986 0 : while (field
2987 0 : && (TREE_CODE (field) != FIELD_DECL || DECL_UNNAMED_BIT_FIELD (field)
2988 0 : || (DECL_ARTIFICIAL (field)
2989 : /* Don't skip vptr fields. We might see them when we're
2990 : called from reduced_constant_expression_p. */
2991 0 : && !DECL_VIRTUAL_P (field))))
2992 0 : field = DECL_CHAIN (field);
2993 :
2994 0 : return field;
2995 : }
2996 :
2997 : // forked from gcc/cp/call.cc sufficient_parms_p
2998 :
2999 : /* Returns nonzero if PARMLIST consists of only default parms,
3000 : ellipsis, and/or undeduced parameter packs. */
3001 :
3002 : bool
3003 0 : sufficient_parms_p (const_tree parmlist)
3004 : {
3005 0 : for (; parmlist && parmlist != void_list_node;
3006 0 : parmlist = TREE_CHAIN (parmlist))
3007 0 : if (!TREE_PURPOSE (parmlist))
3008 : return false;
3009 : return true;
3010 : }
3011 :
3012 : // forked from gcc/cp/class.cc default_ctor_p
3013 :
3014 : /* Returns true if FN is a default constructor. */
3015 :
3016 : bool
3017 0 : default_ctor_p (const_tree fn)
3018 : {
3019 0 : return (DECL_CONSTRUCTOR_P (fn)
3020 0 : && sufficient_parms_p (FUNCTION_FIRST_USER_PARMTYPE (fn)));
3021 : }
3022 :
3023 : // forked from gcc/cp/class.cc user_provided_p
3024 :
3025 : /* Returns true iff FN is a user-provided function, i.e. user-declared
3026 : and not defaulted at its first declaration. */
3027 :
3028 : bool
3029 0 : user_provided_p (tree fn)
3030 : {
3031 0 : return (!DECL_ARTIFICIAL (fn)
3032 0 : && !(DECL_INITIALIZED_IN_CLASS_P (fn)
3033 0 : && (DECL_DEFAULTED_FN (fn) || DECL_DELETED_FN (fn))));
3034 : }
3035 :
3036 : // forked from gcc/cp/class.cc type_has_non_user_provided_default_constructor
3037 :
3038 : /* Returns true iff class T has a non-user-provided (i.e. implicitly
3039 : declared or explicitly defaulted in the class body) default
3040 : constructor. */
3041 :
3042 : bool
3043 0 : type_has_non_user_provided_default_constructor (tree t)
3044 : {
3045 0 : if (!TYPE_HAS_DEFAULT_CONSTRUCTOR (t))
3046 : return false;
3047 0 : if (CLASSTYPE_LAZY_DEFAULT_CTOR (t))
3048 : return true;
3049 :
3050 0 : for (ovl_iterator iter (CLASSTYPE_CONSTRUCTORS (t)); iter; ++iter)
3051 : {
3052 0 : tree fn = *iter;
3053 0 : if (TREE_CODE (fn) == FUNCTION_DECL && default_ctor_p (fn)
3054 0 : && !user_provided_p (fn))
3055 0 : return true;
3056 : }
3057 :
3058 0 : return false;
3059 : }
3060 :
3061 : // forked from gcc/cp/class.cc default_init_uninitialized_part
3062 :
3063 : /* If default-initialization leaves part of TYPE uninitialized, returns
3064 : a DECL for the field or TYPE itself (DR 253). */
3065 :
3066 : tree
3067 0 : default_init_uninitialized_part (tree type)
3068 : {
3069 0 : tree t, r, binfo;
3070 0 : int i;
3071 :
3072 0 : type = strip_array_types (type);
3073 0 : if (!CLASS_TYPE_P (type))
3074 : return type;
3075 0 : if (!type_has_non_user_provided_default_constructor (type))
3076 : return NULL_TREE;
3077 0 : for (binfo = TYPE_BINFO (type), i = 0; BINFO_BASE_ITERATE (binfo, i, t); ++i)
3078 : {
3079 0 : r = default_init_uninitialized_part (BINFO_TYPE (t));
3080 0 : if (r)
3081 : return r;
3082 : }
3083 0 : for (t = next_initializable_field (TYPE_FIELDS (type)); t;
3084 0 : t = next_initializable_field (DECL_CHAIN (t)))
3085 0 : if (!DECL_INITIAL (t) && !DECL_ARTIFICIAL (t))
3086 : {
3087 0 : r = default_init_uninitialized_part (TREE_TYPE (t));
3088 0 : if (r)
3089 0 : return DECL_P (r) ? r : t;
3090 : }
3091 :
3092 : return NULL_TREE;
3093 : }
3094 :
3095 : // forked from gcc/cp/name-lookup.cc extract_conversion_operator
3096 :
3097 : /* FNS is an overload set of conversion functions. Return the
3098 : overloads converting to TYPE. */
3099 :
3100 : static tree
3101 0 : extract_conversion_operator (tree fns, tree type)
3102 : {
3103 0 : tree convs = NULL_TREE;
3104 0 : tree tpls = NULL_TREE;
3105 :
3106 0 : for (ovl_iterator iter (fns); iter; ++iter)
3107 : {
3108 0 : if (same_type_p (DECL_CONV_FN_TYPE (*iter), type))
3109 0 : convs = lookup_add (*iter, convs);
3110 : }
3111 :
3112 0 : if (!convs)
3113 0 : convs = tpls;
3114 :
3115 0 : return convs;
3116 : }
3117 :
3118 : // forked from gcc/cp/name-lookup.cc
3119 :
3120 : /* Look for NAME as an immediate member of KLASS (including
3121 : anon-members or unscoped enum member). TYPE_OR_FNS is zero for
3122 : regular search. >0 to get a type binding (if there is one) and <0
3123 : if you want (just) the member function binding.
3124 :
3125 : Use this if you do not want lazy member creation. */
3126 :
3127 : tree
3128 0 : get_class_binding_direct (tree klass, tree name, bool want_type)
3129 : {
3130 0 : gcc_checking_assert (RECORD_OR_UNION_TYPE_P (klass));
3131 :
3132 : /* Conversion operators can only be found by the marker conversion
3133 : operator name. */
3134 0 : bool conv_op = IDENTIFIER_CONV_OP_P (name);
3135 0 : tree lookup = conv_op ? conv_op_identifier : name;
3136 0 : tree val = NULL_TREE;
3137 0 : vec<tree, va_gc> *member_vec = CLASSTYPE_MEMBER_VEC (klass);
3138 :
3139 0 : if (COMPLETE_TYPE_P (klass) && member_vec)
3140 : {
3141 0 : val = member_vec_binary_search (member_vec, lookup);
3142 0 : if (!val)
3143 : ;
3144 0 : else if (STAT_HACK_P (val))
3145 0 : val = want_type ? STAT_TYPE (val) : STAT_DECL (val);
3146 0 : else if (want_type && !DECL_DECLARES_TYPE_P (val))
3147 0 : val = NULL_TREE;
3148 : }
3149 : else
3150 : {
3151 0 : if (member_vec && !want_type)
3152 0 : val = member_vec_linear_search (member_vec, lookup);
3153 :
3154 0 : if (!val || (TREE_CODE (val) == OVERLOAD && OVL_DEDUP_P (val)))
3155 : /* Dependent using declarations are a 'field', make sure we
3156 : return that even if we saw an overload already. */
3157 0 : if (tree field_val = fields_linear_search (klass, lookup, want_type))
3158 : {
3159 0 : if (!val)
3160 : val = field_val;
3161 0 : else if (TREE_CODE (field_val) == USING_DECL)
3162 0 : val = ovl_make (field_val, val);
3163 : }
3164 : }
3165 :
3166 : /* Extract the conversion operators asked for, unless the general
3167 : conversion operator was requested. */
3168 0 : if (val && conv_op)
3169 : {
3170 0 : gcc_checking_assert (OVL_FUNCTION (val) == conv_op_marker);
3171 0 : val = OVL_CHAIN (val);
3172 0 : if (tree type = TREE_TYPE (name))
3173 0 : val = extract_conversion_operator (val, type);
3174 : }
3175 :
3176 0 : return val;
3177 : }
3178 :
3179 : #if defined ENABLE_TREE_CHECKING
3180 :
3181 : // forked from gcc/cp/tree.cc lang_check_failed
3182 :
3183 : /* Complain that some language-specific thing hanging off a tree
3184 : node has been accessed improperly. */
3185 :
3186 : void
3187 0 : lang_check_failed (const char *file, int line, const char *function)
3188 : {
3189 0 : internal_error ("%<lang_*%> check: failed in %s, at %s:%d", function,
3190 : trim_filename (file), line);
3191 : }
3192 : #endif /* ENABLE_TREE_CHECKING */
3193 :
3194 : // forked from gcc/cp/tree.cc skip_artificial_parms_for
3195 :
3196 : /* Given a FUNCTION_DECL FN and a chain LIST, skip as many elements of LIST
3197 : as there are artificial parms in FN. */
3198 :
3199 : tree
3200 0 : skip_artificial_parms_for (const_tree fn, tree list)
3201 : {
3202 0 : if (DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
3203 0 : list = TREE_CHAIN (list);
3204 : else
3205 : return list;
3206 :
3207 0 : if (DECL_HAS_IN_CHARGE_PARM_P (fn))
3208 0 : list = TREE_CHAIN (list);
3209 0 : if (DECL_HAS_VTT_PARM_P (fn))
3210 0 : list = TREE_CHAIN (list);
3211 : return list;
3212 : }
3213 :
3214 : // forked from gcc/cp/class.cc in_class_defaulted_default_constructor
3215 :
3216 : /* Returns the defaulted constructor if T has one. Otherwise, returns
3217 : NULL_TREE. */
3218 :
3219 : tree
3220 0 : in_class_defaulted_default_constructor (tree t)
3221 : {
3222 0 : if (!TYPE_HAS_USER_CONSTRUCTOR (t))
3223 : return NULL_TREE;
3224 :
3225 0 : for (ovl_iterator iter (CLASSTYPE_CONSTRUCTORS (t)); iter; ++iter)
3226 : {
3227 0 : tree fn = *iter;
3228 :
3229 0 : if (DECL_DEFAULTED_IN_CLASS_P (fn) && default_ctor_p (fn))
3230 0 : return fn;
3231 : }
3232 :
3233 0 : return NULL_TREE;
3234 : }
3235 :
3236 : // forked from gcc/cp/constexpr.cc
3237 :
3238 : /* Returns true iff FUN is an instantiation of a constexpr function
3239 : template or a defaulted constexpr function. */
3240 :
3241 : bool
3242 0 : is_instantiation_of_constexpr (tree fun)
3243 : {
3244 0 : return ((DECL_DEFAULTED_FN (fun) && DECL_DECLARED_CONSTEXPR_P (fun)));
3245 : }
3246 :
3247 : // forked from gcc/cp/decl.cc check_for_uninitialized_const_var
3248 :
3249 : /* Issue an error message if DECL is an uninitialized const variable.
3250 : CONSTEXPR_CONTEXT_P is true when the function is called in a constexpr
3251 : context from potential_constant_expression. Returns true if all is well,
3252 : false otherwise. */
3253 :
3254 : bool
3255 0 : check_for_uninitialized_const_var (tree decl, bool constexpr_context_p,
3256 : tsubst_flags_t complain)
3257 : {
3258 0 : tree type = strip_array_types (TREE_TYPE (decl));
3259 :
3260 : /* ``Unless explicitly declared extern, a const object does not have
3261 : external linkage and must be initialized. ($8.4; $12.1)'' ARM
3262 : 7.1.6 */
3263 0 : if (VAR_P (decl) && !TYPE_REF_P (type) && (RS_TYPE_CONST_P (type))
3264 0 : && !DECL_NONTRIVIALLY_INITIALIZED_P (decl))
3265 : {
3266 0 : tree field = default_init_uninitialized_part (type);
3267 0 : if (!field)
3268 : return true;
3269 :
3270 0 : bool show_notes = true;
3271 :
3272 0 : if (!constexpr_context_p)
3273 : {
3274 0 : if (RS_TYPE_CONST_P (type))
3275 : {
3276 0 : if (complain & tf_error)
3277 0 : show_notes = permerror (DECL_SOURCE_LOCATION (decl),
3278 : "uninitialized %<const %D%>", decl);
3279 : }
3280 : else
3281 : {
3282 0 : if (!is_instantiation_of_constexpr (current_function_decl)
3283 0 : && (complain & tf_error))
3284 0 : error_at (DECL_SOURCE_LOCATION (decl),
3285 : "uninitialized variable %qD in %<constexpr%> "
3286 : "function",
3287 : decl);
3288 : else
3289 : show_notes = false;
3290 : }
3291 : }
3292 0 : else if (complain & tf_error)
3293 0 : error_at (DECL_SOURCE_LOCATION (decl),
3294 : "uninitialized variable %qD in %<constexpr%> context", decl);
3295 :
3296 0 : if (show_notes && CLASS_TYPE_P (type) && (complain & tf_error))
3297 : {
3298 : // tree defaulted_ctor;
3299 :
3300 : // inform (DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type)),
3301 : // "%q#T has no user-provided default constructor", type);
3302 : // defaulted_ctor = in_class_defaulted_default_constructor (type);
3303 : // if (defaulted_ctor)
3304 : // inform (DECL_SOURCE_LOCATION (defaulted_ctor),
3305 : // "constructor is not user-provided because it is "
3306 : // "explicitly defaulted in the class body");
3307 : // inform (DECL_SOURCE_LOCATION (field),
3308 : // "and the implicitly-defined constructor does not "
3309 : // "initialize %q#D",
3310 : // field);
3311 : }
3312 :
3313 0 : return false;
3314 : }
3315 :
3316 : return true;
3317 : }
3318 :
3319 : // forked from gcc/cp/tree.cc cv_unqualified
3320 :
3321 : /* Return TYPE with const and volatile removed. */
3322 :
3323 : tree
3324 2 : cv_unqualified (tree type)
3325 : {
3326 2 : int quals;
3327 :
3328 2 : if (type == error_mark_node)
3329 : return type;
3330 :
3331 2 : quals = rs_type_quals (type);
3332 2 : quals &= ~(TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE);
3333 2 : return rs_build_qualified_type (type, quals);
3334 : }
3335 :
3336 : /* The C and C++ parsers both use vectors to hold function arguments.
3337 : For efficiency, we keep a cache of unused vectors. This is the
3338 : cache. */
3339 :
3340 : typedef vec<tree, va_gc> *tree_gc_vec;
3341 : static GTY ((deletable)) vec<tree_gc_vec, va_gc> *tree_vector_cache;
3342 :
3343 : // forked from gcc/c-family/c-common.c make_tree_vector
3344 :
3345 : /* Return a new vector from the cache. If the cache is empty,
3346 : allocate a new vector. These vectors are GC'ed, so it is OK if the
3347 : pointer is not released.. */
3348 :
3349 : vec<tree, va_gc> *
3350 8451 : make_tree_vector (void)
3351 : {
3352 8451 : if (tree_vector_cache && !tree_vector_cache->is_empty ())
3353 6065 : return tree_vector_cache->pop ();
3354 : else
3355 : {
3356 : /* Passing 0 to vec::alloc returns NULL, and our callers require
3357 : that we always return a non-NULL value. The vector code uses
3358 : 4 when growing a NULL vector, so we do too. */
3359 2386 : vec<tree, va_gc> *v;
3360 2386 : vec_alloc (v, 4);
3361 2386 : return v;
3362 : }
3363 : }
3364 :
3365 : // forked from gcc/c-family/c-common.c release_tree_vector
3366 :
3367 : /* Release a vector of trees back to the cache. */
3368 :
3369 : void
3370 8451 : release_tree_vector (vec<tree, va_gc> *vec)
3371 : {
3372 8451 : if (vec != NULL)
3373 : {
3374 8451 : if (vec->allocated () >= 16)
3375 : /* Don't cache vecs that have expanded more than once. On a p64
3376 : target, vecs double in alloc size with each power of 2 elements, e.g
3377 : at 16 elements the alloc increases from 128 to 256 bytes. */
3378 0 : vec_free (vec);
3379 : else
3380 : {
3381 8451 : vec->truncate (0);
3382 8451 : vec_safe_push (tree_vector_cache, vec);
3383 : }
3384 : }
3385 8451 : }
3386 :
3387 : // forked from gcc/cp/cvt.cc instantiation_dependent_expression_p
3388 :
3389 : /* As above, but also check value-dependence of the expression as a whole. */
3390 :
3391 : bool
3392 0 : instantiation_dependent_expression_p (tree)
3393 : {
3394 0 : return false;
3395 : }
3396 :
3397 : // forked from gcc/cp/cvt.cc cp_get_callee
3398 :
3399 : /* If CALL is a call, return the callee; otherwise null. */
3400 :
3401 : tree
3402 0 : cp_get_callee (tree call)
3403 : {
3404 0 : if (call == NULL_TREE)
3405 : return call;
3406 0 : else if (TREE_CODE (call) == CALL_EXPR)
3407 0 : return CALL_EXPR_FN (call);
3408 : return NULL_TREE;
3409 : }
3410 :
3411 : // forked from gcc/cp/typeck.cc build_nop
3412 :
3413 : /* Return a NOP_EXPR converting EXPR to TYPE. */
3414 :
3415 : tree
3416 0 : build_nop (tree type, tree expr)
3417 : {
3418 0 : if (type == error_mark_node || error_operand_p (expr))
3419 : return expr;
3420 0 : return build1_loc (EXPR_LOCATION (expr), NOP_EXPR, type, expr);
3421 : }
3422 :
3423 : // forked from gcc/cp/tree.cc scalarish_type_p
3424 :
3425 : /* Returns 1 iff type T is something we want to treat as a scalar type for
3426 : the purpose of deciding whether it is trivial/POD/standard-layout. */
3427 :
3428 : bool
3429 2 : scalarish_type_p (const_tree t)
3430 : {
3431 2 : if (t == error_mark_node)
3432 : return 1;
3433 :
3434 2 : return (SCALAR_TYPE_P (t) || VECTOR_TYPE_P (t));
3435 : }
3436 :
3437 : // forked from gcc/cp/tree.cc type_has_nontrivial_copy_init
3438 :
3439 : /* Returns true iff copying an object of type T (including via move
3440 : constructor) is non-trivial. That is, T has no non-trivial copy
3441 : constructors and no non-trivial move constructors, and not all copy/move
3442 : constructors are deleted. This function implements the ABI notion of
3443 : non-trivial copy, which has diverged from the one in the standard. */
3444 :
3445 : bool
3446 0 : type_has_nontrivial_copy_init (const_tree)
3447 : {
3448 0 : return false;
3449 : }
3450 :
3451 : // forked from gcc/cp/tree.cc build_local_temp
3452 :
3453 : /* Return an undeclared local temporary of type TYPE for use in building a
3454 : TARGET_EXPR. */
3455 :
3456 : tree
3457 0 : build_local_temp (tree type)
3458 : {
3459 0 : tree slot = build_decl (input_location, VAR_DECL, NULL_TREE, type);
3460 0 : DECL_ARTIFICIAL (slot) = 1;
3461 0 : DECL_IGNORED_P (slot) = 1;
3462 0 : DECL_CONTEXT (slot) = current_function_decl;
3463 0 : layout_decl (slot, 0);
3464 0 : return slot;
3465 : }
3466 :
3467 : // forked from gcc/cp/lambda.cc is_normal_capture_proxy
3468 :
3469 : /* Returns true iff DECL is a capture proxy for a normal capture
3470 : (i.e. without explicit initializer). */
3471 :
3472 : bool
3473 0 : is_normal_capture_proxy (tree)
3474 : {
3475 0 : return false;
3476 : }
3477 :
3478 : // forked from gcc/cp/c-common.cc reject_gcc_builtin
3479 :
3480 : /* For an EXPR of a FUNCTION_TYPE that references a GCC built-in function
3481 : with no library fallback or for an ADDR_EXPR whose operand is such type
3482 : issues an error pointing to the location LOC.
3483 : Returns true when the expression has been diagnosed and false
3484 : otherwise. */
3485 :
3486 : bool
3487 0 : reject_gcc_builtin (const_tree expr, location_t loc /* = UNKNOWN_LOCATION */)
3488 : {
3489 0 : if (TREE_CODE (expr) == ADDR_EXPR)
3490 0 : expr = TREE_OPERAND (expr, 0);
3491 :
3492 0 : STRIP_ANY_LOCATION_WRAPPER (expr);
3493 :
3494 0 : if (TREE_TYPE (expr) && TREE_CODE (TREE_TYPE (expr)) == FUNCTION_TYPE
3495 0 : && TREE_CODE (expr) == FUNCTION_DECL
3496 : /* The intersection of DECL_BUILT_IN and DECL_IS_UNDECLARED_BUILTIN avoids
3497 : false positives for user-declared built-ins such as abs or
3498 : strlen, and for C++ operators new and delete.
3499 : The c_decl_implicit() test avoids false positives for implicitly
3500 : declared built-ins with library fallbacks (such as abs). */
3501 0 : && fndecl_built_in_p (expr) && DECL_IS_UNDECLARED_BUILTIN (expr)
3502 0 : && !DECL_ASSEMBLER_NAME_SET_P (expr))
3503 : {
3504 0 : if (loc == UNKNOWN_LOCATION)
3505 0 : loc = EXPR_LOC_OR_LOC (expr, input_location);
3506 :
3507 : /* Reject arguments that are built-in functions with
3508 : no library fallback. */
3509 0 : error_at (loc, "built-in function %qE must be directly called", expr);
3510 :
3511 0 : return true;
3512 : }
3513 :
3514 : return false;
3515 : }
3516 :
3517 : // forked from gcc/cp/typeck.cc is_bitfield_expr_with_lowered_type
3518 :
3519 : /* If EXP is a reference to a bit-field, and the type of EXP does not
3520 : match the declared type of the bit-field, return the declared type
3521 : of the bit-field. Otherwise, return NULL_TREE. */
3522 :
3523 : tree
3524 0 : is_bitfield_expr_with_lowered_type (const_tree exp)
3525 : {
3526 0 : switch (TREE_CODE (exp))
3527 : {
3528 0 : case COND_EXPR:
3529 0 : if (!is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1)
3530 0 : ? TREE_OPERAND (exp, 1)
3531 0 : : TREE_OPERAND (exp, 0)))
3532 : return NULL_TREE;
3533 0 : return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 2));
3534 :
3535 0 : case COMPOUND_EXPR:
3536 0 : return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 1));
3537 :
3538 0 : case MODIFY_EXPR:
3539 0 : case SAVE_EXPR:
3540 0 : case UNARY_PLUS_EXPR:
3541 0 : case PREDECREMENT_EXPR:
3542 0 : case PREINCREMENT_EXPR:
3543 0 : case POSTDECREMENT_EXPR:
3544 0 : case POSTINCREMENT_EXPR:
3545 0 : case NEGATE_EXPR:
3546 0 : case NON_LVALUE_EXPR:
3547 0 : case BIT_NOT_EXPR:
3548 0 : return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0));
3549 :
3550 0 : case COMPONENT_REF:
3551 0 : {
3552 0 : tree field;
3553 :
3554 0 : field = TREE_OPERAND (exp, 1);
3555 0 : if (TREE_CODE (field) != FIELD_DECL || !DECL_BIT_FIELD_TYPE (field))
3556 : return NULL_TREE;
3557 0 : if (same_type_ignoring_top_level_qualifiers_p (
3558 0 : TREE_TYPE (exp), DECL_BIT_FIELD_TYPE (field)))
3559 : return NULL_TREE;
3560 0 : return DECL_BIT_FIELD_TYPE (field);
3561 : }
3562 :
3563 0 : case VAR_DECL:
3564 0 : if (DECL_HAS_VALUE_EXPR_P (exp))
3565 0 : return is_bitfield_expr_with_lowered_type (
3566 0 : DECL_VALUE_EXPR (const_cast<tree> (exp)));
3567 : return NULL_TREE;
3568 :
3569 0 : case VIEW_CONVERT_EXPR:
3570 0 : if (location_wrapper_p (exp))
3571 0 : return is_bitfield_expr_with_lowered_type (TREE_OPERAND (exp, 0));
3572 : else
3573 : return NULL_TREE;
3574 :
3575 : default:
3576 : return NULL_TREE;
3577 : }
3578 : }
3579 :
3580 : // forked from gcc/cp/semantics.cc maybe_undo_parenthesized_ref
3581 :
3582 : /* If T is an id-expression obfuscated by force_paren_expr, undo the
3583 : obfuscation and return the underlying id-expression. Otherwise
3584 : return T. */
3585 :
3586 : tree
3587 0 : maybe_undo_parenthesized_ref (tree t)
3588 : {
3589 0 : if ((TREE_CODE (t) == PAREN_EXPR || TREE_CODE (t) == VIEW_CONVERT_EXPR)
3590 0 : && REF_PARENTHESIZED_P (t))
3591 0 : t = TREE_OPERAND (t, 0);
3592 :
3593 0 : return t;
3594 : }
3595 :
3596 : // forked from gcc/c-family/c-common.cc fold_offsetof
3597 :
3598 : /* Fold an offsetof-like expression. EXPR is a nested sequence of component
3599 : references with an INDIRECT_REF of a constant at the bottom; much like the
3600 : traditional rendering of offsetof as a macro. TYPE is the desired type of
3601 : the whole expression. Return the folded result. */
3602 :
3603 : tree
3604 0 : fold_offsetof (tree expr, tree type, enum tree_code ctx)
3605 : {
3606 0 : tree base, off, t;
3607 0 : tree_code code = TREE_CODE (expr);
3608 0 : switch (code)
3609 : {
3610 : case ERROR_MARK:
3611 : return expr;
3612 :
3613 0 : case VAR_DECL:
3614 0 : error ("cannot apply %<offsetof%> to static data member %qD", expr);
3615 0 : return error_mark_node;
3616 :
3617 0 : case CALL_EXPR:
3618 0 : case TARGET_EXPR:
3619 0 : error ("cannot apply %<offsetof%> when %<operator[]%> is overloaded");
3620 0 : return error_mark_node;
3621 :
3622 0 : case NOP_EXPR:
3623 0 : case INDIRECT_REF:
3624 0 : if (!TREE_CONSTANT (TREE_OPERAND (expr, 0)))
3625 : {
3626 0 : error ("cannot apply %<offsetof%> to a non constant address");
3627 0 : return error_mark_node;
3628 : }
3629 0 : return convert (type, TREE_OPERAND (expr, 0));
3630 :
3631 0 : case COMPONENT_REF:
3632 0 : base = fold_offsetof (TREE_OPERAND (expr, 0), type, code);
3633 0 : if (base == error_mark_node)
3634 : return base;
3635 :
3636 0 : t = TREE_OPERAND (expr, 1);
3637 0 : if (DECL_C_BIT_FIELD (t))
3638 : {
3639 0 : error ("attempt to take address of bit-field structure "
3640 : "member %qD",
3641 : t);
3642 0 : return error_mark_node;
3643 : }
3644 0 : off = size_binop_loc (input_location, PLUS_EXPR, DECL_FIELD_OFFSET (t),
3645 0 : size_int (tree_to_uhwi (DECL_FIELD_BIT_OFFSET (t))
3646 : / BITS_PER_UNIT));
3647 0 : break;
3648 :
3649 0 : case ARRAY_REF:
3650 0 : base = fold_offsetof (TREE_OPERAND (expr, 0), type, code);
3651 0 : if (base == error_mark_node)
3652 : return base;
3653 :
3654 0 : t = TREE_OPERAND (expr, 1);
3655 0 : STRIP_ANY_LOCATION_WRAPPER (t);
3656 :
3657 : /* Check if the offset goes beyond the upper bound of the array. */
3658 0 : if (TREE_CODE (t) == INTEGER_CST && tree_int_cst_sgn (t) >= 0)
3659 : {
3660 0 : tree upbound = array_ref_up_bound (expr);
3661 0 : if (upbound != NULL_TREE && TREE_CODE (upbound) == INTEGER_CST
3662 0 : && !tree_int_cst_equal (upbound,
3663 0 : TYPE_MAX_VALUE (TREE_TYPE (upbound))))
3664 : {
3665 0 : if (ctx != ARRAY_REF && ctx != COMPONENT_REF)
3666 0 : upbound = size_binop (PLUS_EXPR, upbound,
3667 : build_int_cst (TREE_TYPE (upbound), 1));
3668 0 : if (tree_int_cst_lt (upbound, t))
3669 : {
3670 0 : tree v;
3671 :
3672 0 : for (v = TREE_OPERAND (expr, 0);
3673 0 : TREE_CODE (v) == COMPONENT_REF; v = TREE_OPERAND (v, 0))
3674 0 : if (TREE_CODE (TREE_TYPE (TREE_OPERAND (v, 0)))
3675 : == RECORD_TYPE)
3676 : {
3677 0 : tree fld_chain = DECL_CHAIN (TREE_OPERAND (v, 1));
3678 0 : for (; fld_chain; fld_chain = DECL_CHAIN (fld_chain))
3679 0 : if (TREE_CODE (fld_chain) == FIELD_DECL)
3680 : break;
3681 :
3682 : if (fld_chain)
3683 : break;
3684 : }
3685 : /* Don't warn if the array might be considered a poor
3686 : man's flexible array member with a very permissive
3687 : definition thereof. */
3688 0 : if (TREE_CODE (v) == ARRAY_REF
3689 0 : || TREE_CODE (v) == COMPONENT_REF)
3690 0 : warning (OPT_Warray_bounds_,
3691 : "index %E denotes an offset "
3692 : "greater than size of %qT",
3693 0 : t, TREE_TYPE (TREE_OPERAND (expr, 0)));
3694 : }
3695 : }
3696 : }
3697 :
3698 0 : t = convert (sizetype, t);
3699 0 : off = size_binop (MULT_EXPR, TYPE_SIZE_UNIT (TREE_TYPE (expr)), t);
3700 0 : break;
3701 :
3702 0 : case COMPOUND_EXPR:
3703 : /* Handle static members of volatile structs. */
3704 0 : t = TREE_OPERAND (expr, 1);
3705 0 : gcc_checking_assert (VAR_P (get_base_address (t)));
3706 : return fold_offsetof (t, type);
3707 :
3708 0 : default:
3709 0 : rust_unreachable ();
3710 : }
3711 :
3712 0 : if (!POINTER_TYPE_P (type))
3713 0 : return size_binop (PLUS_EXPR, base, convert (type, off));
3714 0 : return fold_build_pointer_plus (base, off);
3715 : }
3716 :
3717 : // forked from gcc/cp/tree.cc char_type_p
3718 :
3719 : /* Returns nonzero if TYPE is a character type, including wchar_t. */
3720 :
3721 : int
3722 0 : char_type_p (tree type)
3723 : {
3724 0 : return (same_type_p (type, char_type_node)
3725 0 : || same_type_p (type, unsigned_char_type_node)
3726 0 : || same_type_p (type, signed_char_type_node)
3727 0 : || same_type_p (type, char8_type_node)
3728 0 : || same_type_p (type, char16_type_node)
3729 0 : || same_type_p (type, char32_type_node)
3730 0 : || same_type_p (type, wchar_type_node));
3731 : }
3732 :
3733 : // forked from gcc/cp/pt.cc resolve_nondeduced_context
3734 :
3735 : /* Core DR 115: In contexts where deduction is done and fails, or in
3736 : contexts where deduction is not done, if a template argument list is
3737 : specified and it, along with any default template arguments, identifies
3738 : a single function template specialization, then the template-id is an
3739 : lvalue for the function template specialization. */
3740 :
3741 : tree
3742 0 : resolve_nondeduced_context (tree orig_expr, tsubst_flags_t)
3743 : {
3744 0 : return orig_expr;
3745 : }
3746 :
3747 : // forked from gcc/cp/pt.cc instantiate_non_dependent_or_null
3748 :
3749 : /* Like instantiate_non_dependent_expr, but return NULL_TREE rather than
3750 : an uninstantiated expression. */
3751 :
3752 : tree
3753 0 : instantiate_non_dependent_or_null (tree expr)
3754 : {
3755 0 : if (expr == NULL_TREE)
3756 : return NULL_TREE;
3757 :
3758 : return expr;
3759 : }
3760 :
3761 : // forked from gcc/cp/pt.cc resolve_nondeduced_context_or_error
3762 :
3763 : /* As above, but error out if the expression remains overloaded. */
3764 :
3765 : tree
3766 0 : resolve_nondeduced_context_or_error (tree exp, tsubst_flags_t complain)
3767 : {
3768 0 : exp = resolve_nondeduced_context (exp, complain);
3769 0 : if (type_unknown_p (exp))
3770 : {
3771 0 : if (complain & tf_error)
3772 0 : cxx_incomplete_type_error (exp, TREE_TYPE (exp));
3773 0 : return error_mark_node;
3774 : }
3775 : return exp;
3776 : }
3777 :
3778 : // forked from gcc/cp/tree.cc really_overloaded_fn
3779 :
3780 : /* Returns true iff X is an expression for an overloaded function
3781 : whose type cannot be known without performing overload
3782 : resolution. */
3783 :
3784 : bool
3785 0 : really_overloaded_fn (tree x)
3786 : {
3787 0 : return is_overloaded_fn (x) == 2;
3788 : }
3789 :
3790 : // forked from gcc/cp/typeck..cc invalid_nonstatic_memfn_p
3791 :
3792 : /* EXPR is being used in a context that is not a function call.
3793 : Enforce:
3794 :
3795 : [expr.ref]
3796 :
3797 : The expression can be used only as the left-hand operand of a
3798 : member function call.
3799 :
3800 : [expr.mptr.operator]
3801 :
3802 : If the result of .* or ->* is a function, then that result can be
3803 : used only as the operand for the function call operator ().
3804 :
3805 : by issuing an error message if appropriate. Returns true iff EXPR
3806 : violates these rules. */
3807 :
3808 : bool
3809 0 : invalid_nonstatic_memfn_p (location_t loc, tree expr, tsubst_flags_t complain)
3810 : {
3811 0 : if (expr == NULL_TREE)
3812 : return false;
3813 : /* Don't enforce this in MS mode. */
3814 0 : if (flag_ms_extensions)
3815 : return false;
3816 0 : if (is_overloaded_fn (expr) && !really_overloaded_fn (expr))
3817 0 : expr = get_first_fn (expr);
3818 0 : if (DECL_NONSTATIC_MEMBER_FUNCTION_P (expr))
3819 : {
3820 0 : if (complain & tf_error)
3821 : {
3822 0 : if (DECL_P (expr))
3823 : {
3824 0 : error_at (loc, "invalid use of non-static member function %qD",
3825 : expr);
3826 0 : inform (DECL_SOURCE_LOCATION (expr), "declared here");
3827 : }
3828 : else
3829 0 : error_at (loc,
3830 : "invalid use of non-static member function of "
3831 : "type %qT",
3832 0 : TREE_TYPE (expr));
3833 : }
3834 0 : return true;
3835 : }
3836 : return false;
3837 : }
3838 :
3839 : // forked from gcc/cp/call.cc strip_top_quals
3840 :
3841 : tree
3842 0 : strip_top_quals (tree t)
3843 : {
3844 0 : if (TREE_CODE (t) == ARRAY_TYPE)
3845 : return t;
3846 0 : return rs_build_qualified_type (t, 0);
3847 : }
3848 :
3849 : // forked from gcc/cp/typeck2.cc cxx_incomplete_type_inform
3850 :
3851 : /* Print an inform about the declaration of the incomplete type TYPE. */
3852 :
3853 : // void
3854 : // cxx_incomplete_type_inform (const_tree type)
3855 : // {
3856 : // if (!TYPE_MAIN_DECL (type))
3857 : // return;
3858 :
3859 : // location_t loc = DECL_SOURCE_LOCATION (TYPE_MAIN_DECL (type));
3860 : // tree ptype = strip_top_quals (const_cast<tree> (type));
3861 :
3862 : // if (current_class_type && TYPE_BEING_DEFINED (current_class_type)
3863 : // && same_type_p (ptype, current_class_type))
3864 : // inform (loc,
3865 : // "definition of %q#T is not complete until "
3866 : // "the closing brace",
3867 : // ptype);
3868 : // else
3869 : // inform (loc, "forward declaration of %q#T", ptype);
3870 : // }
3871 :
3872 : // forked from gcc/cp/typeck2.cc cxx_incomplete_type_diagnostic
3873 :
3874 : /* Print an error message for invalid use of an incomplete type.
3875 : VALUE is the expression that was used (or 0 if that isn't known)
3876 : and TYPE is the type that was invalid. DIAG_KIND indicates the
3877 : type of diagnostic (see diagnostics/kinds.def). */
3878 :
3879 : void
3880 0 : cxx_incomplete_type_diagnostic (location_t loc, const_tree value,
3881 : const_tree type,
3882 : enum diagnostics::kind diag_kind)
3883 : {
3884 : // bool is_decl = false, complained = false;
3885 :
3886 0 : gcc_assert (diag_kind == diagnostics::kind::warning
3887 : || diag_kind == diagnostics::kind::pedwarn
3888 : || diag_kind == diagnostics::kind::error);
3889 :
3890 : /* Avoid duplicate error message. */
3891 0 : if (TREE_CODE (type) == ERROR_MARK)
3892 : return;
3893 :
3894 0 : if (value)
3895 : {
3896 0 : STRIP_ANY_LOCATION_WRAPPER (value);
3897 :
3898 0 : if (VAR_P (value) || TREE_CODE (value) == PARM_DECL
3899 : || TREE_CODE (value) == FIELD_DECL)
3900 : {
3901 : // complained = emit_diagnostic (diag_kind, DECL_SOURCE_LOCATION
3902 : // (value),
3903 : // 0, "%qD has incomplete type", value);
3904 : // is_decl = true;
3905 : }
3906 : }
3907 0 : retry:
3908 : /* We must print an error message. Be clever about what it says. */
3909 :
3910 0 : switch (TREE_CODE (type))
3911 : {
3912 : // case RECORD_TYPE:
3913 : // case UNION_TYPE:
3914 : // case ENUMERAL_TYPE:
3915 : // if (!is_decl)
3916 : // complained
3917 : // = emit_diagnostic (diag_kind, loc, 0,
3918 : // "invalid use of incomplete type %q#T", type);
3919 : // if (complained)
3920 : // cxx_incomplete_type_inform (type);
3921 : // break;
3922 :
3923 0 : case VOID_TYPE:
3924 0 : emit_diagnostic (diag_kind, loc, 0, "invalid use of %qT", type);
3925 0 : break;
3926 :
3927 0 : case ARRAY_TYPE:
3928 0 : if (TYPE_DOMAIN (type))
3929 : {
3930 0 : type = TREE_TYPE (type);
3931 0 : goto retry;
3932 : }
3933 0 : emit_diagnostic (diag_kind, loc, 0,
3934 : "invalid use of array with unspecified bounds");
3935 0 : break;
3936 :
3937 0 : case OFFSET_TYPE:
3938 0 : bad_member:
3939 0 : {
3940 0 : tree member = TREE_OPERAND (value, 1);
3941 0 : if (is_overloaded_fn (member))
3942 0 : member = get_first_fn (member);
3943 :
3944 0 : if (DECL_FUNCTION_MEMBER_P (member) && !flag_ms_extensions)
3945 : {
3946 0 : gcc_rich_location richloc (loc);
3947 : /* If "member" has no arguments (other than "this"), then
3948 : add a fix-it hint. */
3949 0 : if (type_num_arguments (TREE_TYPE (member)) == 1)
3950 0 : richloc.add_fixit_insert_after ("()");
3951 0 : emit_diagnostic (diag_kind, &richloc, 0,
3952 : "invalid use of member function %qD "
3953 : "(did you forget the %<()%> ?)",
3954 : member);
3955 0 : }
3956 : else
3957 0 : emit_diagnostic (diag_kind, loc, 0,
3958 : "invalid use of member %qD "
3959 : "(did you forget the %<&%> ?)",
3960 : member);
3961 : }
3962 : break;
3963 :
3964 0 : case LANG_TYPE:
3965 0 : if (type == init_list_type_node)
3966 : {
3967 0 : emit_diagnostic (diag_kind, loc, 0,
3968 : "invalid use of brace-enclosed initializer list");
3969 0 : break;
3970 : }
3971 0 : gcc_assert (type == unknown_type_node);
3972 0 : if (value && TREE_CODE (value) == COMPONENT_REF)
3973 0 : goto bad_member;
3974 0 : else if (value && TREE_CODE (value) == ADDR_EXPR)
3975 0 : emit_diagnostic (diag_kind, loc, 0,
3976 : "address of overloaded function with no contextual "
3977 : "type information");
3978 0 : else if (value && TREE_CODE (value) == OVERLOAD)
3979 0 : emit_diagnostic (
3980 0 : diag_kind, loc, 0,
3981 : "overloaded function with no contextual type information");
3982 : else
3983 0 : emit_diagnostic (
3984 0 : diag_kind, loc, 0,
3985 : "insufficient contextual information to determine type");
3986 : break;
3987 :
3988 0 : default:
3989 0 : rust_unreachable ();
3990 : }
3991 : }
3992 :
3993 : // forked from gcc/cp/decl2.cc decl_constant_var_p
3994 :
3995 : /* Nonzero for a VAR_DECL whose value can be used in a constant expression.
3996 :
3997 : [expr.const]
3998 :
3999 : An integral constant-expression can only involve ... const
4000 : variables of integral or enumeration types initialized with
4001 : constant expressions ...
4002 :
4003 : C++0x also allows constexpr variables and temporaries initialized
4004 : with constant expressions. We handle the former here, but the latter
4005 : are just folded away in cxx_eval_constant_expression.
4006 :
4007 : The standard does not require that the expression be non-volatile.
4008 : G++ implements the proposed correction in DR 457. */
4009 :
4010 : bool
4011 0 : decl_constant_var_p (tree decl)
4012 : {
4013 0 : if (!decl_maybe_constant_var_p (decl))
4014 : return false;
4015 :
4016 0 : return DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl);
4017 : }
4018 :
4019 : // forked from gcc/cp/decl.cc undeduced_auto_decl
4020 :
4021 : /* Returns true iff DECL is a variable or function declared with an auto type
4022 : that has not yet been deduced to a real type. */
4023 :
4024 : bool
4025 0 : undeduced_auto_decl (tree)
4026 : {
4027 0 : return false;
4028 : }
4029 :
4030 : // forked from gcc/cp/decl.cc require_deduced_type
4031 :
4032 : /* Complain if DECL has an undeduced return type. */
4033 :
4034 : bool
4035 0 : require_deduced_type (tree, tsubst_flags_t)
4036 : {
4037 0 : return true;
4038 : }
4039 :
4040 : /* Return the location of a tree passed to %+ formats. */
4041 :
4042 : location_t
4043 0 : location_of (tree t)
4044 : {
4045 0 : if (TYPE_P (t))
4046 : {
4047 0 : t = TYPE_MAIN_DECL (t);
4048 0 : if (t == NULL_TREE)
4049 0 : return input_location;
4050 : }
4051 0 : else if (TREE_CODE (t) == OVERLOAD)
4052 0 : t = OVL_FIRST (t);
4053 :
4054 0 : if (DECL_P (t))
4055 0 : return DECL_SOURCE_LOCATION (t);
4056 :
4057 0 : return EXPR_LOCATION (t);
4058 : }
4059 :
4060 : /* For element type ELT_TYPE, return the appropriate type of the heap object
4061 : containing such element(s). COOKIE_SIZE is NULL or the size of cookie
4062 : in bytes. FULL_SIZE is NULL if it is unknown how big the heap allocation
4063 : will be, otherwise size of the heap object. If COOKIE_SIZE is NULL,
4064 : return array type ELT_TYPE[FULL_SIZE / sizeof(ELT_TYPE)], otherwise return
4065 : struct { size_t[COOKIE_SIZE/sizeof(size_t)]; ELT_TYPE[N]; }
4066 : where N is nothing (flexible array member) if FULL_SIZE is NULL, otherwise
4067 : it is computed such that the size of the struct fits into FULL_SIZE. */
4068 :
4069 : tree
4070 0 : build_new_constexpr_heap_type (tree elt_type, tree cookie_size, tree full_size)
4071 : {
4072 0 : gcc_assert (cookie_size == NULL_TREE || tree_fits_uhwi_p (cookie_size));
4073 0 : gcc_assert (full_size == NULL_TREE || tree_fits_uhwi_p (full_size));
4074 0 : unsigned HOST_WIDE_INT csz = cookie_size ? tree_to_uhwi (cookie_size) : 0;
4075 0 : tree itype2 = NULL_TREE;
4076 0 : if (full_size)
4077 : {
4078 0 : unsigned HOST_WIDE_INT fsz = tree_to_uhwi (full_size);
4079 0 : gcc_assert (fsz >= csz);
4080 0 : fsz -= csz;
4081 0 : fsz /= int_size_in_bytes (elt_type);
4082 0 : itype2 = build_index_type (size_int (fsz - 1));
4083 0 : if (!cookie_size)
4084 0 : return build_cplus_array_type (elt_type, itype2);
4085 : }
4086 : else
4087 0 : gcc_assert (cookie_size);
4088 0 : csz /= int_size_in_bytes (sizetype);
4089 0 : tree itype1 = build_index_type (size_int (csz - 1));
4090 0 : tree atype1 = build_cplus_array_type (sizetype, itype1);
4091 0 : tree atype2 = build_cplus_array_type (elt_type, itype2);
4092 0 : tree rtype = cxx_make_type (RECORD_TYPE);
4093 0 : TYPE_NAME (rtype) = heap_identifier;
4094 0 : tree fld1 = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, atype1);
4095 0 : tree fld2 = build_decl (UNKNOWN_LOCATION, FIELD_DECL, NULL_TREE, atype2);
4096 0 : DECL_FIELD_CONTEXT (fld1) = rtype;
4097 0 : DECL_FIELD_CONTEXT (fld2) = rtype;
4098 0 : DECL_ARTIFICIAL (fld1) = true;
4099 0 : DECL_ARTIFICIAL (fld2) = true;
4100 0 : TYPE_FIELDS (rtype) = fld1;
4101 0 : DECL_CHAIN (fld1) = fld2;
4102 0 : layout_type (rtype);
4103 0 : return rtype;
4104 : }
4105 :
4106 : // forked from gcc/cp/class.cc field_poverlapping_p
4107 :
4108 : /* Return true iff FIELD_DECL DECL is potentially overlapping. */
4109 :
4110 : static bool
4111 0 : field_poverlapping_p (tree decl)
4112 : {
4113 0 : return lookup_attribute ("no_unique_address", DECL_ATTRIBUTES (decl));
4114 : }
4115 :
4116 : // forked from gcc/cp/class.cc is_empty_field
4117 :
4118 : /* Return true iff DECL is an empty field, either for an empty base or a
4119 : [[no_unique_address]] data member. */
4120 :
4121 : bool
4122 0 : is_empty_field (tree decl)
4123 : {
4124 0 : if (!decl || TREE_CODE (decl) != FIELD_DECL)
4125 : return false;
4126 :
4127 0 : bool r = (is_empty_class (TREE_TYPE (decl)) && (field_poverlapping_p (decl)));
4128 :
4129 : /* Empty fields should have size zero. */
4130 0 : gcc_checking_assert (!r || integer_zerop (DECL_SIZE (decl)));
4131 :
4132 : return r;
4133 : }
4134 :
4135 : // forked from gcc/cp/call.cc in_immediate_context
4136 :
4137 : /* Return true if in an immediate function context, or an unevaluated operand,
4138 : or a subexpression of an immediate invocation. */
4139 :
4140 : bool
4141 0 : in_immediate_context ()
4142 : {
4143 0 : return false;
4144 : }
4145 :
4146 : // forked from gcc/cp/cvt.cc cp_get_fndecl_from_callee
4147 :
4148 : /* FN is the callee of a CALL_EXPR or AGGR_INIT_EXPR; return the FUNCTION_DECL
4149 : if we can. */
4150 :
4151 : tree
4152 0 : rs_get_fndecl_from_callee (tree fn, bool fold /* = true */)
4153 : {
4154 0 : if (fn == NULL_TREE)
4155 : return fn;
4156 0 : if (TREE_CODE (fn) == FUNCTION_DECL)
4157 : return fn;
4158 0 : tree type = TREE_TYPE (fn);
4159 0 : if (type == NULL_TREE || !INDIRECT_TYPE_P (type))
4160 : return NULL_TREE;
4161 0 : if (fold)
4162 0 : fn = Compile::maybe_constant_init (fn);
4163 0 : STRIP_NOPS (fn);
4164 0 : if (TREE_CODE (fn) == ADDR_EXPR || TREE_CODE (fn) == FDESC_EXPR)
4165 0 : fn = TREE_OPERAND (fn, 0);
4166 0 : if (TREE_CODE (fn) == FUNCTION_DECL)
4167 : return fn;
4168 : return NULL_TREE;
4169 : }
4170 :
4171 : // forked from gcc/cp/cvt.cc cp_get_callee_fndecl_nofold
4172 : tree
4173 0 : rs_get_callee_fndecl_nofold (tree call)
4174 : {
4175 0 : return rs_get_fndecl_from_callee (cp_get_callee (call), false);
4176 : }
4177 :
4178 : // forked from gcc/cp/init.cc is_class_type
4179 :
4180 : /* Report an error if TYPE is not a user-defined, class type. If
4181 : OR_ELSE is nonzero, give an error message. */
4182 :
4183 : int
4184 0 : is_class_type (tree type, int or_else)
4185 : {
4186 0 : if (type == error_mark_node)
4187 : return 0;
4188 :
4189 0 : if (!CLASS_TYPE_P (type))
4190 : {
4191 0 : if (or_else)
4192 0 : error ("%qT is not a class type", type);
4193 0 : return 0;
4194 : }
4195 : return 1;
4196 : }
4197 :
4198 : // forked from gcc/cp/decl.cc lookup_enumerator
4199 :
4200 : /* Look for an enumerator with the given NAME within the enumeration
4201 : type ENUMTYPE. This routine is used primarily for qualified name
4202 : lookup into an enumerator in C++0x, e.g.,
4203 :
4204 : enum class Color { Red, Green, Blue };
4205 :
4206 : Color color = Color::Red;
4207 :
4208 : Returns the value corresponding to the enumerator, or
4209 : NULL_TREE if no such enumerator was found. */
4210 : tree
4211 0 : lookup_enumerator (tree enumtype, tree name)
4212 : {
4213 0 : tree e;
4214 0 : gcc_assert (enumtype && TREE_CODE (enumtype) == ENUMERAL_TYPE);
4215 :
4216 0 : e = purpose_member (name, TYPE_VALUES (enumtype));
4217 0 : return e ? TREE_VALUE (e) : NULL_TREE;
4218 : }
4219 :
4220 : // forked from gcc/cp/init.cc constant_value_1
4221 : // commented out mark_used
4222 :
4223 : /* If DECL is a scalar enumeration constant or variable with a
4224 : constant initializer, return the initializer (or, its initializers,
4225 : recursively); otherwise, return DECL. If STRICT_P, the
4226 : initializer is only returned if DECL is a
4227 : constant-expression. If RETURN_AGGREGATE_CST_OK_P, it is ok to
4228 : return an aggregate constant. If UNSHARE_P, return an unshared
4229 : copy of the initializer. */
4230 :
4231 : static tree
4232 0 : constant_value_1 (tree decl, bool strict_p, bool return_aggregate_cst_ok_p,
4233 : bool unshare_p)
4234 : {
4235 0 : while (TREE_CODE (decl) == CONST_DECL || decl_constant_var_p (decl)
4236 0 : || (!strict_p && VAR_P (decl)
4237 0 : && RS_TYPE_CONST_NON_VOLATILE_P (TREE_TYPE (decl))))
4238 : {
4239 0 : tree init;
4240 : /* If DECL is a static data member in a template
4241 : specialization, we must instantiate it here. The
4242 : initializer for the static data member is not processed
4243 : until needed; we need it now. */
4244 : // mark_used (decl, tf_none);
4245 0 : init = DECL_INITIAL (decl);
4246 0 : if (init == error_mark_node)
4247 : {
4248 0 : if (TREE_CODE (decl) == CONST_DECL
4249 0 : || DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
4250 : /* Treat the error as a constant to avoid cascading errors on
4251 : excessively recursive template instantiation (c++/9335). */
4252 : return init;
4253 : else
4254 0 : return decl;
4255 : }
4256 :
4257 : /* Instantiate a non-dependent initializer for user variables. We
4258 : mustn't do this for the temporary for an array compound literal;
4259 : trying to instatiate the initializer will keep creating new
4260 : temporaries until we crash. Probably it's not useful to do it for
4261 : other artificial variables, either. */
4262 0 : if (!DECL_ARTIFICIAL (decl))
4263 0 : init = instantiate_non_dependent_or_null (init);
4264 0 : if (!init || !TREE_TYPE (init) || !TREE_CONSTANT (init)
4265 0 : || (!return_aggregate_cst_ok_p
4266 : /* Unless RETURN_AGGREGATE_CST_OK_P is true, do not
4267 : return an aggregate constant (of which string
4268 : literals are a special case), as we do not want
4269 : to make inadvertent copies of such entities, and
4270 : we must be sure that their addresses are the
4271 : same everywhere. */
4272 0 : && (TREE_CODE (init) == CONSTRUCTOR
4273 0 : || TREE_CODE (init) == STRING_CST)))
4274 : break;
4275 : /* Don't return a CONSTRUCTOR for a variable with partial run-time
4276 : initialization, since it doesn't represent the entire value.
4277 : Similarly for VECTOR_CSTs created by cp_folding those
4278 : CONSTRUCTORs. */
4279 0 : if ((TREE_CODE (init) == CONSTRUCTOR || TREE_CODE (init) == VECTOR_CST)
4280 0 : && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl))
4281 : break;
4282 : /* If the variable has a dynamic initializer, don't use its
4283 : DECL_INITIAL which doesn't reflect the real value. */
4284 0 : if (VAR_P (decl) && TREE_STATIC (decl)
4285 0 : && !DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)
4286 0 : && DECL_NONTRIVIALLY_INITIALIZED_P (decl))
4287 : break;
4288 : decl = init;
4289 : }
4290 0 : return unshare_p ? unshare_expr (decl) : decl;
4291 : }
4292 :
4293 : // forked from gcc/cp/init.cc decl_constant_value
4294 :
4295 : /* A more relaxed version of decl_really_constant_value, used by the
4296 : common C/C++ code. */
4297 :
4298 : tree
4299 0 : decl_constant_value (tree decl, bool unshare_p)
4300 : {
4301 0 : return constant_value_1 (decl, /*strict_p=*/false,
4302 : /*return_aggregate_cst_ok_p=*/true,
4303 0 : /*unshare_p=*/unshare_p);
4304 : }
4305 :
4306 : // Below is forked from gcc/cp/init.cc decl_constant_value
4307 :
4308 : tree
4309 0 : decl_constant_value (tree decl)
4310 : {
4311 0 : return decl_constant_value (decl, /*unshare_p=*/true);
4312 : }
4313 :
4314 : // Below is forked from gcc/cp/cp-gimplify.cc
4315 :
4316 : /* Type for source_location_table hash_set. */
4317 : struct GTY ((for_user)) source_location_table_entry
4318 : {
4319 : location_t loc;
4320 : unsigned uid;
4321 : tree var;
4322 : };
4323 :
4324 : // exit/reenter namespace to declare some external functions
4325 :
4326 : } // namespace Rust
4327 :
4328 : extern void gt_pch_nx (Rust::source_location_table_entry &);
4329 : extern void gt_pch_nx (Rust::source_location_table_entry *, gt_pointer_operator,
4330 : void *);
4331 :
4332 : namespace Rust {
4333 :
4334 : /* Traits class for function start hash maps below. */
4335 :
4336 : struct rust_source_location_table_entry_hash
4337 : : ggc_remove<source_location_table_entry>
4338 : {
4339 : typedef source_location_table_entry value_type;
4340 : typedef source_location_table_entry compare_type;
4341 :
4342 0 : static hashval_t hash (const source_location_table_entry &ref)
4343 : {
4344 0 : inchash::hash hstate (0);
4345 0 : hstate.add_int (ref.loc);
4346 0 : hstate.add_int (ref.uid);
4347 0 : return hstate.end ();
4348 : }
4349 :
4350 0 : static bool equal (const source_location_table_entry &ref1,
4351 : const source_location_table_entry &ref2)
4352 : {
4353 0 : return ref1.loc == ref2.loc && ref1.uid == ref2.uid;
4354 : }
4355 :
4356 : static void mark_deleted (source_location_table_entry &ref)
4357 : {
4358 : ref.loc = UNKNOWN_LOCATION;
4359 : ref.uid = -1U;
4360 : ref.var = NULL_TREE;
4361 : }
4362 :
4363 : static const bool empty_zero_p = true;
4364 :
4365 0 : static void mark_empty (source_location_table_entry &ref)
4366 : {
4367 0 : ref.loc = UNKNOWN_LOCATION;
4368 0 : ref.uid = 0;
4369 0 : ref.var = NULL_TREE;
4370 : }
4371 :
4372 0 : static bool is_deleted (const source_location_table_entry &ref)
4373 : {
4374 0 : return (ref.loc == UNKNOWN_LOCATION && ref.uid == -1U
4375 0 : && ref.var == NULL_TREE);
4376 : }
4377 :
4378 0 : static bool is_empty (const source_location_table_entry &ref)
4379 : {
4380 0 : return (ref.loc == UNKNOWN_LOCATION && ref.uid == 0
4381 0 : && ref.var == NULL_TREE);
4382 : }
4383 :
4384 0 : static void pch_nx (source_location_table_entry &p) { gt_pch_nx (p); }
4385 :
4386 0 : static void pch_nx (source_location_table_entry &p, gt_pointer_operator op,
4387 : void *cookie)
4388 : {
4389 0 : gt_pch_nx (&p, op, cookie);
4390 0 : }
4391 : };
4392 :
4393 : static GTY (())
4394 : hash_table<rust_source_location_table_entry_hash> *source_location_table;
4395 : static GTY (()) unsigned int source_location_id;
4396 :
4397 : // Above is forked from gcc/cp/cp-gimplify.cc
4398 :
4399 : // forked from gcc/cp/tree.cc lvalue_kind
4400 :
4401 : /* If REF is an lvalue, returns the kind of lvalue that REF is.
4402 : Otherwise, returns clk_none. */
4403 :
4404 : cp_lvalue_kind
4405 0 : lvalue_kind (const_tree ref)
4406 : {
4407 0 : cp_lvalue_kind op1_lvalue_kind = clk_none;
4408 0 : cp_lvalue_kind op2_lvalue_kind = clk_none;
4409 :
4410 : /* Expressions of reference type are sometimes wrapped in
4411 : INDIRECT_REFs. INDIRECT_REFs are just internal compiler
4412 : representation, not part of the language, so we have to look
4413 : through them. */
4414 0 : if (REFERENCE_REF_P (ref))
4415 0 : return lvalue_kind (TREE_OPERAND (ref, 0));
4416 :
4417 0 : if (TREE_TYPE (ref) && TYPE_REF_P (TREE_TYPE (ref)))
4418 : {
4419 : /* unnamed rvalue references are rvalues */
4420 0 : if (TYPE_REF_IS_RVALUE (TREE_TYPE (ref)) && TREE_CODE (ref) != PARM_DECL
4421 : && !VAR_P (ref)
4422 : && TREE_CODE (ref) != COMPONENT_REF
4423 : /* Functions are always lvalues. */
4424 0 : && TREE_CODE (TREE_TYPE (TREE_TYPE (ref))) != FUNCTION_TYPE)
4425 : {
4426 0 : op1_lvalue_kind = clk_rvalueref;
4427 0 : if (implicit_rvalue_p (ref))
4428 0 : op1_lvalue_kind |= clk_implicit_rval;
4429 0 : return op1_lvalue_kind;
4430 : }
4431 :
4432 : /* lvalue references and named rvalue references are lvalues. */
4433 : return clk_ordinary;
4434 : }
4435 :
4436 0 : if (ref == current_class_ptr)
4437 : return clk_none;
4438 :
4439 : /* Expressions with cv void type are prvalues. */
4440 0 : if (TREE_TYPE (ref) && VOID_TYPE_P (TREE_TYPE (ref)))
4441 : return clk_none;
4442 :
4443 0 : switch (TREE_CODE (ref))
4444 : {
4445 : case SAVE_EXPR:
4446 : return clk_none;
4447 :
4448 : /* preincrements and predecrements are valid lvals, provided
4449 : what they refer to are valid lvals. */
4450 0 : case PREINCREMENT_EXPR:
4451 0 : case PREDECREMENT_EXPR:
4452 0 : case TRY_CATCH_EXPR:
4453 0 : case REALPART_EXPR:
4454 0 : case IMAGPART_EXPR:
4455 0 : case VIEW_CONVERT_EXPR:
4456 0 : return lvalue_kind (TREE_OPERAND (ref, 0));
4457 :
4458 0 : case ARRAY_REF:
4459 0 : {
4460 0 : tree op1 = TREE_OPERAND (ref, 0);
4461 0 : if (TREE_CODE (TREE_TYPE (op1)) == ARRAY_TYPE)
4462 : {
4463 0 : op1_lvalue_kind = lvalue_kind (op1);
4464 0 : if (op1_lvalue_kind == clk_class)
4465 : /* in the case of an array operand, the result is an lvalue if
4466 : that operand is an lvalue and an xvalue otherwise */
4467 0 : op1_lvalue_kind = clk_rvalueref;
4468 0 : return op1_lvalue_kind;
4469 : }
4470 : else
4471 : return clk_ordinary;
4472 : }
4473 :
4474 0 : case MEMBER_REF:
4475 0 : case DOTSTAR_EXPR:
4476 0 : if (TREE_CODE (ref) == MEMBER_REF)
4477 : op1_lvalue_kind = clk_ordinary;
4478 : else
4479 0 : op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
4480 0 : if (TYPE_PTRMEMFUNC_P (TREE_TYPE (TREE_OPERAND (ref, 1))))
4481 : op1_lvalue_kind = clk_none;
4482 0 : else if (op1_lvalue_kind == clk_class)
4483 : /* The result of a .* expression whose second operand is a pointer to a
4484 : data member is an lvalue if the first operand is an lvalue and an
4485 : xvalue otherwise. */
4486 0 : op1_lvalue_kind = clk_rvalueref;
4487 : return op1_lvalue_kind;
4488 :
4489 0 : case COMPONENT_REF:
4490 0 : op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
4491 0 : if (op1_lvalue_kind == clk_class)
4492 : /* If E1 is an lvalue, then E1.E2 is an lvalue;
4493 : otherwise E1.E2 is an xvalue. */
4494 : op1_lvalue_kind = clk_rvalueref;
4495 :
4496 : /* Look at the member designator. */
4497 0 : if (!op1_lvalue_kind)
4498 : ;
4499 0 : else if (is_overloaded_fn (TREE_OPERAND (ref, 1)))
4500 : /* The "field" can be a FUNCTION_DECL or an OVERLOAD in some
4501 : situations. If we're seeing a COMPONENT_REF, it's a non-static
4502 : member, so it isn't an lvalue. */
4503 : op1_lvalue_kind = clk_none;
4504 0 : else if (TREE_CODE (TREE_OPERAND (ref, 1)) != FIELD_DECL)
4505 : /* This can be IDENTIFIER_NODE in a template. */;
4506 0 : else if (DECL_C_BIT_FIELD (TREE_OPERAND (ref, 1)))
4507 : {
4508 : /* Clear the ordinary bit. If this object was a class
4509 : rvalue we want to preserve that information. */
4510 0 : op1_lvalue_kind &= ~clk_ordinary;
4511 : /* The lvalue is for a bitfield. */
4512 0 : op1_lvalue_kind |= clk_bitfield;
4513 : }
4514 0 : else if (DECL_PACKED (TREE_OPERAND (ref, 1)))
4515 0 : op1_lvalue_kind |= clk_packed;
4516 :
4517 : return op1_lvalue_kind;
4518 :
4519 : case STRING_CST:
4520 : case COMPOUND_LITERAL_EXPR:
4521 : return clk_ordinary;
4522 :
4523 0 : case CONST_DECL:
4524 : /* CONST_DECL without TREE_STATIC are enumeration values and
4525 : thus not lvalues. With TREE_STATIC they are used by ObjC++
4526 : in objc_build_string_object and need to be considered as
4527 : lvalues. */
4528 0 : if (!TREE_STATIC (ref))
4529 : return clk_none;
4530 : /* FALLTHRU */
4531 0 : case VAR_DECL:
4532 0 : if (VAR_P (ref) && DECL_HAS_VALUE_EXPR_P (ref))
4533 0 : return lvalue_kind (DECL_VALUE_EXPR (const_cast<tree> (ref)));
4534 :
4535 0 : if (TREE_READONLY (ref) && !TREE_STATIC (ref) && DECL_LANG_SPECIFIC (ref)
4536 0 : && DECL_IN_AGGR_P (ref))
4537 : return clk_none;
4538 : /* FALLTHRU */
4539 : case INDIRECT_REF:
4540 : case ARROW_EXPR:
4541 : case PARM_DECL:
4542 : case RESULT_DECL:
4543 : case PLACEHOLDER_EXPR:
4544 : return clk_ordinary;
4545 :
4546 0 : case MAX_EXPR:
4547 0 : case MIN_EXPR:
4548 : /* Disallow <? and >? as lvalues if either argument side-effects. */
4549 0 : if (TREE_SIDE_EFFECTS (TREE_OPERAND (ref, 0))
4550 0 : || TREE_SIDE_EFFECTS (TREE_OPERAND (ref, 1)))
4551 : return clk_none;
4552 0 : op1_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 0));
4553 0 : op2_lvalue_kind = lvalue_kind (TREE_OPERAND (ref, 1));
4554 0 : break;
4555 :
4556 0 : case COND_EXPR:
4557 0 : {
4558 0 : tree op1 = TREE_OPERAND (ref, 1);
4559 0 : if (!op1)
4560 0 : op1 = TREE_OPERAND (ref, 0);
4561 0 : tree op2 = TREE_OPERAND (ref, 2);
4562 0 : op1_lvalue_kind = lvalue_kind (op1);
4563 0 : op2_lvalue_kind = lvalue_kind (op2);
4564 0 : if (!op1_lvalue_kind != !op2_lvalue_kind)
4565 : {
4566 : /* The second or the third operand (but not both) is a
4567 : throw-expression; the result is of the type
4568 : and value category of the other. */
4569 0 : if (op1_lvalue_kind && TREE_CODE (op2) == THROW_EXPR)
4570 : op2_lvalue_kind = op1_lvalue_kind;
4571 0 : else if (op2_lvalue_kind && TREE_CODE (op1) == THROW_EXPR)
4572 0 : op1_lvalue_kind = op2_lvalue_kind;
4573 : }
4574 : }
4575 : break;
4576 :
4577 : case MODIFY_EXPR:
4578 : case TYPEID_EXPR:
4579 : return clk_ordinary;
4580 :
4581 0 : case COMPOUND_EXPR:
4582 0 : return lvalue_kind (TREE_OPERAND (ref, 1));
4583 :
4584 : case TARGET_EXPR:
4585 : return clk_class;
4586 :
4587 0 : case VA_ARG_EXPR:
4588 0 : return (CLASS_TYPE_P (TREE_TYPE (ref)) ? clk_class : clk_none);
4589 :
4590 0 : case CALL_EXPR:
4591 : /* We can see calls outside of TARGET_EXPR in templates. */
4592 0 : if (CLASS_TYPE_P (TREE_TYPE (ref)))
4593 : return clk_class;
4594 : return clk_none;
4595 :
4596 0 : case FUNCTION_DECL:
4597 : /* All functions (except non-static-member functions) are
4598 : lvalues. */
4599 0 : return (DECL_NONSTATIC_MEMBER_FUNCTION_P (ref) ? clk_none : clk_ordinary);
4600 :
4601 0 : case PAREN_EXPR:
4602 0 : return lvalue_kind (TREE_OPERAND (ref, 0));
4603 :
4604 0 : case TEMPLATE_PARM_INDEX:
4605 0 : if (CLASS_TYPE_P (TREE_TYPE (ref)))
4606 : /* A template parameter object is an lvalue. */
4607 : return clk_ordinary;
4608 : return clk_none;
4609 :
4610 0 : default:
4611 0 : if (!TREE_TYPE (ref))
4612 : return clk_none;
4613 0 : if (CLASS_TYPE_P (TREE_TYPE (ref))
4614 0 : || TREE_CODE (TREE_TYPE (ref)) == ARRAY_TYPE)
4615 : return clk_class;
4616 : return clk_none;
4617 : }
4618 :
4619 : /* If one operand is not an lvalue at all, then this expression is
4620 : not an lvalue. */
4621 0 : if (!op1_lvalue_kind || !op2_lvalue_kind)
4622 : return clk_none;
4623 :
4624 : /* Otherwise, it's an lvalue, and it has all the odd properties
4625 : contributed by either operand. */
4626 0 : op1_lvalue_kind = op1_lvalue_kind | op2_lvalue_kind;
4627 : /* It's not an ordinary lvalue if it involves any other kind. */
4628 0 : if ((op1_lvalue_kind & ~clk_ordinary) != clk_none)
4629 0 : op1_lvalue_kind &= ~clk_ordinary;
4630 : /* It can't be both a pseudo-lvalue and a non-addressable lvalue.
4631 : A COND_EXPR of those should be wrapped in a TARGET_EXPR. */
4632 0 : if ((op1_lvalue_kind & (clk_rvalueref | clk_class))
4633 0 : && (op1_lvalue_kind & (clk_bitfield | clk_packed)))
4634 0 : op1_lvalue_kind = clk_none;
4635 : return op1_lvalue_kind;
4636 : }
4637 :
4638 : // forked from gcc/cp/tree.cc glvalue_p
4639 :
4640 : /* This differs from lvalue_p in that xvalues are included. */
4641 :
4642 : bool
4643 0 : glvalue_p (const_tree ref)
4644 : {
4645 0 : cp_lvalue_kind kind = lvalue_kind (ref);
4646 0 : if (kind & clk_class)
4647 : return false;
4648 : else
4649 0 : return (kind != clk_none);
4650 : }
4651 :
4652 : // forked from gcc/cp/init.cc cv_qualified_p
4653 :
4654 : /* Returns nonzero if TYPE is const or volatile. */
4655 :
4656 : bool
4657 0 : cv_qualified_p (const_tree type)
4658 : {
4659 0 : int quals = rs_type_quals (type);
4660 0 : return (quals & (TYPE_QUAL_CONST | TYPE_QUAL_VOLATILE)) != 0;
4661 : }
4662 :
4663 : // forked from gcc/cp/tree.cc rvalue
4664 :
4665 : /* EXPR is being used in an rvalue context. Return a version of EXPR
4666 : that is marked as an rvalue. */
4667 :
4668 : tree
4669 0 : rvalue (tree expr)
4670 : {
4671 0 : tree type;
4672 :
4673 0 : if (error_operand_p (expr))
4674 : return expr;
4675 :
4676 0 : expr = mark_rvalue_use (expr);
4677 :
4678 : /* [basic.lval]
4679 :
4680 : Non-class rvalues always have cv-unqualified types. */
4681 0 : type = TREE_TYPE (expr);
4682 0 : if (!CLASS_TYPE_P (type) && cv_qualified_p (type))
4683 0 : type = cv_unqualified (type);
4684 :
4685 : /* We need to do this for rvalue refs as well to get the right answer
4686 : from decltype; see c++/36628. */
4687 0 : if (glvalue_p (expr))
4688 : {
4689 : /* But don't use this function for class lvalues; use move (to treat an
4690 : lvalue as an xvalue) or force_rvalue (to make a prvalue copy). */
4691 0 : gcc_checking_assert (!CLASS_TYPE_P (type));
4692 0 : expr = build1 (NON_LVALUE_EXPR, type, expr);
4693 : }
4694 0 : else if (type != TREE_TYPE (expr))
4695 0 : expr = build_nop (type, expr);
4696 :
4697 : return expr;
4698 : }
4699 :
4700 : // forked from gcc/cp/tree.cc bitfield_p
4701 :
4702 : /* True if REF is a bit-field. */
4703 :
4704 : bool
4705 0 : bitfield_p (const_tree ref)
4706 : {
4707 0 : return (lvalue_kind (ref) & clk_bitfield);
4708 : }
4709 :
4710 : // forked from gcc/cp/typeck.cc cxx_mark_addressable
4711 :
4712 : /* Mark EXP saying that we need to be able to take the
4713 : address of it; it should not be allocated in a register.
4714 : Value is true if successful. ARRAY_REF_P is true if this
4715 : is for ARRAY_REF construction - in that case we don't want
4716 : to look through VIEW_CONVERT_EXPR from VECTOR_TYPE to ARRAY_TYPE,
4717 : it is fine to use ARRAY_REFs for vector subscripts on vector
4718 : register variables.
4719 :
4720 : C++: we do not allow `current_class_ptr' to be addressable. */
4721 :
4722 : bool
4723 0 : cxx_mark_addressable (tree exp, bool array_ref_p)
4724 : {
4725 0 : tree x = exp;
4726 :
4727 0 : while (1)
4728 0 : switch (TREE_CODE (x))
4729 : {
4730 0 : case VIEW_CONVERT_EXPR:
4731 0 : if (array_ref_p && TREE_CODE (TREE_TYPE (x)) == ARRAY_TYPE
4732 0 : && VECTOR_TYPE_P (TREE_TYPE (TREE_OPERAND (x, 0))))
4733 : return true;
4734 0 : x = TREE_OPERAND (x, 0);
4735 0 : break;
4736 :
4737 0 : case COMPONENT_REF:
4738 0 : if (bitfield_p (x))
4739 0 : error ("attempt to take address of bit-field");
4740 : /* FALLTHRU */
4741 0 : case ADDR_EXPR:
4742 0 : case ARRAY_REF:
4743 0 : case REALPART_EXPR:
4744 0 : case IMAGPART_EXPR:
4745 0 : x = TREE_OPERAND (x, 0);
4746 0 : break;
4747 :
4748 0 : case PARM_DECL:
4749 0 : if (x == current_class_ptr)
4750 : {
4751 0 : error ("cannot take the address of %<this%>, which is an rvalue "
4752 : "expression");
4753 0 : TREE_ADDRESSABLE (x) = 1; /* so compiler doesn't die later. */
4754 0 : return true;
4755 : }
4756 : /* Fall through. */
4757 :
4758 0 : case VAR_DECL:
4759 : /* Caller should not be trying to mark initialized
4760 : constant fields addressable. */
4761 0 : gcc_assert (DECL_LANG_SPECIFIC (x) == 0 || DECL_IN_AGGR_P (x) == 0
4762 : || TREE_STATIC (x) || DECL_EXTERNAL (x));
4763 : /* Fall through. */
4764 :
4765 0 : case RESULT_DECL:
4766 0 : if (DECL_REGISTER (x) && !TREE_ADDRESSABLE (x) && !DECL_ARTIFICIAL (x))
4767 : {
4768 0 : if (VAR_P (x) && DECL_HARD_REGISTER (x))
4769 : {
4770 0 : error ("address of explicit register variable %qD requested",
4771 : x);
4772 0 : return false;
4773 : }
4774 0 : else if (extra_warnings)
4775 0 : warning (
4776 0 : OPT_Wextra,
4777 : "address requested for %qD, which is declared %<register%>", x);
4778 : }
4779 0 : TREE_ADDRESSABLE (x) = 1;
4780 0 : return true;
4781 :
4782 0 : case CONST_DECL:
4783 0 : case FUNCTION_DECL:
4784 0 : TREE_ADDRESSABLE (x) = 1;
4785 0 : return true;
4786 :
4787 0 : case CONSTRUCTOR:
4788 0 : TREE_ADDRESSABLE (x) = 1;
4789 0 : return true;
4790 :
4791 0 : case TARGET_EXPR:
4792 0 : TREE_ADDRESSABLE (x) = 1;
4793 0 : cxx_mark_addressable (TREE_OPERAND (x, 0));
4794 0 : return true;
4795 :
4796 : default:
4797 : return true;
4798 : }
4799 : }
4800 :
4801 : // forked from gcc/cp/typeck.cc build_address
4802 :
4803 : /* Returns the address of T. This function will fold away
4804 : ADDR_EXPR of INDIRECT_REF. This is only for low-level usage;
4805 : most places should use cp_build_addr_expr instead. */
4806 :
4807 : tree
4808 0 : build_address (tree t)
4809 : {
4810 0 : if (error_operand_p (t) || !cxx_mark_addressable (t))
4811 0 : return error_mark_node;
4812 0 : gcc_checking_assert (TREE_CODE (t) != CONSTRUCTOR);
4813 0 : t = build_fold_addr_expr_loc (EXPR_LOCATION (t), t);
4814 0 : if (TREE_CODE (t) != ADDR_EXPR)
4815 0 : t = rvalue (t);
4816 : return t;
4817 : }
4818 :
4819 : // forked from gcc/cp/gp-gimplify.cc fold_builtin_source_location
4820 :
4821 : /* Fold __builtin_source_location () call. LOC is the location
4822 : of the call. */
4823 :
4824 : tree
4825 0 : fold_builtin_source_location (location_t loc)
4826 : {
4827 : // if (source_location_impl == NULL_TREE)
4828 : // {
4829 : // auto_diagnostic_group d;
4830 : // source_location_impl = get_source_location_impl_type (loc);
4831 : // if (source_location_impl == error_mark_node)
4832 : // inform (loc, "evaluating %qs", "__builtin_source_location");
4833 : // }
4834 0 : if (source_location_impl == error_mark_node)
4835 0 : return build_zero_cst (const_ptr_type_node);
4836 0 : if (source_location_table == NULL)
4837 0 : source_location_table
4838 0 : = hash_table<rust_source_location_table_entry_hash>::create_ggc (64);
4839 0 : const line_map_ordinary *map;
4840 0 : source_location_table_entry entry;
4841 0 : entry.loc = linemap_resolve_location (line_table, loc,
4842 : LRK_MACRO_EXPANSION_POINT, &map);
4843 0 : entry.uid = current_function_decl ? DECL_UID (current_function_decl) : -1;
4844 0 : entry.var = error_mark_node;
4845 0 : source_location_table_entry *entryp
4846 0 : = source_location_table->find_slot (entry, INSERT);
4847 0 : tree var;
4848 0 : if (entryp->var)
4849 : var = entryp->var;
4850 : else
4851 : {
4852 0 : char tmp_name[32];
4853 0 : ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lsrc_loc", source_location_id++);
4854 0 : var = build_decl (loc, VAR_DECL, get_identifier (tmp_name),
4855 : source_location_impl);
4856 0 : TREE_STATIC (var) = 1;
4857 0 : TREE_PUBLIC (var) = 0;
4858 0 : DECL_ARTIFICIAL (var) = 1;
4859 0 : DECL_IGNORED_P (var) = 1;
4860 0 : DECL_EXTERNAL (var) = 0;
4861 0 : DECL_DECLARED_CONSTEXPR_P (var) = 1;
4862 0 : DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (var) = 1;
4863 0 : layout_decl (var, 0);
4864 :
4865 0 : vec<constructor_elt, va_gc> *v = NULL;
4866 0 : vec_alloc (v, 4);
4867 0 : for (tree field = TYPE_FIELDS (source_location_impl);
4868 0 : (field = next_initializable_field (field)) != NULL_TREE;
4869 0 : field = DECL_CHAIN (field))
4870 : {
4871 0 : const char *n = IDENTIFIER_POINTER (DECL_NAME (field));
4872 0 : tree val = NULL_TREE;
4873 0 : if (strcmp (n, "_M_file_name") == 0)
4874 : {
4875 0 : if (const char *fname = LOCATION_FILE (loc))
4876 : {
4877 0 : fname = remap_macro_filename (fname);
4878 0 : val = build_string_literal (strlen (fname) + 1, fname);
4879 : }
4880 : else
4881 0 : val = build_string_literal (1, "");
4882 : }
4883 0 : else if (strcmp (n, "_M_function_name") == 0)
4884 : {
4885 0 : const char *name = "todo: add function name here";
4886 :
4887 : // if (current_function_decl)
4888 : // name = cxx_printable_name (current_function_decl, 2);
4889 :
4890 0 : val = build_string_literal (strlen (name) + 1, name);
4891 : }
4892 0 : else if (strcmp (n, "_M_line") == 0)
4893 0 : val = build_int_cst (TREE_TYPE (field), LOCATION_LINE (loc));
4894 0 : else if (strcmp (n, "_M_column") == 0)
4895 0 : val = build_int_cst (TREE_TYPE (field), LOCATION_COLUMN (loc));
4896 : else
4897 0 : rust_unreachable ();
4898 0 : CONSTRUCTOR_APPEND_ELT (v, field, val);
4899 : }
4900 :
4901 0 : tree ctor = build_constructor (source_location_impl, v);
4902 0 : TREE_CONSTANT (ctor) = 1;
4903 0 : TREE_STATIC (ctor) = 1;
4904 0 : DECL_INITIAL (var) = ctor;
4905 0 : varpool_node::finalize_decl (var);
4906 0 : *entryp = entry;
4907 0 : entryp->var = var;
4908 : }
4909 :
4910 0 : return build_fold_addr_expr_with_type_loc (loc, var, const_ptr_type_node);
4911 : }
4912 :
4913 : // forked from gcc/c-family/c-common.cc braced_lists_to_strings
4914 :
4915 : /* Attempt to convert a braced array initializer list CTOR for array
4916 : TYPE into a STRING_CST for convenience and efficiency. Return
4917 : the converted string on success or the original ctor on failure. */
4918 :
4919 : static tree
4920 0 : braced_list_to_string (tree type, tree ctor, bool member)
4921 : {
4922 : /* Ignore non-members with unknown size like arrays with unspecified
4923 : bound. */
4924 0 : tree typesize = TYPE_SIZE_UNIT (type);
4925 0 : if (!member && !tree_fits_uhwi_p (typesize))
4926 : return ctor;
4927 :
4928 : /* If the target char size differes from the host char size, we'd risk
4929 : loosing data and getting object sizes wrong by converting to
4930 : host chars. */
4931 0 : if (TYPE_PRECISION (char_type_node) != CHAR_BIT)
4932 : return ctor;
4933 :
4934 : /* If the array has an explicit bound, use it to constrain the size
4935 : of the string. If it doesn't, be sure to create a string that's
4936 : as long as implied by the index of the last zero specified via
4937 : a designator, as in:
4938 : const char a[] = { [7] = 0 }; */
4939 0 : unsigned HOST_WIDE_INT maxelts;
4940 0 : if (typesize)
4941 : {
4942 0 : maxelts = tree_to_uhwi (typesize);
4943 0 : maxelts /= tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (type)));
4944 : }
4945 : else
4946 : maxelts = HOST_WIDE_INT_M1U;
4947 :
4948 : /* Avoid converting initializers for zero-length arrays (but do
4949 : create them for flexible array members). */
4950 0 : if (!maxelts)
4951 : return ctor;
4952 :
4953 0 : unsigned HOST_WIDE_INT nelts = CONSTRUCTOR_NELTS (ctor);
4954 :
4955 0 : auto_vec<char> str;
4956 0 : str.reserve (nelts + 1);
4957 :
4958 0 : unsigned HOST_WIDE_INT i;
4959 0 : tree index, value;
4960 :
4961 0 : FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (ctor), i, index, value)
4962 : {
4963 0 : unsigned HOST_WIDE_INT idx = i;
4964 0 : if (index)
4965 : {
4966 0 : if (!tree_fits_uhwi_p (index))
4967 : return ctor;
4968 0 : idx = tree_to_uhwi (index);
4969 : }
4970 :
4971 : /* auto_vec is limited to UINT_MAX elements. */
4972 0 : if (idx > UINT_MAX)
4973 : return ctor;
4974 :
4975 : /* Avoid non-constant initializers. */
4976 0 : if (!tree_fits_shwi_p (value))
4977 : return ctor;
4978 :
4979 : /* Skip over embedded nuls except the last one (initializer
4980 : elements are in ascending order of indices). */
4981 0 : HOST_WIDE_INT val = tree_to_shwi (value);
4982 0 : if (!val && i + 1 < nelts)
4983 0 : continue;
4984 :
4985 0 : if (idx < str.length ())
4986 : return ctor;
4987 :
4988 : /* Bail if the CTOR has a block of more than 256 embedded nuls
4989 : due to implicitly initialized elements. */
4990 0 : unsigned nchars = (idx - str.length ()) + 1;
4991 0 : if (nchars > 256)
4992 : return ctor;
4993 :
4994 0 : if (nchars > 1)
4995 : {
4996 0 : str.reserve (idx);
4997 0 : str.quick_grow_cleared (idx);
4998 : }
4999 :
5000 0 : if (idx >= maxelts)
5001 : return ctor;
5002 :
5003 0 : str.safe_insert (idx, val);
5004 : }
5005 :
5006 : /* Append a nul string termination. */
5007 0 : if (maxelts != HOST_WIDE_INT_M1U && str.length () < maxelts)
5008 0 : str.safe_push (0);
5009 :
5010 : /* Build a STRING_CST with the same type as the array. */
5011 0 : tree res = build_string (str.length (), str.begin ());
5012 0 : TREE_TYPE (res) = type;
5013 0 : return res;
5014 0 : }
5015 :
5016 : // forked from gcc/c-family/c-common.cc braced_lists_to_strings
5017 :
5018 : /* Implementation of the two-argument braced_lists_to_string withe
5019 : the same arguments plus MEMBER which is set for struct members
5020 : to allow initializers for flexible member arrays. */
5021 :
5022 : static tree
5023 0 : braced_lists_to_strings (tree type, tree ctor, bool member)
5024 : {
5025 0 : if (TREE_CODE (ctor) != CONSTRUCTOR)
5026 : return ctor;
5027 :
5028 0 : tree_code code = TREE_CODE (type);
5029 :
5030 0 : tree ttp;
5031 0 : if (code == ARRAY_TYPE)
5032 0 : ttp = TREE_TYPE (type);
5033 0 : else if (code == RECORD_TYPE)
5034 : {
5035 0 : ttp = TREE_TYPE (ctor);
5036 0 : if (TREE_CODE (ttp) == ARRAY_TYPE)
5037 : {
5038 0 : type = ttp;
5039 0 : ttp = TREE_TYPE (ttp);
5040 : }
5041 : }
5042 : else
5043 : return ctor;
5044 :
5045 0 : if ((TREE_CODE (ttp) == ARRAY_TYPE || TREE_CODE (ttp) == INTEGER_TYPE)
5046 0 : && TYPE_STRING_FLAG (ttp))
5047 0 : return braced_list_to_string (type, ctor, member);
5048 :
5049 0 : code = TREE_CODE (ttp);
5050 0 : if (code == ARRAY_TYPE || RECORD_OR_UNION_TYPE_P (ttp))
5051 : {
5052 0 : bool rec = RECORD_OR_UNION_TYPE_P (ttp);
5053 :
5054 : /* Handle array of arrays or struct member initializers. */
5055 0 : tree val;
5056 0 : unsigned HOST_WIDE_INT idx;
5057 0 : FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (ctor), idx, val)
5058 : {
5059 0 : val = braced_lists_to_strings (ttp, val, rec);
5060 0 : CONSTRUCTOR_ELT (ctor, idx)->value = val;
5061 : }
5062 : }
5063 :
5064 : return ctor;
5065 : }
5066 :
5067 : // forked from gcc/c-family/c-common.cc braced_lists_to_strings
5068 :
5069 : /* Attempt to convert a CTOR containing braced array initializer lists
5070 : for array TYPE into one containing STRING_CSTs, for convenience and
5071 : efficiency. Recurse for arrays of arrays and member initializers.
5072 : Return the converted CTOR or STRING_CST on success or the original
5073 : CTOR otherwise. */
5074 :
5075 : tree
5076 0 : braced_lists_to_strings (tree type, tree ctor)
5077 : {
5078 0 : return braced_lists_to_strings (type, ctor, false);
5079 : }
5080 :
5081 : /*---------------------------------------------------------------------------
5082 : Constraint satisfaction
5083 : ---------------------------------------------------------------------------*/
5084 :
5085 : // forked from gcc/cp/constraint.cc satisfying_constraint
5086 :
5087 : /* True if we are currently satisfying a failed_type_completions. */
5088 :
5089 : static bool satisfying_constraint;
5090 :
5091 : // forked from gcc/cp/constraint.cc satisfying_constraint
5092 :
5093 : /* A vector of incomplete types (and of declarations with undeduced return
5094 : type), appended to by note_failed_type_completion_for_satisfaction. The
5095 : satisfaction caches use this in order to keep track of "potentially unstable"
5096 : satisfaction results.
5097 :
5098 : Since references to entries in this vector are stored only in the
5099 : GC-deletable sat_cache, it's safe to make this deletable as well. */
5100 :
5101 : static GTY ((deletable)) vec<tree, va_gc> *failed_type_completions;
5102 :
5103 : // forked from gcc/cp/constraint.cc note_failed_type_completion_for_satisfaction
5104 :
5105 : /* Called whenever a type completion (or return type deduction) failure occurs
5106 : that definitely affects the meaning of the program, by e.g. inducing
5107 : substitution failure. */
5108 :
5109 : void
5110 0 : note_failed_type_completion_for_satisfaction (tree t)
5111 : {
5112 0 : if (satisfying_constraint)
5113 : {
5114 0 : gcc_checking_assert ((TYPE_P (t) && !COMPLETE_TYPE_P (t))
5115 : || (DECL_P (t) && undeduced_auto_decl (t)));
5116 0 : vec_safe_push (failed_type_completions, t);
5117 : }
5118 0 : }
5119 :
5120 : // forked from gcc/cp/typeck.cc complete_type
5121 :
5122 : /* Try to complete TYPE, if it is incomplete. For example, if TYPE is
5123 : a template instantiation, do the instantiation. Returns TYPE,
5124 : whether or not it could be completed, unless something goes
5125 : horribly wrong, in which case the error_mark_node is returned. */
5126 :
5127 : tree
5128 0 : complete_type (tree type)
5129 : {
5130 0 : if (type == NULL_TREE)
5131 : /* Rather than crash, we return something sure to cause an error
5132 : at some point. */
5133 0 : return error_mark_node;
5134 :
5135 0 : if (type == error_mark_node || COMPLETE_TYPE_P (type))
5136 : ;
5137 0 : else if (TREE_CODE (type) == ARRAY_TYPE)
5138 : {
5139 0 : tree t = complete_type (TREE_TYPE (type));
5140 0 : unsigned int needs_constructing, has_nontrivial_dtor;
5141 0 : if (COMPLETE_TYPE_P (t))
5142 0 : layout_type (type);
5143 0 : needs_constructing = TYPE_NEEDS_CONSTRUCTING (TYPE_MAIN_VARIANT (t));
5144 0 : has_nontrivial_dtor
5145 0 : = TYPE_HAS_NONTRIVIAL_DESTRUCTOR (TYPE_MAIN_VARIANT (t));
5146 0 : for (t = TYPE_MAIN_VARIANT (type); t; t = TYPE_NEXT_VARIANT (t))
5147 : {
5148 0 : TYPE_NEEDS_CONSTRUCTING (t) = needs_constructing;
5149 0 : TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t) = has_nontrivial_dtor;
5150 : }
5151 : }
5152 :
5153 : return type;
5154 : }
5155 :
5156 : // forked from gcc/cp/typeck.cc complete_type_or_maybe_complain
5157 :
5158 : /* Like complete_type, but issue an error if the TYPE cannot be completed.
5159 : VALUE is used for informative diagnostics.
5160 : Returns NULL_TREE if the type cannot be made complete. */
5161 :
5162 : tree
5163 0 : complete_type_or_maybe_complain (tree type, tree value, tsubst_flags_t complain)
5164 : {
5165 0 : type = complete_type (type);
5166 0 : if (type == error_mark_node)
5167 : /* We already issued an error. */
5168 : return NULL_TREE;
5169 0 : else if (!COMPLETE_TYPE_P (type))
5170 : {
5171 0 : if (complain & tf_error)
5172 0 : cxx_incomplete_type_diagnostic (value, type, diagnostics::kind::error);
5173 0 : note_failed_type_completion_for_satisfaction (type);
5174 0 : return NULL_TREE;
5175 : }
5176 : else
5177 : return type;
5178 : }
5179 :
5180 : // forked from gcc/cp/typeck.cc complete_type_or_else
5181 :
5182 : tree
5183 0 : complete_type_or_else (tree type, tree value)
5184 : {
5185 0 : return complete_type_or_maybe_complain (type, value, tf_warning_or_error);
5186 : }
5187 :
5188 : // forked from gcc/cp/tree.cc std_layout_type_p
5189 :
5190 : /* Returns true iff T is a standard-layout type, as defined in
5191 : [basic.types]. */
5192 :
5193 : bool
5194 0 : std_layout_type_p (const_tree t)
5195 : {
5196 0 : t = strip_array_types (const_cast<tree> (t));
5197 :
5198 0 : if (CLASS_TYPE_P (t))
5199 0 : return !CLASSTYPE_NON_STD_LAYOUT (t);
5200 : else
5201 0 : return scalarish_type_p (t);
5202 : }
5203 :
5204 : // forked from /gcc/cp/semantics.cc first_nonstatic_data_member_p
5205 :
5206 : /* Helper function for fold_builtin_is_pointer_inverconvertible_with_class,
5207 : return true if MEMBERTYPE is the type of the first non-static data member
5208 : of TYPE or for unions of any members. */
5209 : static bool
5210 0 : first_nonstatic_data_member_p (tree type, tree membertype)
5211 : {
5212 0 : for (tree field = TYPE_FIELDS (type); field; field = DECL_CHAIN (field))
5213 : {
5214 0 : if (TREE_CODE (field) != FIELD_DECL)
5215 0 : continue;
5216 0 : if (DECL_FIELD_IS_BASE (field) && is_empty_field (field))
5217 0 : continue;
5218 0 : if (DECL_FIELD_IS_BASE (field))
5219 0 : return first_nonstatic_data_member_p (TREE_TYPE (field), membertype);
5220 0 : if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
5221 : {
5222 0 : if ((TREE_CODE (TREE_TYPE (field)) == UNION_TYPE
5223 0 : || std_layout_type_p (TREE_TYPE (field)))
5224 0 : && first_nonstatic_data_member_p (TREE_TYPE (field), membertype))
5225 : return true;
5226 : }
5227 0 : else if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (field),
5228 : membertype))
5229 : return true;
5230 0 : if (TREE_CODE (type) != UNION_TYPE)
5231 : return false;
5232 : }
5233 : return false;
5234 : }
5235 :
5236 : // forked from gcc/cp/semantics.cc
5237 : // fold_builtin_is_pointer_inverconvertible_with_class
5238 :
5239 : /* Fold __builtin_is_pointer_interconvertible_with_class call. */
5240 :
5241 : tree
5242 0 : fold_builtin_is_pointer_inverconvertible_with_class (location_t loc, int nargs,
5243 : tree *args)
5244 : {
5245 : /* Unless users call the builtin directly, the following 3 checks should be
5246 : ensured from std::is_pointer_interconvertible_with_class function
5247 : template. */
5248 0 : if (nargs != 1)
5249 : {
5250 0 : error_at (loc, "%<__builtin_is_pointer_interconvertible_with_class%> "
5251 : "needs a single argument");
5252 0 : return boolean_false_node;
5253 : }
5254 0 : tree arg = args[0];
5255 0 : if (error_operand_p (arg))
5256 0 : return boolean_false_node;
5257 0 : if (!TYPE_PTRMEM_P (TREE_TYPE (arg)))
5258 : {
5259 0 : error_at (loc, "%<__builtin_is_pointer_interconvertible_with_class%> "
5260 : "argument is not pointer to member");
5261 0 : return boolean_false_node;
5262 : }
5263 :
5264 0 : if (!TYPE_PTRDATAMEM_P (TREE_TYPE (arg)))
5265 0 : return boolean_false_node;
5266 :
5267 0 : tree membertype = TREE_TYPE (TREE_TYPE (arg));
5268 0 : tree basetype = TYPE_OFFSET_BASETYPE (TREE_TYPE (arg));
5269 0 : if (!complete_type_or_else (basetype, NULL_TREE))
5270 0 : return boolean_false_node;
5271 :
5272 0 : if (TREE_CODE (basetype) != UNION_TYPE && !std_layout_type_p (basetype))
5273 0 : return boolean_false_node;
5274 :
5275 0 : if (!first_nonstatic_data_member_p (basetype, membertype))
5276 0 : return boolean_false_node;
5277 :
5278 0 : if (integer_nonzerop (arg))
5279 0 : return boolean_false_node;
5280 0 : if (integer_zerop (arg))
5281 0 : return boolean_true_node;
5282 :
5283 0 : return fold_build2 (EQ_EXPR, boolean_type_node, arg,
5284 : build_zero_cst (TREE_TYPE (arg)));
5285 : }
5286 :
5287 : // forked from gcc/c-family/c-common.cc registered_builtin_types
5288 :
5289 : /* Used for communication between c_common_type_for_mode and
5290 : c_register_builtin_type. */
5291 : tree registered_builtin_types;
5292 :
5293 : /* Return a data type that has machine mode MODE.
5294 : If the mode is an integer,
5295 : then UNSIGNEDP selects between signed and unsigned types.
5296 : If the mode is a fixed-point mode,
5297 : then UNSIGNEDP selects between saturating and nonsaturating types. */
5298 :
5299 : // forked from gcc/c-family/c-common.cc c_common_type_for_mode
5300 :
5301 : tree
5302 0 : c_common_type_for_mode (machine_mode mode, int unsignedp)
5303 : {
5304 0 : tree t;
5305 0 : int i;
5306 :
5307 0 : if (mode == TYPE_MODE (integer_type_node))
5308 0 : return unsignedp ? unsigned_type_node : integer_type_node;
5309 :
5310 0 : if (mode == TYPE_MODE (signed_char_type_node))
5311 0 : return unsignedp ? unsigned_char_type_node : signed_char_type_node;
5312 :
5313 0 : if (mode == TYPE_MODE (short_integer_type_node))
5314 0 : return unsignedp ? short_unsigned_type_node : short_integer_type_node;
5315 :
5316 0 : if (mode == TYPE_MODE (long_integer_type_node))
5317 0 : return unsignedp ? long_unsigned_type_node : long_integer_type_node;
5318 :
5319 0 : if (mode == TYPE_MODE (long_long_integer_type_node))
5320 0 : return unsignedp ? long_long_unsigned_type_node
5321 0 : : long_long_integer_type_node;
5322 :
5323 0 : for (i = 0; i < NUM_INT_N_ENTS; i++)
5324 0 : if (int_n_enabled_p[i] && mode == int_n_data[i].m)
5325 0 : return (unsignedp ? int_n_trees[i].unsigned_type
5326 0 : : int_n_trees[i].signed_type);
5327 :
5328 0 : if (mode == QImode)
5329 0 : return unsignedp ? unsigned_intQI_type_node : intQI_type_node;
5330 :
5331 0 : if (mode == HImode)
5332 0 : return unsignedp ? unsigned_intHI_type_node : intHI_type_node;
5333 :
5334 0 : if (mode == SImode)
5335 0 : return unsignedp ? unsigned_intSI_type_node : intSI_type_node;
5336 :
5337 0 : if (mode == DImode)
5338 0 : return unsignedp ? unsigned_intDI_type_node : intDI_type_node;
5339 :
5340 : #if HOST_BITS_PER_WIDE_INT >= 64
5341 0 : if (mode == TYPE_MODE (intTI_type_node))
5342 0 : return unsignedp ? unsigned_intTI_type_node : intTI_type_node;
5343 : #endif
5344 :
5345 0 : if (mode == TYPE_MODE (float_type_node))
5346 0 : return float_type_node;
5347 :
5348 0 : if (mode == TYPE_MODE (double_type_node))
5349 0 : return double_type_node;
5350 :
5351 0 : if (mode == TYPE_MODE (long_double_type_node))
5352 0 : return long_double_type_node;
5353 :
5354 0 : for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
5355 0 : if (FLOATN_NX_TYPE_NODE (i) != NULL_TREE
5356 0 : && mode == TYPE_MODE (FLOATN_NX_TYPE_NODE (i)))
5357 0 : return FLOATN_NX_TYPE_NODE (i);
5358 :
5359 0 : if (mode == TYPE_MODE (void_type_node))
5360 0 : return void_type_node;
5361 :
5362 0 : if (mode == TYPE_MODE (build_pointer_type (char_type_node))
5363 0 : || mode == TYPE_MODE (build_pointer_type (integer_type_node)))
5364 : {
5365 0 : unsigned int precision
5366 0 : = GET_MODE_PRECISION (as_a<scalar_int_mode> (mode));
5367 0 : return (unsignedp ? make_unsigned_type (precision)
5368 0 : : make_signed_type (precision));
5369 : }
5370 :
5371 0 : if (COMPLEX_MODE_P (mode))
5372 : {
5373 0 : machine_mode inner_mode;
5374 0 : tree inner_type;
5375 :
5376 0 : if (mode == TYPE_MODE (complex_float_type_node))
5377 0 : return complex_float_type_node;
5378 0 : if (mode == TYPE_MODE (complex_double_type_node))
5379 0 : return complex_double_type_node;
5380 0 : if (mode == TYPE_MODE (complex_long_double_type_node))
5381 0 : return complex_long_double_type_node;
5382 :
5383 0 : for (i = 0; i < NUM_FLOATN_NX_TYPES; i++)
5384 0 : if (COMPLEX_FLOATN_NX_TYPE_NODE (i) != NULL_TREE
5385 0 : && mode == TYPE_MODE (COMPLEX_FLOATN_NX_TYPE_NODE (i)))
5386 0 : return COMPLEX_FLOATN_NX_TYPE_NODE (i);
5387 :
5388 0 : if (mode == TYPE_MODE (complex_integer_type_node) && !unsignedp)
5389 0 : return complex_integer_type_node;
5390 :
5391 0 : inner_mode = GET_MODE_INNER (mode);
5392 0 : inner_type = c_common_type_for_mode (inner_mode, unsignedp);
5393 0 : if (inner_type != NULL_TREE)
5394 0 : return build_complex_type (inner_type);
5395 : }
5396 0 : else if (GET_MODE_CLASS (mode) == MODE_VECTOR_BOOL
5397 0 : && valid_vector_subparts_p (GET_MODE_NUNITS (mode)))
5398 : {
5399 0 : unsigned int elem_bits = vector_element_size (GET_MODE_PRECISION (mode),
5400 : GET_MODE_NUNITS (mode));
5401 0 : tree bool_type = build_nonstandard_boolean_type (elem_bits);
5402 0 : return build_vector_type_for_mode (bool_type, mode);
5403 : }
5404 0 : else if (VECTOR_MODE_P (mode)
5405 0 : && valid_vector_subparts_p (GET_MODE_NUNITS (mode)))
5406 : {
5407 0 : machine_mode inner_mode = GET_MODE_INNER (mode);
5408 0 : tree inner_type = c_common_type_for_mode (inner_mode, unsignedp);
5409 0 : if (inner_type != NULL_TREE)
5410 0 : return build_vector_type_for_mode (inner_type, mode);
5411 : }
5412 :
5413 0 : if (dfloat32_type_node != NULL_TREE && mode == TYPE_MODE (dfloat32_type_node))
5414 0 : return dfloat32_type_node;
5415 0 : if (dfloat64_type_node != NULL_TREE && mode == TYPE_MODE (dfloat64_type_node))
5416 0 : return dfloat64_type_node;
5417 0 : if (dfloat128_type_node != NULL_TREE
5418 0 : && mode == TYPE_MODE (dfloat128_type_node))
5419 0 : return dfloat128_type_node;
5420 :
5421 0 : if (ALL_SCALAR_FIXED_POINT_MODE_P (mode))
5422 : {
5423 0 : if (mode == TYPE_MODE (short_fract_type_node))
5424 0 : return unsignedp ? sat_short_fract_type_node : short_fract_type_node;
5425 0 : if (mode == TYPE_MODE (fract_type_node))
5426 0 : return unsignedp ? sat_fract_type_node : fract_type_node;
5427 0 : if (mode == TYPE_MODE (long_fract_type_node))
5428 0 : return unsignedp ? sat_long_fract_type_node : long_fract_type_node;
5429 0 : if (mode == TYPE_MODE (long_long_fract_type_node))
5430 0 : return unsignedp ? sat_long_long_fract_type_node
5431 0 : : long_long_fract_type_node;
5432 :
5433 0 : if (mode == TYPE_MODE (unsigned_short_fract_type_node))
5434 0 : return unsignedp ? sat_unsigned_short_fract_type_node
5435 0 : : unsigned_short_fract_type_node;
5436 0 : if (mode == TYPE_MODE (unsigned_fract_type_node))
5437 0 : return unsignedp ? sat_unsigned_fract_type_node
5438 0 : : unsigned_fract_type_node;
5439 0 : if (mode == TYPE_MODE (unsigned_long_fract_type_node))
5440 0 : return unsignedp ? sat_unsigned_long_fract_type_node
5441 0 : : unsigned_long_fract_type_node;
5442 0 : if (mode == TYPE_MODE (unsigned_long_long_fract_type_node))
5443 0 : return unsignedp ? sat_unsigned_long_long_fract_type_node
5444 0 : : unsigned_long_long_fract_type_node;
5445 :
5446 0 : if (mode == TYPE_MODE (short_accum_type_node))
5447 0 : return unsignedp ? sat_short_accum_type_node : short_accum_type_node;
5448 0 : if (mode == TYPE_MODE (accum_type_node))
5449 0 : return unsignedp ? sat_accum_type_node : accum_type_node;
5450 0 : if (mode == TYPE_MODE (long_accum_type_node))
5451 0 : return unsignedp ? sat_long_accum_type_node : long_accum_type_node;
5452 0 : if (mode == TYPE_MODE (long_long_accum_type_node))
5453 0 : return unsignedp ? sat_long_long_accum_type_node
5454 0 : : long_long_accum_type_node;
5455 :
5456 0 : if (mode == TYPE_MODE (unsigned_short_accum_type_node))
5457 0 : return unsignedp ? sat_unsigned_short_accum_type_node
5458 0 : : unsigned_short_accum_type_node;
5459 0 : if (mode == TYPE_MODE (unsigned_accum_type_node))
5460 0 : return unsignedp ? sat_unsigned_accum_type_node
5461 0 : : unsigned_accum_type_node;
5462 0 : if (mode == TYPE_MODE (unsigned_long_accum_type_node))
5463 0 : return unsignedp ? sat_unsigned_long_accum_type_node
5464 0 : : unsigned_long_accum_type_node;
5465 0 : if (mode == TYPE_MODE (unsigned_long_long_accum_type_node))
5466 0 : return unsignedp ? sat_unsigned_long_long_accum_type_node
5467 0 : : unsigned_long_long_accum_type_node;
5468 :
5469 0 : if (mode == QQmode)
5470 0 : return unsignedp ? sat_qq_type_node : qq_type_node;
5471 : if (mode == HQmode)
5472 0 : return unsignedp ? sat_hq_type_node : hq_type_node;
5473 : if (mode == SQmode)
5474 0 : return unsignedp ? sat_sq_type_node : sq_type_node;
5475 : if (mode == DQmode)
5476 0 : return unsignedp ? sat_dq_type_node : dq_type_node;
5477 : if (mode == TQmode)
5478 0 : return unsignedp ? sat_tq_type_node : tq_type_node;
5479 :
5480 : if (mode == UQQmode)
5481 0 : return unsignedp ? sat_uqq_type_node : uqq_type_node;
5482 : if (mode == UHQmode)
5483 0 : return unsignedp ? sat_uhq_type_node : uhq_type_node;
5484 : if (mode == USQmode)
5485 0 : return unsignedp ? sat_usq_type_node : usq_type_node;
5486 : if (mode == UDQmode)
5487 0 : return unsignedp ? sat_udq_type_node : udq_type_node;
5488 : if (mode == UTQmode)
5489 0 : return unsignedp ? sat_utq_type_node : utq_type_node;
5490 :
5491 : if (mode == HAmode)
5492 0 : return unsignedp ? sat_ha_type_node : ha_type_node;
5493 : if (mode == SAmode)
5494 0 : return unsignedp ? sat_sa_type_node : sa_type_node;
5495 : if (mode == DAmode)
5496 0 : return unsignedp ? sat_da_type_node : da_type_node;
5497 : if (mode == TAmode)
5498 0 : return unsignedp ? sat_ta_type_node : ta_type_node;
5499 :
5500 : if (mode == UHAmode)
5501 0 : return unsignedp ? sat_uha_type_node : uha_type_node;
5502 : if (mode == USAmode)
5503 0 : return unsignedp ? sat_usa_type_node : usa_type_node;
5504 : if (mode == UDAmode)
5505 0 : return unsignedp ? sat_uda_type_node : uda_type_node;
5506 : if (mode == UTAmode)
5507 0 : return unsignedp ? sat_uta_type_node : uta_type_node;
5508 : }
5509 :
5510 0 : for (t = registered_builtin_types; t; t = TREE_CHAIN (t))
5511 : {
5512 0 : tree type = TREE_VALUE (t);
5513 0 : if (TYPE_MODE (type) == mode
5514 0 : && VECTOR_TYPE_P (type) == VECTOR_MODE_P (mode)
5515 0 : && !!unsignedp == !!TYPE_UNSIGNED (type))
5516 : return type;
5517 : }
5518 : return NULL_TREE;
5519 : }
5520 :
5521 : // forked from gcc/cp/semantics.cc finish_underlying_type
5522 :
5523 : /* Implement the __underlying_type keyword: Return the underlying
5524 : type of TYPE, suitable for use as a type-specifier. */
5525 :
5526 : tree
5527 0 : finish_underlying_type (tree type)
5528 : {
5529 0 : tree underlying_type;
5530 :
5531 0 : if (!complete_type_or_else (type, NULL_TREE))
5532 0 : return error_mark_node;
5533 :
5534 0 : if (TREE_CODE (type) != ENUMERAL_TYPE)
5535 : {
5536 0 : error ("%qT is not an enumeration type", type);
5537 0 : return error_mark_node;
5538 : }
5539 :
5540 0 : underlying_type = ENUM_UNDERLYING_TYPE (type);
5541 :
5542 : /* Fixup necessary in this case because ENUM_UNDERLYING_TYPE
5543 : includes TYPE_MIN_VALUE and TYPE_MAX_VALUE information.
5544 : See finish_enum_value_list for details. */
5545 0 : if (!ENUM_FIXED_UNDERLYING_TYPE_P (type))
5546 0 : underlying_type = c_common_type_for_mode (TYPE_MODE (underlying_type),
5547 0 : TYPE_UNSIGNED (underlying_type));
5548 :
5549 : return underlying_type;
5550 : }
5551 :
5552 : // forked from gcc/cp/typeck.cc layout_compatible_type_p
5553 :
5554 : /* Return true if TYPE1 and TYPE2 are layout-compatible types. */
5555 :
5556 : bool
5557 0 : layout_compatible_type_p (tree type1, tree type2)
5558 : {
5559 0 : if (type1 == error_mark_node || type2 == error_mark_node)
5560 : return false;
5561 0 : if (type1 == type2)
5562 : return true;
5563 0 : if (TREE_CODE (type1) != TREE_CODE (type2))
5564 : return false;
5565 :
5566 0 : type1 = rs_build_qualified_type (type1, TYPE_UNQUALIFIED);
5567 0 : type2 = rs_build_qualified_type (type2, TYPE_UNQUALIFIED);
5568 :
5569 0 : if (TREE_CODE (type1) == ENUMERAL_TYPE)
5570 0 : return (TYPE_ALIGN (type1) == TYPE_ALIGN (type2)
5571 0 : && tree_int_cst_equal (TYPE_SIZE (type1), TYPE_SIZE (type2))
5572 0 : && same_type_p (finish_underlying_type (type1),
5573 : finish_underlying_type (type2)));
5574 :
5575 0 : if (CLASS_TYPE_P (type1) && std_layout_type_p (type1)
5576 0 : && std_layout_type_p (type2) && TYPE_ALIGN (type1) == TYPE_ALIGN (type2)
5577 0 : && tree_int_cst_equal (TYPE_SIZE (type1), TYPE_SIZE (type2)))
5578 : {
5579 0 : tree field1 = TYPE_FIELDS (type1);
5580 0 : tree field2 = TYPE_FIELDS (type2);
5581 0 : if (TREE_CODE (type1) == RECORD_TYPE)
5582 : {
5583 0 : while (1)
5584 : {
5585 0 : if (!next_common_initial_seqence (field1, field2))
5586 : return false;
5587 0 : if (field1 == NULL_TREE)
5588 : return true;
5589 0 : field1 = DECL_CHAIN (field1);
5590 0 : field2 = DECL_CHAIN (field2);
5591 : }
5592 : }
5593 : /* Otherwise both types must be union types.
5594 : The standard says:
5595 : "Two standard-layout unions are layout-compatible if they have
5596 : the same number of non-static data members and corresponding
5597 : non-static data members (in any order) have layout-compatible
5598 : types."
5599 : but the code anticipates that bitfield vs. non-bitfield,
5600 : different bitfield widths or presence/absence of
5601 : [[no_unique_address]] should be checked as well. */
5602 0 : auto_vec<tree, 16> vec;
5603 0 : unsigned int count = 0;
5604 0 : for (; field1; field1 = DECL_CHAIN (field1))
5605 0 : if (TREE_CODE (field1) == FIELD_DECL)
5606 0 : count++;
5607 0 : for (; field2; field2 = DECL_CHAIN (field2))
5608 0 : if (TREE_CODE (field2) == FIELD_DECL)
5609 0 : vec.safe_push (field2);
5610 : /* Discussions on core lean towards treating multiple union fields
5611 : of the same type as the same field, so this might need changing
5612 : in the future. */
5613 0 : if (count != vec.length ())
5614 : return false;
5615 0 : for (field1 = TYPE_FIELDS (type1); field1; field1 = DECL_CHAIN (field1))
5616 : {
5617 0 : if (TREE_CODE (field1) != FIELD_DECL)
5618 0 : continue;
5619 0 : unsigned int j;
5620 0 : tree t1 = DECL_BIT_FIELD_TYPE (field1);
5621 0 : if (t1 == NULL_TREE)
5622 0 : t1 = TREE_TYPE (field1);
5623 0 : FOR_EACH_VEC_ELT (vec, j, field2)
5624 : {
5625 0 : tree t2 = DECL_BIT_FIELD_TYPE (field2);
5626 0 : if (t2 == NULL_TREE)
5627 0 : t2 = TREE_TYPE (field2);
5628 0 : if (DECL_BIT_FIELD_TYPE (field1))
5629 : {
5630 0 : if (!DECL_BIT_FIELD_TYPE (field2))
5631 0 : continue;
5632 0 : if (TYPE_PRECISION (TREE_TYPE (field1))
5633 0 : != TYPE_PRECISION (TREE_TYPE (field2)))
5634 0 : continue;
5635 : }
5636 0 : else if (DECL_BIT_FIELD_TYPE (field2))
5637 0 : continue;
5638 0 : if (!layout_compatible_type_p (t1, t2))
5639 0 : continue;
5640 0 : if ((!lookup_attribute ("no_unique_address",
5641 0 : DECL_ATTRIBUTES (field1)))
5642 0 : != !lookup_attribute ("no_unique_address",
5643 0 : DECL_ATTRIBUTES (field2)))
5644 0 : continue;
5645 : break;
5646 : }
5647 0 : if (j == vec.length ())
5648 : return false;
5649 0 : vec.unordered_remove (j);
5650 : }
5651 : return true;
5652 0 : }
5653 :
5654 0 : return same_type_p (type1, type2);
5655 : }
5656 :
5657 : // forked from gcc/cp/semnatics.cc is_corresponding_member_union
5658 :
5659 : /* Helper function for is_corresponding_member_aggr. Return true if
5660 : MEMBERTYPE pointer-to-data-member ARG can be found in anonymous
5661 : union or structure BASETYPE. */
5662 :
5663 : static bool
5664 0 : is_corresponding_member_union (tree basetype, tree membertype, tree arg)
5665 : {
5666 0 : for (tree field = TYPE_FIELDS (basetype); field; field = DECL_CHAIN (field))
5667 0 : if (TREE_CODE (field) != FIELD_DECL || DECL_BIT_FIELD_TYPE (field))
5668 0 : continue;
5669 0 : else if (same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (field),
5670 : membertype))
5671 : {
5672 0 : if (TREE_CODE (arg) != INTEGER_CST
5673 0 : || tree_int_cst_equal (arg, byte_position (field)))
5674 0 : return true;
5675 : }
5676 0 : else if (ANON_AGGR_TYPE_P (TREE_TYPE (field)))
5677 : {
5678 0 : tree narg = arg;
5679 0 : if (TREE_CODE (basetype) != UNION_TYPE
5680 0 : && TREE_CODE (narg) == INTEGER_CST)
5681 0 : narg = size_binop (MINUS_EXPR, arg, byte_position (field));
5682 0 : if (is_corresponding_member_union (TREE_TYPE (field), membertype, narg))
5683 : return true;
5684 : }
5685 : return false;
5686 : }
5687 :
5688 : // forked from gcc/cp/typeck.cc next_common_initial_seqence
5689 :
5690 : /* Helper function for layout_compatible_type_p and
5691 : is_corresponding_member_aggr. Advance to next members (NULL if
5692 : no further ones) and return true if those members are still part of
5693 : the common initial sequence. */
5694 :
5695 : bool
5696 0 : next_common_initial_seqence (tree &memb1, tree &memb2)
5697 : {
5698 0 : while (memb1)
5699 : {
5700 0 : if (TREE_CODE (memb1) != FIELD_DECL
5701 0 : || (DECL_FIELD_IS_BASE (memb1) && is_empty_field (memb1)))
5702 : {
5703 0 : memb1 = DECL_CHAIN (memb1);
5704 0 : continue;
5705 : }
5706 0 : if (DECL_FIELD_IS_BASE (memb1))
5707 : {
5708 0 : memb1 = TYPE_FIELDS (TREE_TYPE (memb1));
5709 0 : continue;
5710 : }
5711 : break;
5712 : }
5713 0 : while (memb2)
5714 : {
5715 0 : if (TREE_CODE (memb2) != FIELD_DECL
5716 0 : || (DECL_FIELD_IS_BASE (memb2) && is_empty_field (memb2)))
5717 : {
5718 0 : memb2 = DECL_CHAIN (memb2);
5719 0 : continue;
5720 : }
5721 0 : if (DECL_FIELD_IS_BASE (memb2))
5722 : {
5723 0 : memb2 = TYPE_FIELDS (TREE_TYPE (memb2));
5724 0 : continue;
5725 : }
5726 : break;
5727 : }
5728 0 : if (memb1 == NULL_TREE && memb2 == NULL_TREE)
5729 : return true;
5730 0 : if (memb1 == NULL_TREE || memb2 == NULL_TREE)
5731 : return false;
5732 0 : if (DECL_BIT_FIELD_TYPE (memb1))
5733 : {
5734 0 : if (!DECL_BIT_FIELD_TYPE (memb2))
5735 : return false;
5736 0 : if (!layout_compatible_type_p (DECL_BIT_FIELD_TYPE (memb1),
5737 0 : DECL_BIT_FIELD_TYPE (memb2)))
5738 : return false;
5739 0 : if (TYPE_PRECISION (TREE_TYPE (memb1))
5740 0 : != TYPE_PRECISION (TREE_TYPE (memb2)))
5741 : return false;
5742 : }
5743 0 : else if (DECL_BIT_FIELD_TYPE (memb2))
5744 : return false;
5745 0 : else if (!layout_compatible_type_p (TREE_TYPE (memb1), TREE_TYPE (memb2)))
5746 : return false;
5747 0 : if ((!lookup_attribute ("no_unique_address", DECL_ATTRIBUTES (memb1)))
5748 0 : != !lookup_attribute ("no_unique_address", DECL_ATTRIBUTES (memb2)))
5749 : return false;
5750 0 : if (!tree_int_cst_equal (bit_position (memb1), bit_position (memb2)))
5751 : return false;
5752 : return true;
5753 : }
5754 :
5755 : // forked from gcc/cp/semantics.cc is_corresponding_member_aggr
5756 :
5757 : /* Helper function for fold_builtin_is_corresponding_member call.
5758 : Return boolean_false_node if MEMBERTYPE1 BASETYPE1::*ARG1 and
5759 : MEMBERTYPE2 BASETYPE2::*ARG2 aren't corresponding members,
5760 : boolean_true_node if they are corresponding members, or for
5761 : non-constant ARG2 the highest member offset for corresponding
5762 : members. */
5763 :
5764 : static tree
5765 0 : is_corresponding_member_aggr (location_t loc, tree basetype1, tree membertype1,
5766 : tree arg1, tree basetype2, tree membertype2,
5767 : tree arg2)
5768 : {
5769 0 : tree field1 = TYPE_FIELDS (basetype1);
5770 0 : tree field2 = TYPE_FIELDS (basetype2);
5771 0 : tree ret = boolean_false_node;
5772 0 : while (1)
5773 : {
5774 0 : bool r = next_common_initial_seqence (field1, field2);
5775 0 : if (field1 == NULL_TREE || field2 == NULL_TREE)
5776 : break;
5777 0 : if (r
5778 0 : && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (field1),
5779 : membertype1)
5780 0 : && same_type_ignoring_top_level_qualifiers_p (TREE_TYPE (field2),
5781 : membertype2))
5782 : {
5783 0 : tree pos = byte_position (field1);
5784 0 : if (TREE_CODE (arg1) == INTEGER_CST && tree_int_cst_equal (arg1, pos))
5785 : {
5786 0 : if (TREE_CODE (arg2) == INTEGER_CST)
5787 0 : return boolean_true_node;
5788 : return pos;
5789 : }
5790 0 : else if (TREE_CODE (arg1) != INTEGER_CST)
5791 0 : ret = pos;
5792 : }
5793 0 : else if (ANON_AGGR_TYPE_P (TREE_TYPE (field1))
5794 0 : && ANON_AGGR_TYPE_P (TREE_TYPE (field2)))
5795 : {
5796 0 : if ((!lookup_attribute ("no_unique_address",
5797 0 : DECL_ATTRIBUTES (field1)))
5798 0 : != !lookup_attribute ("no_unique_address",
5799 0 : DECL_ATTRIBUTES (field2)))
5800 : break;
5801 0 : if (!tree_int_cst_equal (bit_position (field1),
5802 0 : bit_position (field2)))
5803 : break;
5804 0 : bool overlap = true;
5805 0 : tree pos = byte_position (field1);
5806 0 : if (TREE_CODE (arg1) == INTEGER_CST)
5807 : {
5808 0 : tree off1 = fold_convert (sizetype, arg1);
5809 0 : tree sz1 = TYPE_SIZE_UNIT (TREE_TYPE (field1));
5810 0 : if (tree_int_cst_lt (off1, pos)
5811 0 : || tree_int_cst_le (size_binop (PLUS_EXPR, pos, sz1), off1))
5812 : overlap = false;
5813 : }
5814 0 : if (TREE_CODE (arg2) == INTEGER_CST)
5815 : {
5816 0 : tree off2 = fold_convert (sizetype, arg2);
5817 0 : tree sz2 = TYPE_SIZE_UNIT (TREE_TYPE (field2));
5818 0 : if (tree_int_cst_lt (off2, pos)
5819 0 : || tree_int_cst_le (size_binop (PLUS_EXPR, pos, sz2), off2))
5820 : overlap = false;
5821 : }
5822 0 : if (overlap && NON_UNION_CLASS_TYPE_P (TREE_TYPE (field1))
5823 0 : && NON_UNION_CLASS_TYPE_P (TREE_TYPE (field2)))
5824 : {
5825 0 : tree narg1 = arg1;
5826 0 : if (TREE_CODE (arg1) == INTEGER_CST)
5827 0 : narg1
5828 0 : = size_binop (MINUS_EXPR, fold_convert (sizetype, arg1), pos);
5829 0 : tree narg2 = arg2;
5830 0 : if (TREE_CODE (arg2) == INTEGER_CST)
5831 0 : narg2
5832 0 : = size_binop (MINUS_EXPR, fold_convert (sizetype, arg2), pos);
5833 0 : tree t1 = TREE_TYPE (field1);
5834 0 : tree t2 = TREE_TYPE (field2);
5835 0 : tree nret
5836 0 : = is_corresponding_member_aggr (loc, t1, membertype1, narg1, t2,
5837 : membertype2, narg2);
5838 0 : if (nret != boolean_false_node)
5839 : {
5840 0 : if (nret == boolean_true_node)
5841 : return nret;
5842 0 : if (TREE_CODE (arg1) == INTEGER_CST)
5843 0 : return size_binop (PLUS_EXPR, nret, pos);
5844 0 : ret = size_binop (PLUS_EXPR, nret, pos);
5845 : }
5846 : }
5847 0 : else if (overlap && TREE_CODE (TREE_TYPE (field1)) == UNION_TYPE
5848 0 : && TREE_CODE (TREE_TYPE (field2)) == UNION_TYPE)
5849 : {
5850 0 : tree narg1 = arg1;
5851 0 : if (TREE_CODE (arg1) == INTEGER_CST)
5852 0 : narg1
5853 0 : = size_binop (MINUS_EXPR, fold_convert (sizetype, arg1), pos);
5854 0 : tree narg2 = arg2;
5855 0 : if (TREE_CODE (arg2) == INTEGER_CST)
5856 0 : narg2
5857 0 : = size_binop (MINUS_EXPR, fold_convert (sizetype, arg2), pos);
5858 0 : if (is_corresponding_member_union (TREE_TYPE (field1),
5859 : membertype1, narg1)
5860 0 : && is_corresponding_member_union (TREE_TYPE (field2),
5861 : membertype2, narg2))
5862 : {
5863 0 : sorry_at (loc, "%<__builtin_is_corresponding_member%> "
5864 : "not well defined for anonymous unions");
5865 0 : return boolean_false_node;
5866 : }
5867 : }
5868 : }
5869 0 : if (!r)
5870 : break;
5871 0 : field1 = DECL_CHAIN (field1);
5872 0 : field2 = DECL_CHAIN (field2);
5873 0 : }
5874 : return ret;
5875 : }
5876 :
5877 : // forked from gcc/cp/call.cc null_member_pointer_value_p
5878 :
5879 : /* Returns true iff T is a null member pointer value (4.11). */
5880 :
5881 : bool
5882 0 : null_member_pointer_value_p (tree t)
5883 : {
5884 0 : tree type = TREE_TYPE (t);
5885 0 : if (!type)
5886 : return false;
5887 0 : else if (TYPE_PTRMEMFUNC_P (type))
5888 0 : return (TREE_CODE (t) == CONSTRUCTOR && CONSTRUCTOR_NELTS (t)
5889 0 : && integer_zerop (CONSTRUCTOR_ELT (t, 0)->value));
5890 0 : else if (TYPE_PTRDATAMEM_P (type))
5891 0 : return integer_all_onesp (t);
5892 : else
5893 : return false;
5894 : }
5895 :
5896 : // forked from gcc/cp/semantics.cc fold_builtin_is_corresponding_member
5897 :
5898 : /* Fold __builtin_is_corresponding_member call. */
5899 :
5900 : tree
5901 0 : fold_builtin_is_corresponding_member (location_t loc, int nargs, tree *args)
5902 : {
5903 : /* Unless users call the builtin directly, the following 3 checks should be
5904 : ensured from std::is_corresponding_member function template. */
5905 0 : if (nargs != 2)
5906 : {
5907 0 : error_at (loc, "%<__builtin_is_corresponding_member%> "
5908 : "needs two arguments");
5909 0 : return boolean_false_node;
5910 : }
5911 0 : tree arg1 = args[0];
5912 0 : tree arg2 = args[1];
5913 0 : if (error_operand_p (arg1) || error_operand_p (arg2))
5914 0 : return boolean_false_node;
5915 0 : if (!TYPE_PTRMEM_P (TREE_TYPE (arg1)) || !TYPE_PTRMEM_P (TREE_TYPE (arg2)))
5916 : {
5917 0 : error_at (loc, "%<__builtin_is_corresponding_member%> "
5918 : "argument is not pointer to member");
5919 0 : return boolean_false_node;
5920 : }
5921 :
5922 0 : if (!TYPE_PTRDATAMEM_P (TREE_TYPE (arg1))
5923 0 : || !TYPE_PTRDATAMEM_P (TREE_TYPE (arg2)))
5924 0 : return boolean_false_node;
5925 :
5926 0 : tree membertype1 = TREE_TYPE (TREE_TYPE (arg1));
5927 0 : tree basetype1 = TYPE_OFFSET_BASETYPE (TREE_TYPE (arg1));
5928 0 : if (!complete_type_or_else (basetype1, NULL_TREE))
5929 0 : return boolean_false_node;
5930 :
5931 0 : tree membertype2 = TREE_TYPE (TREE_TYPE (arg2));
5932 0 : tree basetype2 = TYPE_OFFSET_BASETYPE (TREE_TYPE (arg2));
5933 0 : if (!complete_type_or_else (basetype2, NULL_TREE))
5934 0 : return boolean_false_node;
5935 :
5936 0 : if (!NON_UNION_CLASS_TYPE_P (basetype1) || !NON_UNION_CLASS_TYPE_P (basetype2)
5937 0 : || !std_layout_type_p (basetype1) || !std_layout_type_p (basetype2))
5938 0 : return boolean_false_node;
5939 :
5940 : /* If the member types aren't layout compatible, then they
5941 : can't be corresponding members. */
5942 0 : if (!layout_compatible_type_p (membertype1, membertype2))
5943 0 : return boolean_false_node;
5944 :
5945 0 : if (null_member_pointer_value_p (arg1) || null_member_pointer_value_p (arg2))
5946 0 : return boolean_false_node;
5947 :
5948 0 : if (TREE_CODE (arg1) == INTEGER_CST && TREE_CODE (arg2) == INTEGER_CST
5949 0 : && !tree_int_cst_equal (arg1, arg2))
5950 0 : return boolean_false_node;
5951 :
5952 0 : if (TREE_CODE (arg2) == INTEGER_CST && TREE_CODE (arg1) != INTEGER_CST)
5953 : {
5954 : std::swap (arg1, arg2);
5955 : std::swap (membertype1, membertype2);
5956 : std::swap (basetype1, basetype2);
5957 : }
5958 :
5959 0 : tree ret = is_corresponding_member_aggr (loc, basetype1, membertype1, arg1,
5960 : basetype2, membertype2, arg2);
5961 0 : if (TREE_TYPE (ret) == boolean_type_node)
5962 : return ret;
5963 : /* If both arg1 and arg2 are INTEGER_CSTs, is_corresponding_member_aggr
5964 : already returns boolean_{true,false}_node whether those particular
5965 : members are corresponding members or not. Otherwise, if only
5966 : one of them is INTEGER_CST (canonicalized to first being INTEGER_CST
5967 : above), it returns boolean_false_node if it is certainly not a
5968 : corresponding member and otherwise we need to do a runtime check that
5969 : those two OFFSET_TYPE offsets are equal.
5970 : If neither of the operands is INTEGER_CST, is_corresponding_member_aggr
5971 : returns the largest offset at which the members would be corresponding
5972 : members, so perform arg1 <= ret && arg1 == arg2 runtime check. */
5973 0 : gcc_assert (TREE_CODE (arg2) != INTEGER_CST);
5974 0 : if (TREE_CODE (arg1) == INTEGER_CST)
5975 0 : return fold_build2 (EQ_EXPR, boolean_type_node, arg1,
5976 : fold_convert (TREE_TYPE (arg1), arg2));
5977 0 : ret = fold_build2 (LE_EXPR, boolean_type_node,
5978 : fold_convert (pointer_sized_int_node, arg1),
5979 : fold_convert (pointer_sized_int_node, ret));
5980 0 : return fold_build2 (TRUTH_AND_EXPR, boolean_type_node, ret,
5981 : fold_build2 (EQ_EXPR, boolean_type_node, arg1,
5982 : fold_convert (TREE_TYPE (arg1), arg2)));
5983 : }
5984 :
5985 : // forked from gcc/cp/tree.cc lvalue_type
5986 :
5987 : /* The type of ARG when used as an lvalue. */
5988 :
5989 : tree
5990 0 : lvalue_type (tree arg)
5991 : {
5992 0 : tree type = TREE_TYPE (arg);
5993 0 : return type;
5994 : }
5995 :
5996 : // forked from gcc/c-family/c-warn.cc lvalue_error
5997 :
5998 : /* Print an error message for an invalid lvalue. USE says
5999 : how the lvalue is being used and so selects the error message. LOC
6000 : is the location for the error. */
6001 :
6002 : void
6003 0 : lvalue_error (location_t loc, enum lvalue_use use)
6004 : {
6005 0 : switch (use)
6006 : {
6007 0 : case lv_assign:
6008 0 : error_at (loc, "lvalue required as left operand of assignment");
6009 0 : break;
6010 0 : case lv_increment:
6011 0 : error_at (loc, "lvalue required as increment operand");
6012 0 : break;
6013 0 : case lv_decrement:
6014 0 : error_at (loc, "lvalue required as decrement operand");
6015 0 : break;
6016 0 : case lv_addressof:
6017 0 : error_at (loc, "lvalue required as unary %<&%> operand");
6018 0 : break;
6019 0 : case lv_asm:
6020 0 : error_at (loc, "lvalue required in %<asm%> statement");
6021 0 : break;
6022 0 : default:
6023 0 : rust_unreachable ();
6024 : }
6025 0 : }
6026 :
6027 : // forked from gcc/cp/cp--gimplify.cc cp_fold_maybe_rvalue
6028 :
6029 : /* Fold expression X which is used as an rvalue if RVAL is true. */
6030 :
6031 : tree
6032 0 : cp_fold_maybe_rvalue (tree x, bool rval)
6033 : {
6034 0 : while (true)
6035 : {
6036 0 : x = fold (x);
6037 0 : if (rval)
6038 0 : x = mark_rvalue_use (x);
6039 0 : if (rval && DECL_P (x) && !TYPE_REF_P (TREE_TYPE (x)))
6040 : {
6041 0 : tree v = decl_constant_value (x);
6042 0 : if (v != x && v != error_mark_node)
6043 : {
6044 0 : x = v;
6045 0 : continue;
6046 : }
6047 : }
6048 0 : break;
6049 0 : }
6050 0 : return x;
6051 : }
6052 :
6053 : // forked from gcc/cp/cp--gimplify.cc cp_fold_rvalue
6054 :
6055 : /* Fold expression X which is used as an rvalue. */
6056 :
6057 : tree
6058 0 : cp_fold_rvalue (tree x)
6059 : {
6060 0 : return cp_fold_maybe_rvalue (x, true);
6061 : }
6062 :
6063 : /* Returns true iff class T has a constexpr destructor or has an
6064 : implicitly declared destructor that we can't tell if it's constexpr
6065 : without forcing a lazy declaration (which might cause undesired
6066 : instantiations). */
6067 :
6068 : static bool
6069 0 : type_maybe_constexpr_destructor (tree t)
6070 : {
6071 : /* Until C++20, only trivial destruction is constexpr. */
6072 0 : if (TYPE_HAS_TRIVIAL_DESTRUCTOR (t))
6073 : return true;
6074 :
6075 0 : if (CLASS_TYPE_P (t) && CLASSTYPE_LAZY_DESTRUCTOR (t))
6076 : /* Assume it's constexpr. */
6077 : return true;
6078 0 : tree fn = CLASSTYPE_DESTRUCTOR (t);
6079 0 : return (fn && Compile::maybe_constexpr_fn (fn));
6080 : }
6081 :
6082 : /* T is a non-literal type used in a context which requires a constant
6083 : expression. Explain why it isn't literal. */
6084 :
6085 : void
6086 0 : explain_non_literal_class (tree t)
6087 : {
6088 0 : static hash_set<tree> *diagnosed;
6089 :
6090 0 : if (!CLASS_TYPE_P (t))
6091 0 : return;
6092 0 : t = TYPE_MAIN_VARIANT (t);
6093 :
6094 0 : if (diagnosed == NULL)
6095 0 : diagnosed = new hash_set<tree>;
6096 0 : if (diagnosed->add (t))
6097 : /* Already explained. */
6098 : return;
6099 :
6100 0 : auto_diagnostic_group d;
6101 0 : inform (UNKNOWN_LOCATION, "%q+T is not literal because:", t);
6102 0 : if (LAMBDA_TYPE_P (t))
6103 0 : inform (UNKNOWN_LOCATION,
6104 : " %qT is a closure type, which is only literal in "
6105 : "C++17 and later",
6106 : t);
6107 0 : else if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t)
6108 0 : && !type_maybe_constexpr_destructor (t))
6109 0 : inform (UNKNOWN_LOCATION, " %q+T does not have %<constexpr%> destructor",
6110 : t);
6111 0 : else if (TYPE_HAS_NONTRIVIAL_DESTRUCTOR (t))
6112 0 : inform (UNKNOWN_LOCATION, " %q+T has a non-trivial destructor", t);
6113 0 : else if (CLASSTYPE_NON_AGGREGATE (t) && !TYPE_HAS_TRIVIAL_DFLT (t)
6114 0 : && !LAMBDA_TYPE_P (t) && !TYPE_HAS_CONSTEXPR_CTOR (t))
6115 : {
6116 0 : inform (UNKNOWN_LOCATION,
6117 : " %q+T is not an aggregate, does not have a trivial "
6118 : "default constructor, and has no %<constexpr%> constructor that "
6119 : "is not a copy or move constructor",
6120 : t);
6121 0 : if (type_has_non_user_provided_default_constructor (t))
6122 : /* Note that we can't simply call locate_ctor because when the
6123 : constructor is deleted it just returns NULL_TREE. */
6124 0 : for (ovl_iterator iter (CLASSTYPE_CONSTRUCTORS (t)); iter; ++iter)
6125 : {
6126 0 : tree fn = *iter;
6127 0 : tree parms = TYPE_ARG_TYPES (TREE_TYPE (fn));
6128 :
6129 0 : parms = skip_artificial_parms_for (fn, parms);
6130 :
6131 0 : if (sufficient_parms_p (parms))
6132 : {
6133 0 : Compile::explain_invalid_constexpr_fn (fn);
6134 0 : break;
6135 : }
6136 : }
6137 : }
6138 : else
6139 : {
6140 0 : tree binfo, base_binfo, field;
6141 0 : int i;
6142 0 : for (binfo = TYPE_BINFO (t), i = 0;
6143 0 : BINFO_BASE_ITERATE (binfo, i, base_binfo); i++)
6144 : {
6145 0 : tree basetype = TREE_TYPE (base_binfo);
6146 0 : if (!CLASSTYPE_LITERAL_P (basetype))
6147 : {
6148 0 : inform (UNKNOWN_LOCATION,
6149 : " base class %qT of %q+T is non-literal", basetype, t);
6150 0 : explain_non_literal_class (basetype);
6151 0 : return;
6152 : }
6153 : }
6154 0 : for (field = TYPE_FIELDS (t); field; field = TREE_CHAIN (field))
6155 : {
6156 0 : tree ftype;
6157 0 : if (TREE_CODE (field) != FIELD_DECL)
6158 0 : continue;
6159 0 : ftype = TREE_TYPE (field);
6160 0 : if (!Compile::literal_type_p (ftype))
6161 : {
6162 0 : inform (DECL_SOURCE_LOCATION (field),
6163 : " non-static data member %qD has non-literal type",
6164 : field);
6165 0 : if (CLASS_TYPE_P (ftype))
6166 0 : explain_non_literal_class (ftype);
6167 : }
6168 0 : if (RS_TYPE_VOLATILE_P (ftype))
6169 0 : inform (DECL_SOURCE_LOCATION (field),
6170 : " non-static data member %qD has volatile type", field);
6171 : }
6172 : }
6173 0 : }
6174 :
6175 : // forked from gcc/cp/call.cc reference_related_p
6176 :
6177 : /* Returns nonzero if T1 is reference-related to T2. */
6178 :
6179 : bool
6180 0 : reference_related_p (tree t1, tree t2)
6181 : {
6182 0 : if (t1 == error_mark_node || t2 == error_mark_node)
6183 : return false;
6184 :
6185 0 : t1 = TYPE_MAIN_VARIANT (t1);
6186 0 : t2 = TYPE_MAIN_VARIANT (t2);
6187 :
6188 : /* [dcl.init.ref]
6189 :
6190 : Given types "cv1 T1" and "cv2 T2," "cv1 T1" is reference-related
6191 : to "cv2 T2" if T1 is similar to T2, or T1 is a base class of T2. */
6192 0 : return (similar_type_p (t1, t2)
6193 : /*|| (CLASS_TYPE_P (t1) && CLASS_TYPE_P (t2)
6194 0 : && DERIVED_FROM_P (t1, t2))*/);
6195 : }
6196 :
6197 : // forked from gcc/cp/typeck2.cc ordinary_char_type_p
6198 :
6199 : /* True iff TYPE is a C++20 "ordinary" character type. */
6200 :
6201 : bool
6202 0 : ordinary_char_type_p (tree type)
6203 : {
6204 0 : type = TYPE_MAIN_VARIANT (type);
6205 0 : return (type == char_type_node || type == signed_char_type_node
6206 0 : || type == unsigned_char_type_node);
6207 : }
6208 :
6209 : // forked from gcc/cp/typeck2.cc array_string_literal_compatible_p
6210 :
6211 : /* True iff the string literal INIT has a type suitable for initializing array
6212 : TYPE. */
6213 :
6214 : bool
6215 0 : array_string_literal_compatible_p (tree type, tree init)
6216 : {
6217 0 : tree to_char_type = TYPE_MAIN_VARIANT (TREE_TYPE (type));
6218 0 : tree from_char_type = TYPE_MAIN_VARIANT (TREE_TYPE (TREE_TYPE (init)));
6219 :
6220 0 : if (to_char_type == from_char_type)
6221 : return true;
6222 : /* The array element type does not match the initializing string
6223 : literal element type; this is only allowed when both types are
6224 : ordinary character type. There are no string literals of
6225 : signed or unsigned char type in the language, but we can get
6226 : them internally from converting braced-init-lists to
6227 : STRING_CST. */
6228 0 : if (ordinary_char_type_p (to_char_type)
6229 0 : && ordinary_char_type_p (from_char_type))
6230 : return true;
6231 : return false;
6232 : }
6233 :
6234 : } // namespace Rust
6235 :
6236 : using namespace Rust;
6237 :
6238 : #include "gt-rust-rust-tree.h"
|