gdb: include allocated/associated properties in 'maint print type'
[deliverable/binutils-gdb.git] / gdb / rust-lang.c
CommitLineData
c44af4eb
TT
1/* Rust language support routines for GDB, the GNU debugger.
2
b811d2c2 3 Copyright (C) 2016-2020 Free Software Foundation, Inc.
c44af4eb
TT
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program. If not, see <http://www.gnu.org/licenses/>. */
19
20#include "defs.h"
21
22#include <ctype.h>
23
24#include "block.h"
25#include "c-lang.h"
26#include "charset.h"
27#include "cp-support.h"
8b302db8 28#include "demangle.h"
c44af4eb
TT
29#include "gdbarch.h"
30#include "infcall.h"
31#include "objfiles.h"
71a3c369 32#include "psymtab.h"
c44af4eb 33#include "rust-lang.h"
a33ccfc7 34#include "typeprint.h"
c44af4eb
TT
35#include "valprint.h"
36#include "varobj.h"
a33ccfc7 37#include <algorithm>
ab8b80a8
TT
38#include <string>
39#include <vector>
7f6aba03 40#include "cli/cli-style.h"
af30c400 41#include "parser-defs.h"
c44af4eb 42
c9317f21 43/* See rust-lang.h. */
c44af4eb 44
c9317f21
TT
45const char *
46rust_last_path_segment (const char *path)
c44af4eb
TT
47{
48 const char *result = strrchr (path, ':');
49
50 if (result == NULL)
c9317f21 51 return path;
c44af4eb
TT
52 return result + 1;
53}
54
03c85b11 55/* See rust-lang.h. */
c44af4eb 56
03c85b11 57std::string
c44af4eb
TT
58rust_crate_for_block (const struct block *block)
59{
60 const char *scope = block_scope (block);
61
62 if (scope[0] == '\0')
03c85b11 63 return std::string ();
c44af4eb 64
03c85b11 65 return std::string (scope, cp_find_first_component (scope));
c44af4eb
TT
66}
67
c9317f21
TT
68/* Return true if TYPE, which must be a struct type, represents a Rust
69 enum. */
c44af4eb 70
b96645f1 71static bool
9c6a1327 72rust_enum_p (struct type *type)
b96645f1 73{
9c6a1327
TT
74 /* is_dynamic_type will return true if any field has a dynamic
75 attribute -- but we only want to check the top level. */
76 return TYPE_HAS_VARIANT_PARTS (type);
b96645f1
MG
77}
78
9c6a1327
TT
79/* Return true if TYPE, which must be an already-resolved enum type,
80 has no variants. */
098b2108
TT
81
82static bool
83rust_empty_enum_p (const struct type *type)
84{
1f704f76 85 return type->num_fields () == 0;
098b2108
TT
86}
87
9c6a1327
TT
88/* Given an already-resolved enum type and contents, find which
89 variant is active. */
c44af4eb 90
9c6a1327
TT
91static int
92rust_enum_variant (struct type *type)
c44af4eb 93{
9c6a1327 94 /* The active variant is simply the first non-artificial field. */
1f704f76 95 for (int i = 0; i < type->num_fields (); ++i)
9c6a1327
TT
96 if (!TYPE_FIELD_ARTIFICIAL (type, i))
97 return i;
c44af4eb 98
9c6a1327
TT
99 /* Perhaps we could get here by trying to print an Ada variant
100 record in Rust mode. Unlikely, but an error is safer than an
101 assert. */
102 error (_("Could not find active enum variant"));
c44af4eb
TT
103}
104
105/* See rust-lang.h. */
106
65c40c95 107bool
c44af4eb
TT
108rust_tuple_type_p (struct type *type)
109{
110 /* The current implementation is a bit of a hack, but there's
111 nothing else in the debuginfo to distinguish a tuple from a
112 struct. */
78134374 113 return (type->code () == TYPE_CODE_STRUCT
7d93a1e0
SM
114 && type->name () != NULL
115 && type->name ()[0] == '(');
c44af4eb
TT
116}
117
c44af4eb 118/* Return true if all non-static fields of a structlike type are in a
c9317f21 119 sequence like __0, __1, __2. */
c44af4eb 120
65c40c95 121static bool
c9317f21 122rust_underscore_fields (struct type *type)
c44af4eb
TT
123{
124 int i, field_number;
125
126 field_number = 0;
127
78134374 128 if (type->code () != TYPE_CODE_STRUCT)
65c40c95 129 return false;
1f704f76 130 for (i = 0; i < type->num_fields (); ++i)
c44af4eb 131 {
ceacbf6e 132 if (!field_is_static (&type->field (i)))
c44af4eb 133 {
c9317f21 134 char buf[20];
c44af4eb 135
c9317f21
TT
136 xsnprintf (buf, sizeof (buf), "__%d", field_number);
137 if (strcmp (buf, TYPE_FIELD_NAME (type, i)) != 0)
138 return false;
139 field_number++;
c44af4eb
TT
140 }
141 }
65c40c95 142 return true;
c44af4eb
TT
143}
144
145/* See rust-lang.h. */
146
65c40c95 147bool
c44af4eb
TT
148rust_tuple_struct_type_p (struct type *type)
149{
12df5c00
TT
150 /* This is just an approximation until DWARF can represent Rust more
151 precisely. We exclude zero-length structs because they may not
152 be tuple structs, and there's no way to tell. */
1f704f76 153 return type->num_fields () > 0 && rust_underscore_fields (type);
c44af4eb
TT
154}
155
156/* Return true if TYPE is a slice type, otherwise false. */
157
65c40c95 158static bool
c44af4eb
TT
159rust_slice_type_p (struct type *type)
160{
78134374 161 return (type->code () == TYPE_CODE_STRUCT
7d93a1e0
SM
162 && type->name () != NULL
163 && (strncmp (type->name (), "&[", 2) == 0
164 || strcmp (type->name (), "&str") == 0));
c44af4eb
TT
165}
166
167/* Return true if TYPE is a range type, otherwise false. */
168
65c40c95 169static bool
c44af4eb
TT
170rust_range_type_p (struct type *type)
171{
172 int i;
173
78134374 174 if (type->code () != TYPE_CODE_STRUCT
1f704f76 175 || type->num_fields () > 2
7d93a1e0
SM
176 || type->name () == NULL
177 || strstr (type->name (), "::Range") == NULL)
65c40c95 178 return false;
c44af4eb 179
1f704f76 180 if (type->num_fields () == 0)
65c40c95 181 return true;
c44af4eb
TT
182
183 i = 0;
184 if (strcmp (TYPE_FIELD_NAME (type, 0), "start") == 0)
185 {
1f704f76 186 if (type->num_fields () == 1)
65c40c95 187 return true;
c44af4eb
TT
188 i = 1;
189 }
1f704f76 190 else if (type->num_fields () == 2)
c44af4eb
TT
191 {
192 /* First field had to be "start". */
65c40c95 193 return false;
c44af4eb
TT
194 }
195
196 return strcmp (TYPE_FIELD_NAME (type, i), "end") == 0;
197}
198
6873858b
TT
199/* Return true if TYPE is an inclusive range type, otherwise false.
200 This is only valid for types which are already known to be range
201 types. */
202
203static bool
204rust_inclusive_range_type_p (struct type *type)
205{
7d93a1e0
SM
206 return (strstr (type->name (), "::RangeInclusive") != NULL
207 || strstr (type->name (), "::RangeToInclusive") != NULL);
6873858b
TT
208}
209
c44af4eb
TT
210/* Return true if TYPE seems to be the type "u8", otherwise false. */
211
65c40c95 212static bool
c44af4eb
TT
213rust_u8_type_p (struct type *type)
214{
78134374 215 return (type->code () == TYPE_CODE_INT
c6d940a9 216 && type->is_unsigned ()
c44af4eb
TT
217 && TYPE_LENGTH (type) == 1);
218}
219
220/* Return true if TYPE is a Rust character type. */
221
65c40c95 222static bool
c44af4eb
TT
223rust_chartype_p (struct type *type)
224{
78134374 225 return (type->code () == TYPE_CODE_CHAR
c44af4eb 226 && TYPE_LENGTH (type) == 4
c6d940a9 227 && type->is_unsigned ());
c44af4eb
TT
228}
229
71a3c369
TT
230/* If VALUE represents a trait object pointer, return the underlying
231 pointer with the correct (i.e., runtime) type. Otherwise, return
232 NULL. */
233
234static struct value *
235rust_get_trait_object_pointer (struct value *value)
236{
237 struct type *type = check_typedef (value_type (value));
238
1f704f76 239 if (type->code () != TYPE_CODE_STRUCT || type->num_fields () != 2)
71a3c369
TT
240 return NULL;
241
242 /* Try to be a bit resilient if the ABI changes. */
243 int vtable_field = 0;
244 for (int i = 0; i < 2; ++i)
245 {
246 if (strcmp (TYPE_FIELD_NAME (type, i), "vtable") == 0)
247 vtable_field = i;
248 else if (strcmp (TYPE_FIELD_NAME (type, i), "pointer") != 0)
249 return NULL;
250 }
251
252 CORE_ADDR vtable = value_as_address (value_field (value, vtable_field));
253 struct symbol *symbol = find_symbol_at_address (vtable);
cf724bc9 254 if (symbol == NULL || symbol->subclass != SYMBOL_RUST_VTABLE)
71a3c369
TT
255 return NULL;
256
257 struct rust_vtable_symbol *vtable_sym
258 = static_cast<struct rust_vtable_symbol *> (symbol);
259 struct type *pointer_type = lookup_pointer_type (vtable_sym->concrete_type);
260 return value_cast (pointer_type, value_field (value, 1 - vtable_field));
261}
262
c44af4eb
TT
263\f
264
1c485265 265/* See language.h. */
c44af4eb 266
1c485265
AB
267void
268rust_language::printstr (struct ui_file *stream, struct type *type,
269 const gdb_byte *string, unsigned int length,
270 const char *user_encoding, int force_ellipses,
271 const struct value_print_options *options) const
c44af4eb
TT
272{
273 /* Rust always uses UTF-8, but let the caller override this if need
274 be. */
275 const char *encoding = user_encoding;
276 if (user_encoding == NULL || !*user_encoding)
277 {
278 /* In Rust strings, characters are "u8". */
279 if (rust_u8_type_p (type))
280 encoding = "UTF-8";
281 else
282 {
283 /* This is probably some C string, so let's let C deal with
284 it. */
285 c_printstr (stream, type, string, length, user_encoding,
286 force_ellipses, options);
287 return;
288 }
289 }
290
291 /* This is not ideal as it doesn't use our character printer. */
292 generic_printstr (stream, type, string, length, encoding, force_ellipses,
293 '"', 0, options);
294}
295
296\f
297
45320ffa
TT
298/* Helper function to print a string slice. */
299
300static void
301rust_val_print_str (struct ui_file *stream, struct value *val,
302 const struct value_print_options *options)
303{
304 struct value *base = value_struct_elt (&val, NULL, "data_ptr", NULL,
305 "slice");
306 struct value *len = value_struct_elt (&val, NULL, "length", NULL, "slice");
307
308 val_print_string (TYPE_TARGET_TYPE (value_type (base)), "UTF-8",
309 value_as_address (base), value_as_long (len), stream,
310 options);
311}
312
1c485265 313/* See rust-lang.h. */
b96645f1 314
1c485265
AB
315void
316rust_language::val_print_struct
317 (struct value *val, struct ui_file *stream, int recurse,
318 const struct value_print_options *options) const
b96645f1
MG
319{
320 int i;
321 int first_field;
5f56f7cb 322 struct type *type = check_typedef (value_type (val));
45320ffa 323
7d93a1e0 324 if (rust_slice_type_p (type) && strcmp (type->name (), "&str") == 0)
45320ffa 325 {
80062eb9
AB
326 /* If what we are printing here is actually a string within a
327 structure then VAL will be the original parent value, while TYPE
328 will be the type of the structure representing the string we want
329 to print.
330 However, RUST_VAL_PRINT_STR looks up the fields of the string
331 inside VAL, assuming that VAL is the string.
332 So, recreate VAL as a value representing just the string. */
5f56f7cb 333 val = value_at_lazy (type, value_address (val));
45320ffa
TT
334 rust_val_print_str (stream, val, options);
335 return;
336 }
337
65c40c95
TT
338 bool is_tuple = rust_tuple_type_p (type);
339 bool is_tuple_struct = !is_tuple && rust_tuple_struct_type_p (type);
b96645f1
MG
340 struct value_print_options opts;
341
342 if (!is_tuple)
343 {
7d93a1e0 344 if (type->name () != NULL)
dda83cd7 345 fprintf_filtered (stream, "%s", type->name ());
b96645f1 346
1f704f76 347 if (type->num_fields () == 0)
dda83cd7 348 return;
b96645f1 349
7d93a1e0 350 if (type->name () != NULL)
dda83cd7 351 fputs_filtered (" ", stream);
b96645f1
MG
352 }
353
354 if (is_tuple || is_tuple_struct)
355 fputs_filtered ("(", stream);
356 else
357 fputs_filtered ("{", stream);
358
359 opts = *options;
360 opts.deref_ref = 0;
361
362 first_field = 1;
1f704f76 363 for (i = 0; i < type->num_fields (); ++i)
b96645f1 364 {
ceacbf6e 365 if (field_is_static (&type->field (i)))
dda83cd7 366 continue;
b96645f1
MG
367
368 if (!first_field)
dda83cd7 369 fputs_filtered (",", stream);
b96645f1
MG
370
371 if (options->prettyformat)
dda83cd7 372 {
b50f188d
TT
373 fputs_filtered ("\n", stream);
374 print_spaces_filtered (2 + 2 * recurse, stream);
dda83cd7 375 }
b96645f1 376 else if (!first_field)
dda83cd7 377 fputs_filtered (" ", stream);
b96645f1
MG
378
379 first_field = 0;
380
381 if (!is_tuple && !is_tuple_struct)
dda83cd7 382 {
3f0cbb04
TT
383 fputs_styled (TYPE_FIELD_NAME (type, i),
384 variable_name_style.style (), stream);
b50f188d 385 fputs_filtered (": ", stream);
dda83cd7 386 }
b96645f1 387
1c485265 388 value_print_inner (value_field (val, i), stream, recurse + 1, &opts);
b96645f1
MG
389 }
390
391 if (options->prettyformat)
392 {
393 fputs_filtered ("\n", stream);
394 print_spaces_filtered (2 * recurse, stream);
395 }
396
397 if (is_tuple || is_tuple_struct)
398 fputs_filtered (")", stream);
399 else
400 fputs_filtered ("}", stream);
401}
402
1c485265 403/* See rust-lang.h. */
c9317f21 404
1c485265
AB
405void
406rust_language::print_enum (struct value *val, struct ui_file *stream,
407 int recurse,
408 const struct value_print_options *options) const
c9317f21
TT
409{
410 struct value_print_options opts = *options;
5f56f7cb 411 struct type *type = check_typedef (value_type (val));
c9317f21
TT
412
413 opts.deref_ref = 0;
414
9c6a1327
TT
415 gdb_assert (rust_enum_p (type));
416 gdb::array_view<const gdb_byte> view (value_contents_for_printing (val),
417 TYPE_LENGTH (value_type (val)));
418 type = resolve_dynamic_type (type, view, value_address (val));
419
098b2108
TT
420 if (rust_empty_enum_p (type))
421 {
422 /* Print the enum type name here to be more clear. */
7f6aba03 423 fprintf_filtered (stream, _("%s {%p[<No data fields>%p]}"),
7d93a1e0 424 type->name (),
7f6aba03 425 metadata_style.style ().ptr (), nullptr);
098b2108
TT
426 return;
427 }
428
9c6a1327
TT
429 int variant_fieldno = rust_enum_variant (type);
430 val = value_field (val, variant_fieldno);
940da03e 431 struct type *variant_type = type->field (variant_fieldno).type ();
c9317f21 432
1f704f76 433 int nfields = variant_type->num_fields ();
c9317f21
TT
434
435 bool is_tuple = rust_tuple_struct_type_p (variant_type);
436
7d93a1e0 437 fprintf_filtered (stream, "%s", variant_type->name ());
c9317f21
TT
438 if (nfields == 0)
439 {
440 /* In case of a nullary variant like 'None', just output
441 the name. */
442 return;
443 }
444
445 /* In case of a non-nullary variant, we output 'Foo(x,y,z)'. */
446 if (is_tuple)
447 fprintf_filtered (stream, "(");
448 else
449 {
450 /* struct variant. */
451 fprintf_filtered (stream, "{");
452 }
453
454 bool first_field = true;
1f704f76 455 for (int j = 0; j < variant_type->num_fields (); j++)
c9317f21
TT
456 {
457 if (!first_field)
458 fputs_filtered (", ", stream);
459 first_field = false;
460
461 if (!is_tuple)
3f0cbb04
TT
462 fprintf_filtered (stream, "%ps: ",
463 styled_string (variable_name_style.style (),
464 TYPE_FIELD_NAME (variant_type, j)));
c9317f21 465
1c485265 466 value_print_inner (value_field (val, j), stream, recurse + 1, &opts);
c9317f21
TT
467 }
468
469 if (is_tuple)
470 fputs_filtered (")", stream);
471 else
472 fputs_filtered ("}", stream);
473}
474
c44af4eb
TT
475static const struct generic_val_print_decorations rust_decorations =
476{
477 /* Complex isn't used in Rust, but we provide C-ish values just in
478 case. */
479 "",
480 " + ",
481 " * I",
482 "true",
483 "false",
921d8f54 484 "()",
c44af4eb
TT
485 "[",
486 "]"
487};
488
1c485265
AB
489/* See language.h. */
490
491void
492rust_language::value_print_inner
493 (struct value *val, struct ui_file *stream, int recurse,
494 const struct value_print_options *options) const
5f56f7cb
TT
495{
496 struct value_print_options opts = *options;
497 opts.deref_ref = 1;
498
499 if (opts.prettyformat == Val_prettyformat_default)
500 opts.prettyformat = (opts.prettyformat_structs
501 ? Val_prettyformat : Val_no_prettyformat);
502
503 struct type *type = check_typedef (value_type (val));
78134374 504 switch (type->code ())
c44af4eb
TT
505 {
506 case TYPE_CODE_PTR:
507 {
508 LONGEST low_bound, high_bound;
509
78134374 510 if (TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_ARRAY
c44af4eb
TT
511 && rust_u8_type_p (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (type)))
512 && get_array_bounds (TYPE_TARGET_TYPE (type), &low_bound,
5f56f7cb
TT
513 &high_bound))
514 {
515 /* We have a pointer to a byte string, so just print
516 that. */
517 struct type *elttype = check_typedef (TYPE_TARGET_TYPE (type));
518 CORE_ADDR addr = value_as_address (val);
519 struct gdbarch *arch = get_type_arch (type);
c44af4eb 520
5f56f7cb
TT
521 if (opts.addressprint)
522 {
523 fputs_filtered (paddress (arch, addr), stream);
524 fputs_filtered (" ", stream);
525 }
c44af4eb 526
5f56f7cb
TT
527 fputs_filtered ("b", stream);
528 val_print_string (TYPE_TARGET_TYPE (elttype), "ASCII", addr,
529 high_bound - low_bound + 1, stream,
530 &opts);
531 break;
532 }
c44af4eb 533 }
5f56f7cb 534 goto generic_print;
c44af4eb 535
c44af4eb
TT
536 case TYPE_CODE_INT:
537 /* Recognize the unit type. */
c6d940a9 538 if (type->is_unsigned () && TYPE_LENGTH (type) == 0
7d93a1e0 539 && type->name () != NULL && strcmp (type->name (), "()") == 0)
c44af4eb
TT
540 {
541 fputs_filtered ("()", stream);
542 break;
543 }
544 goto generic_print;
545
546 case TYPE_CODE_STRING:
547 {
c44af4eb
TT
548 LONGEST low_bound, high_bound;
549
550 if (!get_array_bounds (type, &low_bound, &high_bound))
551 error (_("Could not determine the array bounds"));
552
553 /* If we see a plain TYPE_CODE_STRING, then we're printing a
554 byte string, hence the choice of "ASCII" as the
555 encoding. */
556 fputs_filtered ("b", stream);
1c485265
AB
557 printstr (stream, TYPE_TARGET_TYPE (type),
558 value_contents_for_printing (val),
559 high_bound - low_bound + 1, "ASCII", 0, &opts);
c44af4eb
TT
560 }
561 break;
562
563 case TYPE_CODE_ARRAY:
564 {
565 LONGEST low_bound, high_bound;
566
567 if (get_array_bounds (type, &low_bound, &high_bound)
568 && high_bound - low_bound + 1 == 0)
569 fputs_filtered ("[]", stream);
570 else
571 goto generic_print;
572 }
573 break;
574
575 case TYPE_CODE_UNION:
c9317f21
TT
576 /* Untagged unions are printed as if they are structs. Since
577 the field bit positions overlap in the debuginfo, the code
578 for printing a union is same as that for a struct, the only
579 difference is that the input type will have overlapping
580 fields. */
5f56f7cb 581 val_print_struct (val, stream, recurse, &opts);
c44af4eb
TT
582 break;
583
584 case TYPE_CODE_STRUCT:
c9317f21 585 if (rust_enum_p (type))
1c485265 586 print_enum (val, stream, recurse, &opts);
c9317f21 587 else
5f56f7cb 588 val_print_struct (val, stream, recurse, &opts);
b96645f1 589 break;
c44af4eb 590
b96645f1
MG
591 default:
592 generic_print:
593 /* Nothing special yet. */
5f56f7cb 594 generic_value_print (val, stream, recurse, &opts, &rust_decorations);
b96645f1
MG
595 }
596}
c44af4eb 597
b96645f1 598\f
c44af4eb 599
b96645f1 600static void
c9317f21
TT
601rust_internal_print_type (struct type *type, const char *varstring,
602 struct ui_file *stream, int show, int level,
603 const struct type_print_options *flags,
a33ccfc7 604 bool for_rust_enum, print_offset_data *podata);
b96645f1
MG
605
606/* Print a struct or union typedef. */
607static void
608rust_print_struct_def (struct type *type, const char *varstring,
b50f188d 609 struct ui_file *stream, int show, int level,
c9317f21 610 const struct type_print_options *flags,
a33ccfc7 611 bool for_rust_enum, print_offset_data *podata)
b96645f1 612{
b50f188d
TT
613 /* Print a tuple type simply. */
614 if (rust_tuple_type_p (type))
615 {
7d93a1e0 616 fputs_filtered (type->name (), stream);
b50f188d
TT
617 return;
618 }
c44af4eb 619
b50f188d
TT
620 /* If we see a base class, delegate to C. */
621 if (TYPE_N_BASECLASSES (type) > 0)
622 c_print_type (type, varstring, stream, show, level, flags);
c44af4eb 623
a33ccfc7
TT
624 if (flags->print_offsets)
625 {
626 /* Temporarily bump the level so that the output lines up
627 correctly. */
628 level += 2;
629 }
630
c9317f21
TT
631 /* Compute properties of TYPE here because, in the enum case, the
632 rest of the code ends up looking only at the variant part. */
7d93a1e0 633 const char *tagname = type->name ();
c9317f21
TT
634 bool is_tuple_struct = rust_tuple_struct_type_p (type);
635 bool is_tuple = rust_tuple_type_p (type);
636 bool is_enum = rust_enum_p (type);
b96645f1 637
c9317f21
TT
638 if (for_rust_enum)
639 {
640 /* Already printing an outer enum, so nothing to print here. */
641 }
642 else
643 {
644 /* This code path is also used by unions and enums. */
645 if (is_enum)
646 {
647 fputs_filtered ("enum ", stream);
24e99c6c 648 dynamic_prop *prop = type->dyn_prop (DYN_PROP_VARIANT_PARTS);
8c2e4e06
SM
649 if (prop != nullptr && prop->kind () == PROP_TYPE)
650 type = prop->original_type ();
c9317f21 651 }
78134374 652 else if (type->code () == TYPE_CODE_STRUCT)
c9317f21
TT
653 fputs_filtered ("struct ", stream);
654 else
655 fputs_filtered ("union ", stream);
b96645f1 656
c9317f21
TT
657 if (tagname != NULL)
658 fputs_filtered (tagname, stream);
659 }
b96645f1 660
1f704f76 661 if (type->num_fields () == 0 && !is_tuple)
b50f188d 662 return;
a33ccfc7 663 if (for_rust_enum && !flags->print_offsets)
c9317f21
TT
664 fputs_filtered (is_tuple_struct ? "(" : "{", stream);
665 else
666 fputs_filtered (is_tuple_struct ? " (\n" : " {\n", stream);
c44af4eb 667
a33ccfc7
TT
668 /* When printing offsets, we rearrange the fields into storage
669 order. This lets us show holes more clearly. We work using
670 field indices here because it simplifies calls to
671 print_offset_data::update below. */
672 std::vector<int> fields;
1f704f76 673 for (int i = 0; i < type->num_fields (); ++i)
b50f188d 674 {
ceacbf6e 675 if (field_is_static (&type->field (i)))
b50f188d 676 continue;
9c6a1327 677 if (is_enum && TYPE_FIELD_ARTIFICIAL (type, i))
a33ccfc7
TT
678 continue;
679 fields.push_back (i);
680 }
681 if (flags->print_offsets)
682 std::sort (fields.begin (), fields.end (),
683 [&] (int a, int b)
684 {
685 return (TYPE_FIELD_BITPOS (type, a)
686 < TYPE_FIELD_BITPOS (type, b));
687 });
688
689 for (int i : fields)
690 {
691 QUIT;
692
ceacbf6e 693 gdb_assert (!field_is_static (&type->field (i)));
9c6a1327 694 gdb_assert (! (is_enum && TYPE_FIELD_ARTIFICIAL (type, i)));
a33ccfc7
TT
695
696 if (flags->print_offsets)
697 podata->update (type, i, stream);
b50f188d
TT
698
699 /* We'd like to print "pub" here as needed, but rustc
700 doesn't emit the debuginfo, and our types don't have
701 cplus_struct_type attached. */
702
703 /* For a tuple struct we print the type but nothing
704 else. */
a33ccfc7 705 if (!for_rust_enum || flags->print_offsets)
c9317f21
TT
706 print_spaces_filtered (level + 2, stream);
707 if (is_enum)
3f0cbb04
TT
708 fputs_styled (TYPE_FIELD_NAME (type, i), variable_name_style.style (),
709 stream);
c9317f21 710 else if (!is_tuple_struct)
3f0cbb04
TT
711 fprintf_filtered (stream, "%ps: ",
712 styled_string (variable_name_style.style (),
713 TYPE_FIELD_NAME (type, i)));
b50f188d 714
940da03e 715 rust_internal_print_type (type->field (i).type (), NULL,
53d7df28 716 stream, (is_enum ? show : show - 1),
a33ccfc7
TT
717 level + 2, flags, is_enum, podata);
718 if (!for_rust_enum || flags->print_offsets)
c9317f21 719 fputs_filtered (",\n", stream);
a33ccfc7
TT
720 /* Note that this check of "I" is ok because we only sorted the
721 fields by offset when print_offsets was set, so we won't take
722 this branch in that case. */
1f704f76 723 else if (i + 1 < type->num_fields ())
c9317f21 724 fputs_filtered (", ", stream);
b50f188d 725 }
c44af4eb 726
a33ccfc7
TT
727 if (flags->print_offsets)
728 {
729 /* Undo the temporary level increase we did above. */
730 level -= 2;
731 podata->finish (type, level, stream);
732 print_spaces_filtered (print_offset_data::indentation, stream);
733 if (level == 0)
734 print_spaces_filtered (2, stream);
735 }
736 if (!for_rust_enum || flags->print_offsets)
c9317f21
TT
737 print_spaces_filtered (level, stream);
738 fputs_filtered (is_tuple_struct ? ")" : "}", stream);
c44af4eb
TT
739}
740
c44af4eb
TT
741/* la_print_type implementation for Rust. */
742
743static void
c9317f21
TT
744rust_internal_print_type (struct type *type, const char *varstring,
745 struct ui_file *stream, int show, int level,
746 const struct type_print_options *flags,
a33ccfc7 747 bool for_rust_enum, print_offset_data *podata)
c44af4eb 748{
c44af4eb
TT
749 QUIT;
750 if (show <= 0
7d93a1e0 751 && type->name () != NULL)
c44af4eb 752 {
921d8f54 753 /* Rust calls the unit type "void" in its debuginfo,
dda83cd7 754 but we don't want to print it as that. */
78134374 755 if (type->code () == TYPE_CODE_VOID)
dda83cd7 756 fputs_filtered ("()", stream);
921d8f54 757 else
dda83cd7 758 fputs_filtered (type->name (), stream);
c44af4eb
TT
759 return;
760 }
761
762 type = check_typedef (type);
78134374 763 switch (type->code ())
c44af4eb 764 {
921d8f54 765 case TYPE_CODE_VOID:
c9317f21
TT
766 /* If we have an enum, we've already printed the type's
767 unqualified name, and there is nothing else to print
768 here. */
769 if (!for_rust_enum)
770 fputs_filtered ("()", stream);
921d8f54
MG
771 break;
772
c44af4eb
TT
773 case TYPE_CODE_FUNC:
774 /* Delegate varargs to the C printer. */
a409645d 775 if (type->has_varargs ())
c44af4eb
TT
776 goto c_printer;
777
778 fputs_filtered ("fn ", stream);
779 if (varstring != NULL)
780 fputs_filtered (varstring, stream);
781 fputs_filtered ("(", stream);
1f704f76 782 for (int i = 0; i < type->num_fields (); ++i)
c44af4eb
TT
783 {
784 QUIT;
785 if (i > 0)
786 fputs_filtered (", ", stream);
940da03e 787 rust_internal_print_type (type->field (i).type (), "", stream,
a33ccfc7 788 -1, 0, flags, false, podata);
c44af4eb 789 }
921d8f54
MG
790 fputs_filtered (")", stream);
791 /* If it returns unit, we can omit the return type. */
78134374 792 if (TYPE_TARGET_TYPE (type)->code () != TYPE_CODE_VOID)
dda83cd7
SM
793 {
794 fputs_filtered (" -> ", stream);
795 rust_internal_print_type (TYPE_TARGET_TYPE (type), "", stream,
a33ccfc7 796 -1, 0, flags, false, podata);
dda83cd7 797 }
c44af4eb
TT
798 break;
799
800 case TYPE_CODE_ARRAY:
801 {
802 LONGEST low_bound, high_bound;
803
804 fputs_filtered ("[", stream);
c9317f21 805 rust_internal_print_type (TYPE_TARGET_TYPE (type), NULL,
a33ccfc7
TT
806 stream, show - 1, level, flags, false,
807 podata);
c44af4eb 808
cf88be68
SM
809 if (type->bounds ()->high.kind () == PROP_LOCEXPR
810 || type->bounds ()->high.kind () == PROP_LOCLIST)
e6cf65f2 811 fprintf_filtered (stream, "; variable length");
c44af4eb 812 else if (get_array_bounds (type, &low_bound, &high_bound))
e6cf65f2 813 fprintf_filtered (stream, "; %s",
c44af4eb
TT
814 plongest (high_bound - low_bound + 1));
815 fputs_filtered ("]", stream);
816 }
817 break;
818
c9317f21 819 case TYPE_CODE_UNION:
c44af4eb 820 case TYPE_CODE_STRUCT:
c9317f21 821 rust_print_struct_def (type, varstring, stream, show, level, flags,
a33ccfc7 822 for_rust_enum, podata);
c44af4eb
TT
823 break;
824
825 case TYPE_CODE_ENUM:
826 {
b926417a 827 int len = 0;
c44af4eb
TT
828
829 fputs_filtered ("enum ", stream);
7d93a1e0 830 if (type->name () != NULL)
c44af4eb 831 {
7d93a1e0 832 fputs_filtered (type->name (), stream);
c44af4eb 833 fputs_filtered (" ", stream);
7d93a1e0 834 len = strlen (type->name ());
c44af4eb
TT
835 }
836 fputs_filtered ("{\n", stream);
837
1f704f76 838 for (int i = 0; i < type->num_fields (); ++i)
c44af4eb
TT
839 {
840 const char *name = TYPE_FIELD_NAME (type, i);
841
842 QUIT;
843
844 if (len > 0
7d93a1e0 845 && strncmp (name, type->name (), len) == 0
c44af4eb
TT
846 && name[len] == ':'
847 && name[len + 1] == ':')
848 name += len + 2;
32f47895
TT
849 fprintf_filtered (stream, "%*s%ps,\n",
850 level + 2, "",
851 styled_string (variable_name_style.style (),
852 name));
c44af4eb
TT
853 }
854
855 fputs_filtered ("}", stream);
856 }
73fc52c4
TT
857 break;
858
859 case TYPE_CODE_PTR:
860 {
7d93a1e0
SM
861 if (type->name () != nullptr)
862 fputs_filtered (type->name (), stream);
73fc52c4
TT
863 else
864 {
865 /* We currently can't distinguish between pointers and
866 references. */
867 fputs_filtered ("*mut ", stream);
868 type_print (TYPE_TARGET_TYPE (type), "", stream, 0);
869 }
870 }
c44af4eb
TT
871 break;
872
c44af4eb
TT
873 default:
874 c_printer:
875 c_print_type (type, varstring, stream, show, level, flags);
876 }
877}
878
879\f
880
c44af4eb
TT
881/* Like arch_composite_type, but uses TYPE to decide how to allocate
882 -- either on an obstack or on a gdbarch. */
883
884static struct type *
885rust_composite_type (struct type *original,
886 const char *name,
887 const char *field1, struct type *type1,
888 const char *field2, struct type *type2)
889{
890 struct type *result = alloc_type_copy (original);
891 int i, nfields, bitpos;
892
893 nfields = 0;
894 if (field1 != NULL)
895 ++nfields;
896 if (field2 != NULL)
897 ++nfields;
898
67607e24 899 result->set_code (TYPE_CODE_STRUCT);
d0e39ea2 900 result->set_name (name);
c44af4eb 901
5e33d5f4 902 result->set_num_fields (nfields);
3cabb6b0
SM
903 result->set_fields
904 ((struct field *) TYPE_ZALLOC (result, nfields * sizeof (struct field)));
c44af4eb
TT
905
906 i = 0;
907 bitpos = 0;
908 if (field1 != NULL)
909 {
ceacbf6e 910 struct field *field = &result->field (i);
c44af4eb
TT
911
912 SET_FIELD_BITPOS (*field, bitpos);
913 bitpos += TYPE_LENGTH (type1) * TARGET_CHAR_BIT;
914
915 FIELD_NAME (*field) = field1;
5d14b6e5 916 field->set_type (type1);
c44af4eb
TT
917 ++i;
918 }
919 if (field2 != NULL)
920 {
ceacbf6e 921 struct field *field = &result->field (i);
2fff16dd 922 unsigned align = type_align (type2);
c44af4eb
TT
923
924 if (align != 0)
925 {
926 int delta;
927
928 align *= TARGET_CHAR_BIT;
929 delta = bitpos % align;
930 if (delta != 0)
931 bitpos += align - delta;
932 }
933 SET_FIELD_BITPOS (*field, bitpos);
934
935 FIELD_NAME (*field) = field2;
5d14b6e5 936 field->set_type (type2);
c44af4eb
TT
937 ++i;
938 }
939
940 if (i > 0)
941 TYPE_LENGTH (result)
942 = (TYPE_FIELD_BITPOS (result, i - 1) / TARGET_CHAR_BIT +
940da03e 943 TYPE_LENGTH (result->field (i - 1).type ()));
c44af4eb
TT
944 return result;
945}
946
947/* See rust-lang.h. */
948
949struct type *
950rust_slice_type (const char *name, struct type *elt_type,
951 struct type *usize_type)
952{
953 struct type *type;
954
955 elt_type = lookup_pointer_type (elt_type);
956 type = rust_composite_type (elt_type, name,
957 "data_ptr", elt_type,
958 "length", usize_type);
959
960 return type;
961}
962
c44af4eb
TT
963\f
964
965/* A helper for rust_evaluate_subexp that handles OP_FUNCALL. */
966
967static struct value *
968rust_evaluate_funcall (struct expression *exp, int *pos, enum noside noside)
969{
970 int i;
971 int num_args = exp->elts[*pos + 1].longconst;
972 const char *method;
c44af4eb 973 struct value *function, *result, *arg0;
c44af4eb
TT
974 struct type *type, *fn_type;
975 const struct block *block;
976 struct block_symbol sym;
977
978 /* For an ordinary function call we can simply defer to the
979 generic implementation. */
980 if (exp->elts[*pos + 3].opcode != STRUCTOP_STRUCT)
981 return evaluate_subexp_standard (NULL, exp, pos, noside);
982
983 /* Skip over the OP_FUNCALL and the STRUCTOP_STRUCT. */
984 *pos += 4;
985 method = &exp->elts[*pos + 1].string;
986 *pos += 3 + BYTES_TO_EXP_ELEM (exp->elts[*pos].longconst + 1);
987
988 /* Evaluate the argument to STRUCTOP_STRUCT, then find its
989 type in order to look up the method. */
fe1fe7ea 990 arg0 = evaluate_subexp (nullptr, exp, pos, noside);
c44af4eb
TT
991
992 if (noside == EVAL_SKIP)
993 {
994 for (i = 0; i < num_args; ++i)
fe1fe7ea 995 evaluate_subexp (nullptr, exp, pos, noside);
c44af4eb
TT
996 return arg0;
997 }
998
ab8b80a8 999 std::vector<struct value *> args (num_args + 1);
c44af4eb
TT
1000 args[0] = arg0;
1001
1002 /* We don't yet implement real Deref semantics. */
78134374 1003 while (value_type (args[0])->code () == TYPE_CODE_PTR)
c44af4eb
TT
1004 args[0] = value_ind (args[0]);
1005
1006 type = value_type (args[0]);
78134374
SM
1007 if ((type->code () != TYPE_CODE_STRUCT
1008 && type->code () != TYPE_CODE_UNION
1009 && type->code () != TYPE_CODE_ENUM)
c44af4eb
TT
1010 || rust_tuple_type_p (type))
1011 error (_("Method calls only supported on struct or enum types"));
7d93a1e0 1012 if (type->name () == NULL)
c44af4eb
TT
1013 error (_("Method call on nameless type"));
1014
7d93a1e0 1015 std::string name = std::string (type->name ()) + "::" + method;
c44af4eb
TT
1016
1017 block = get_selected_block (0);
ab8b80a8 1018 sym = lookup_symbol (name.c_str (), block, VAR_DOMAIN, NULL);
c44af4eb 1019 if (sym.symbol == NULL)
ab8b80a8 1020 error (_("Could not find function named '%s'"), name.c_str ());
c44af4eb
TT
1021
1022 fn_type = SYMBOL_TYPE (sym.symbol);
1f704f76 1023 if (fn_type->num_fields () == 0)
ab8b80a8 1024 error (_("Function '%s' takes no arguments"), name.c_str ());
c44af4eb 1025
940da03e 1026 if (fn_type->field (0).type ()->code () == TYPE_CODE_PTR)
c44af4eb
TT
1027 args[0] = value_addr (args[0]);
1028
1029 function = address_of_variable (sym.symbol, block);
1030
1031 for (i = 0; i < num_args; ++i)
fe1fe7ea 1032 args[i + 1] = evaluate_subexp (nullptr, exp, pos, noside);
c44af4eb
TT
1033
1034 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1035 result = value_zero (TYPE_TARGET_TYPE (fn_type), not_lval);
1036 else
e71585ff 1037 result = call_function_by_hand (function, NULL, args);
c44af4eb
TT
1038 return result;
1039}
1040
01739a3b 1041/* A helper for rust_evaluate_subexp that handles OP_RANGE. */
c44af4eb
TT
1042
1043static struct value *
1044rust_range (struct expression *exp, int *pos, enum noside noside)
1045{
c44af4eb
TT
1046 struct value *low = NULL, *high = NULL;
1047 struct value *addrval, *result;
1048 CORE_ADDR addr;
1049 struct type *range_type;
1050 struct type *index_type;
1051 struct type *temp_type;
1052 const char *name;
1053
f2d8e4c5
AB
1054 auto kind
1055 = (enum range_flag) longest_to_int (exp->elts[*pos + 1].longconst);
c44af4eb
TT
1056 *pos += 3;
1057
2f1b18db 1058 if (!(kind & RANGE_LOW_BOUND_DEFAULT))
fe1fe7ea 1059 low = evaluate_subexp (nullptr, exp, pos, noside);
2f1b18db 1060 if (!(kind & RANGE_HIGH_BOUND_DEFAULT))
fe1fe7ea 1061 high = evaluate_subexp (nullptr, exp, pos, noside);
2f1b18db 1062 bool inclusive = !(kind & RANGE_HIGH_BOUND_EXCLUSIVE);
c44af4eb
TT
1063
1064 if (noside == EVAL_SKIP)
1065 return value_from_longest (builtin_type (exp->gdbarch)->builtin_int, 1);
1066
1067 if (low == NULL)
1068 {
1069 if (high == NULL)
1070 {
1071 index_type = NULL;
1072 name = "std::ops::RangeFull";
1073 }
1074 else
1075 {
1076 index_type = value_type (high);
6873858b
TT
1077 name = (inclusive
1078 ? "std::ops::RangeToInclusive" : "std::ops::RangeTo");
c44af4eb
TT
1079 }
1080 }
1081 else
1082 {
1083 if (high == NULL)
1084 {
1085 index_type = value_type (low);
1086 name = "std::ops::RangeFrom";
1087 }
1088 else
1089 {
1090 if (!types_equal (value_type (low), value_type (high)))
1091 error (_("Range expression with different types"));
1092 index_type = value_type (low);
6873858b 1093 name = inclusive ? "std::ops::RangeInclusive" : "std::ops::Range";
c44af4eb
TT
1094 }
1095 }
1096
1097 /* If we don't have an index type, just allocate this on the
1098 arch. Here any type will do. */
1099 temp_type = (index_type == NULL
1100 ? language_bool_type (exp->language_defn, exp->gdbarch)
1101 : index_type);
1102 /* It would be nicer to cache the range type. */
1103 range_type = rust_composite_type (temp_type, name,
1104 low == NULL ? NULL : "start", index_type,
1105 high == NULL ? NULL : "end", index_type);
1106
1107 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1108 return value_zero (range_type, lval_memory);
1109
1110 addrval = value_allocate_space_in_inferior (TYPE_LENGTH (range_type));
1111 addr = value_as_long (addrval);
1112 result = value_at_lazy (range_type, addr);
1113
1114 if (low != NULL)
1115 {
1116 struct value *start = value_struct_elt (&result, NULL, "start", NULL,
1117 "range");
1118
1119 value_assign (start, low);
1120 }
1121
1122 if (high != NULL)
1123 {
1124 struct value *end = value_struct_elt (&result, NULL, "end", NULL,
1125 "range");
1126
1127 value_assign (end, high);
1128 }
1129
1130 result = value_at_lazy (range_type, addr);
1131 return result;
1132}
1133
1134/* A helper function to compute the range and kind given a range
1135 value. TYPE is the type of the range value. RANGE is the range
1136 value. LOW, HIGH, and KIND are out parameters. The LOW and HIGH
1137 parameters might be filled in, or might not be, depending on the
1138 kind of range this is. KIND will always be set to the appropriate
1139 value describing the kind of range, and this can be used to
1140 determine whether LOW or HIGH are valid. */
1141
1142static void
1143rust_compute_range (struct type *type, struct value *range,
1144 LONGEST *low, LONGEST *high,
f2d8e4c5 1145 range_flags *kind)
c44af4eb
TT
1146{
1147 int i;
1148
1149 *low = 0;
1150 *high = 0;
2f1b18db 1151 *kind = RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT;
c44af4eb 1152
1f704f76 1153 if (type->num_fields () == 0)
c44af4eb
TT
1154 return;
1155
1156 i = 0;
1157 if (strcmp (TYPE_FIELD_NAME (type, 0), "start") == 0)
1158 {
2f1b18db 1159 *kind = RANGE_HIGH_BOUND_DEFAULT;
c44af4eb
TT
1160 *low = value_as_long (value_field (range, 0));
1161 ++i;
1162 }
1f704f76 1163 if (type->num_fields () > i
c44af4eb
TT
1164 && strcmp (TYPE_FIELD_NAME (type, i), "end") == 0)
1165 {
2f1b18db
AB
1166 *kind = (*kind == (RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT)
1167 ? RANGE_LOW_BOUND_DEFAULT : RANGE_STANDARD);
c44af4eb 1168 *high = value_as_long (value_field (range, i));
6873858b
TT
1169
1170 if (rust_inclusive_range_type_p (type))
1171 ++*high;
c44af4eb
TT
1172 }
1173}
1174
1175/* A helper for rust_evaluate_subexp that handles BINOP_SUBSCRIPT. */
1176
1177static struct value *
1178rust_subscript (struct expression *exp, int *pos, enum noside noside,
1179 int for_addr)
1180{
1181 struct value *lhs, *rhs, *result;
1182 struct type *rhstype;
45f4ed92 1183 LONGEST low, high_bound;
c44af4eb 1184 /* Initialized to appease the compiler. */
f2d8e4c5 1185 range_flags kind = RANGE_LOW_BOUND_DEFAULT | RANGE_HIGH_BOUND_DEFAULT;
45f4ed92 1186 LONGEST high = 0;
c44af4eb
TT
1187 int want_slice = 0;
1188
1189 ++*pos;
fe1fe7ea
SM
1190 lhs = evaluate_subexp (nullptr, exp, pos, noside);
1191 rhs = evaluate_subexp (nullptr, exp, pos, noside);
c44af4eb
TT
1192
1193 if (noside == EVAL_SKIP)
1194 return lhs;
1195
1196 rhstype = check_typedef (value_type (rhs));
1197 if (rust_range_type_p (rhstype))
1198 {
1199 if (!for_addr)
1200 error (_("Can't take slice of array without '&'"));
1201 rust_compute_range (rhstype, rhs, &low, &high, &kind);
1202 want_slice = 1;
1203 }
1204 else
1205 low = value_as_long (rhs);
1206
b3e3859b 1207 struct type *type = check_typedef (value_type (lhs));
c44af4eb
TT
1208 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1209 {
b3e3859b 1210 struct type *base_type = nullptr;
78134374 1211 if (type->code () == TYPE_CODE_ARRAY)
b3e3859b
TT
1212 base_type = TYPE_TARGET_TYPE (type);
1213 else if (rust_slice_type_p (type))
1214 {
1f704f76 1215 for (int i = 0; i < type->num_fields (); ++i)
b3e3859b
TT
1216 {
1217 if (strcmp (TYPE_FIELD_NAME (type, i), "data_ptr") == 0)
1218 {
940da03e 1219 base_type = TYPE_TARGET_TYPE (type->field (i).type ());
b3e3859b
TT
1220 break;
1221 }
1222 }
1223 if (base_type == nullptr)
1224 error (_("Could not find 'data_ptr' in slice type"));
1225 }
78134374 1226 else if (type->code () == TYPE_CODE_PTR)
b3e3859b
TT
1227 base_type = TYPE_TARGET_TYPE (type);
1228 else
1229 error (_("Cannot subscript non-array type"));
1230
1231 struct type *new_type;
1232 if (want_slice)
1233 {
1234 if (rust_slice_type_p (type))
1235 new_type = type;
1236 else
1237 {
1238 struct type *usize
1239 = language_lookup_primitive_type (exp->language_defn,
1240 exp->gdbarch,
1241 "usize");
1242 new_type = rust_slice_type ("&[*gdb*]", base_type, usize);
1243 }
1244 }
1245 else
1246 new_type = base_type;
c44af4eb 1247
b3e3859b 1248 return value_zero (new_type, VALUE_LVAL (lhs));
c44af4eb
TT
1249 }
1250 else
1251 {
1252 LONGEST low_bound;
1253 struct value *base;
c44af4eb 1254
78134374 1255 if (type->code () == TYPE_CODE_ARRAY)
c44af4eb
TT
1256 {
1257 base = lhs;
1258 if (!get_array_bounds (type, &low_bound, &high_bound))
1259 error (_("Can't compute array bounds"));
1260 if (low_bound != 0)
1261 error (_("Found array with non-zero lower bound"));
1262 ++high_bound;
1263 }
1264 else if (rust_slice_type_p (type))
1265 {
1266 struct value *len;
1267
1268 base = value_struct_elt (&lhs, NULL, "data_ptr", NULL, "slice");
1269 len = value_struct_elt (&lhs, NULL, "length", NULL, "slice");
1270 low_bound = 0;
1271 high_bound = value_as_long (len);
1272 }
78134374 1273 else if (type->code () == TYPE_CODE_PTR)
42d94011
MG
1274 {
1275 base = lhs;
1276 low_bound = 0;
1277 high_bound = LONGEST_MAX;
1278 }
c44af4eb
TT
1279 else
1280 error (_("Cannot subscript non-array type"));
1281
2f1b18db 1282 if (want_slice && (kind & RANGE_LOW_BOUND_DEFAULT))
c44af4eb
TT
1283 low = low_bound;
1284 if (low < 0)
1285 error (_("Index less than zero"));
1286 if (low > high_bound)
1287 error (_("Index greater than length"));
1288
1289 result = value_subscript (base, low);
1290 }
1291
1292 if (for_addr)
1293 {
1294 if (want_slice)
1295 {
1296 struct type *usize, *slice;
1297 CORE_ADDR addr;
1298 struct value *addrval, *tem;
1299
2f1b18db 1300 if (kind & RANGE_HIGH_BOUND_DEFAULT)
c44af4eb
TT
1301 high = high_bound;
1302 if (high < 0)
1303 error (_("High index less than zero"));
1304 if (low > high)
1305 error (_("Low index greater than high index"));
1306 if (high > high_bound)
1307 error (_("High index greater than length"));
1308
1309 usize = language_lookup_primitive_type (exp->language_defn,
1310 exp->gdbarch,
1311 "usize");
45320ffa
TT
1312 const char *new_name = ((type != nullptr
1313 && rust_slice_type_p (type))
7d93a1e0 1314 ? type->name () : "&[*gdb*]");
45320ffa
TT
1315
1316 slice = rust_slice_type (new_name, value_type (result), usize);
c44af4eb
TT
1317
1318 addrval = value_allocate_space_in_inferior (TYPE_LENGTH (slice));
1319 addr = value_as_long (addrval);
1320 tem = value_at_lazy (slice, addr);
1321
1322 value_assign (value_field (tem, 0), value_addr (result));
1323 value_assign (value_field (tem, 1),
1324 value_from_longest (usize, high - low));
1325
1326 result = value_at_lazy (slice, addr);
1327 }
1328 else
1329 result = value_addr (result);
1330 }
1331
1332 return result;
1333}
1334
1335/* evaluate_exp implementation for Rust. */
1336
1337static struct value *
1338rust_evaluate_subexp (struct type *expect_type, struct expression *exp,
1339 int *pos, enum noside noside)
1340{
1341 struct value *result;
1342
1343 switch (exp->elts[*pos].opcode)
1344 {
71a3c369
TT
1345 case UNOP_IND:
1346 {
1347 if (noside != EVAL_NORMAL)
1348 result = evaluate_subexp_standard (expect_type, exp, pos, noside);
1349 else
1350 {
1351 ++*pos;
1352 struct value *value = evaluate_subexp (expect_type, exp, pos,
1353 noside);
1354
1355 struct value *trait_ptr = rust_get_trait_object_pointer (value);
1356 if (trait_ptr != NULL)
1357 value = trait_ptr;
1358
1359 result = value_ind (value);
1360 }
1361 }
1362 break;
1363
c44af4eb
TT
1364 case UNOP_COMPLEMENT:
1365 {
1366 struct value *value;
1367
1368 ++*pos;
fe1fe7ea 1369 value = evaluate_subexp (nullptr, exp, pos, noside);
c44af4eb
TT
1370 if (noside == EVAL_SKIP)
1371 {
1372 /* Preserving the type is enough. */
1373 return value;
1374 }
78134374 1375 if (value_type (value)->code () == TYPE_CODE_BOOL)
c44af4eb
TT
1376 result = value_from_longest (value_type (value),
1377 value_logical_not (value));
1378 else
1379 result = value_complement (value);
1380 }
1381 break;
1382
1383 case BINOP_SUBSCRIPT:
1384 result = rust_subscript (exp, pos, noside, 0);
1385 break;
1386
1387 case OP_FUNCALL:
1388 result = rust_evaluate_funcall (exp, pos, noside);
1389 break;
1390
1391 case OP_AGGREGATE:
1392 {
1393 int pc = (*pos)++;
1394 struct type *type = exp->elts[pc + 1].type;
1395 int arglen = longest_to_int (exp->elts[pc + 2].longconst);
1396 int i;
1397 CORE_ADDR addr = 0;
1398 struct value *addrval = NULL;
1399
1400 *pos += 3;
1401
1402 if (noside == EVAL_NORMAL)
1403 {
1404 addrval = value_allocate_space_in_inferior (TYPE_LENGTH (type));
1405 addr = value_as_long (addrval);
1406 result = value_at_lazy (type, addr);
1407 }
1408
1409 if (arglen > 0 && exp->elts[*pos].opcode == OP_OTHERS)
1410 {
1411 struct value *init;
1412
1413 ++*pos;
1414 init = rust_evaluate_subexp (NULL, exp, pos, noside);
1415 if (noside == EVAL_NORMAL)
1416 {
1417 /* This isn't quite right but will do for the time
1418 being, seeing that we can't implement the Copy
1419 trait anyway. */
1420 value_assign (result, init);
1421 }
1422
1423 --arglen;
1424 }
1425
1426 gdb_assert (arglen % 2 == 0);
1427 for (i = 0; i < arglen; i += 2)
1428 {
1429 int len;
1430 const char *fieldname;
1431 struct value *value, *field;
1432
1433 gdb_assert (exp->elts[*pos].opcode == OP_NAME);
1434 ++*pos;
1435 len = longest_to_int (exp->elts[*pos].longconst);
1436 ++*pos;
1437 fieldname = &exp->elts[*pos].string;
1438 *pos += 2 + BYTES_TO_EXP_ELEM (len + 1);
1439
1440 value = rust_evaluate_subexp (NULL, exp, pos, noside);
1441 if (noside == EVAL_NORMAL)
1442 {
1443 field = value_struct_elt (&result, NULL, fieldname, NULL,
1444 "structure");
1445 value_assign (field, value);
1446 }
1447 }
1448
1449 if (noside == EVAL_SKIP)
1450 return value_from_longest (builtin_type (exp->gdbarch)->builtin_int,
1451 1);
1452 else if (noside == EVAL_AVOID_SIDE_EFFECTS)
1453 result = allocate_value (type);
1454 else
1455 result = value_at_lazy (type, addr);
1456 }
1457 break;
1458
1459 case OP_RUST_ARRAY:
1460 {
8d49165d 1461 (*pos)++;
c44af4eb
TT
1462 int copies;
1463 struct value *elt;
1464 struct value *ncopies;
1465
1466 elt = rust_evaluate_subexp (NULL, exp, pos, noside);
1467 ncopies = rust_evaluate_subexp (NULL, exp, pos, noside);
1468 copies = value_as_long (ncopies);
1469 if (copies < 0)
1470 error (_("Array with negative number of elements"));
1471
1472 if (noside == EVAL_NORMAL)
1473 {
c44af4eb 1474 int i;
ab8b80a8 1475 std::vector<struct value *> eltvec (copies);
c44af4eb
TT
1476
1477 for (i = 0; i < copies; ++i)
1478 eltvec[i] = elt;
ab8b80a8 1479 result = value_array (0, copies - 1, eltvec.data ());
c44af4eb
TT
1480 }
1481 else
1482 {
1483 struct type *arraytype
1484 = lookup_array_range_type (value_type (elt), 0, copies - 1);
1485 result = allocate_value (arraytype);
1486 }
1487 }
1488 break;
1489
1490 case STRUCTOP_ANONYMOUS:
1491 {
dda83cd7
SM
1492 /* Anonymous field access, i.e. foo.1. */
1493 struct value *lhs;
1494 int pc, field_number, nfields;
1495 struct type *type;
1496
1497 pc = (*pos)++;
1498 field_number = longest_to_int (exp->elts[pc + 1].longconst);
1499 (*pos) += 2;
fe1fe7ea 1500 lhs = evaluate_subexp (nullptr, exp, pos, noside);
c44af4eb 1501
fe1fe7ea 1502 type = value_type (lhs);
c9317f21 1503
78134374 1504 if (type->code () == TYPE_CODE_STRUCT)
c9317f21
TT
1505 {
1506 struct type *outer_type = NULL;
1507
1508 if (rust_enum_p (type))
c44af4eb 1509 {
9c6a1327
TT
1510 gdb::array_view<const gdb_byte> view (value_contents (lhs),
1511 TYPE_LENGTH (type));
1512 type = resolve_dynamic_type (type, view, value_address (lhs));
1513
098b2108
TT
1514 if (rust_empty_enum_p (type))
1515 error (_("Cannot access field %d of empty enum %s"),
7d93a1e0 1516 field_number, type->name ());
098b2108 1517
9c6a1327
TT
1518 int fieldno = rust_enum_variant (type);
1519 lhs = value_primitive_field (lhs, 0, fieldno, type);
c9317f21
TT
1520 outer_type = type;
1521 type = value_type (lhs);
c44af4eb
TT
1522 }
1523
c44af4eb 1524 /* Tuples and tuple structs */
1f704f76 1525 nfields = type->num_fields ();
c44af4eb
TT
1526
1527 if (field_number >= nfields || field_number < 0)
c9317f21
TT
1528 {
1529 if (outer_type != NULL)
1530 error(_("Cannot access field %d of variant %s::%s, "
1531 "there are only %d fields"),
7d93a1e0
SM
1532 field_number, outer_type->name (),
1533 rust_last_path_segment (type->name ()),
c9317f21
TT
1534 nfields);
1535 else
1536 error(_("Cannot access field %d of %s, "
1537 "there are only %d fields"),
7d93a1e0 1538 field_number, type->name (), nfields);
c9317f21 1539 }
c44af4eb
TT
1540
1541 /* Tuples are tuple structs too. */
1542 if (!rust_tuple_struct_type_p (type))
c9317f21
TT
1543 {
1544 if (outer_type != NULL)
1545 error(_("Variant %s::%s is not a tuple variant"),
7d93a1e0
SM
1546 outer_type->name (),
1547 rust_last_path_segment (type->name ()));
c9317f21
TT
1548 else
1549 error(_("Attempting to access anonymous field %d "
1550 "of %s, which is not a tuple, tuple struct, or "
1551 "tuple-like variant"),
7d93a1e0 1552 field_number, type->name ());
c9317f21 1553 }
c44af4eb
TT
1554
1555 result = value_primitive_field (lhs, 0, field_number, type);
1556 }
1557 else
1558 error(_("Anonymous field access is only allowed on tuples, \
1559tuple structs, and tuple-like enum variants"));
1560 }
1561 break;
1562
1563 case STRUCTOP_STRUCT:
1564 {
dda83cd7
SM
1565 struct value *lhs;
1566 struct type *type;
1567 int tem, pc;
c44af4eb 1568
dda83cd7
SM
1569 pc = (*pos)++;
1570 tem = longest_to_int (exp->elts[pc + 1].longconst);
1571 (*pos) += 3 + BYTES_TO_EXP_ELEM (tem + 1);
fe1fe7ea 1572 lhs = evaluate_subexp (nullptr, exp, pos, noside);
c44af4eb 1573
6830f270 1574 const char *field_name = &exp->elts[pc + 2].string;
dda83cd7
SM
1575 type = value_type (lhs);
1576 if (type->code () == TYPE_CODE_STRUCT && rust_enum_p (type))
c44af4eb 1577 {
9c6a1327
TT
1578 gdb::array_view<const gdb_byte> view (value_contents (lhs),
1579 TYPE_LENGTH (type));
1580 type = resolve_dynamic_type (type, view, value_address (lhs));
1581
098b2108
TT
1582 if (rust_empty_enum_p (type))
1583 error (_("Cannot access field %s of empty enum %s"),
7d93a1e0 1584 field_name, type->name ());
098b2108 1585
9c6a1327
TT
1586 int fieldno = rust_enum_variant (type);
1587 lhs = value_primitive_field (lhs, 0, fieldno, type);
c9317f21
TT
1588
1589 struct type *outer_type = type;
1590 type = value_type (lhs);
1591 if (rust_tuple_type_p (type) || rust_tuple_struct_type_p (type))
4a3fe98f 1592 error (_("Attempting to access named field %s of tuple "
c9317f21 1593 "variant %s::%s, which has only anonymous fields"),
7d93a1e0
SM
1594 field_name, outer_type->name (),
1595 rust_last_path_segment (type->name ()));
c9317f21 1596
a70b8144 1597 try
c44af4eb 1598 {
c9317f21
TT
1599 result = value_struct_elt (&lhs, NULL, field_name,
1600 NULL, "structure");
c44af4eb 1601 }
230d2906 1602 catch (const gdb_exception_error &except)
c9317f21
TT
1603 {
1604 error (_("Could not find field %s of struct variant %s::%s"),
7d93a1e0
SM
1605 field_name, outer_type->name (),
1606 rust_last_path_segment (type->name ()));
c9317f21 1607 }
c44af4eb
TT
1608 }
1609 else
c9317f21
TT
1610 result = value_struct_elt (&lhs, NULL, field_name, NULL, "structure");
1611 if (noside == EVAL_AVOID_SIDE_EFFECTS)
1612 result = value_zero (value_type (result), VALUE_LVAL (result));
c44af4eb
TT
1613 }
1614 break;
1615
01739a3b 1616 case OP_RANGE:
c44af4eb
TT
1617 result = rust_range (exp, pos, noside);
1618 break;
1619
1620 case UNOP_ADDR:
1621 /* We might have &array[range], in which case we need to make a
1622 slice. */
1623 if (exp->elts[*pos + 1].opcode == BINOP_SUBSCRIPT)
1624 {
1625 ++*pos;
1626 result = rust_subscript (exp, pos, noside, 1);
1627 break;
1628 }
1629 /* Fall through. */
1630 default:
1631 result = evaluate_subexp_standard (expect_type, exp, pos, noside);
1632 break;
1633 }
1634
1635 return result;
1636}
1637
1638/* operator_length implementation for Rust. */
1639
1640static void
1641rust_operator_length (const struct expression *exp, int pc, int *oplenp,
1642 int *argsp)
1643{
1644 int oplen = 1;
1645 int args = 0;
1646
1647 switch (exp->elts[pc - 1].opcode)
1648 {
1649 case OP_AGGREGATE:
1650 /* We handle aggregate as a type and argument count. The first
1651 argument might be OP_OTHERS. After that the arguments
1652 alternate: first an OP_NAME, then an expression. */
1653 oplen = 4;
1654 args = longest_to_int (exp->elts[pc - 2].longconst);
1655 break;
1656
1657 case OP_OTHERS:
1658 oplen = 1;
1659 args = 1;
1660 break;
1661
1662 case STRUCTOP_ANONYMOUS:
1663 oplen = 3;
1664 args = 1;
1665 break;
1666
1667 case OP_RUST_ARRAY:
1668 oplen = 1;
1669 args = 2;
1670 break;
1671
1672 default:
1673 operator_length_standard (exp, pc, oplenp, argsp);
1674 return;
1675 }
1676
1677 *oplenp = oplen;
1678 *argsp = args;
1679}
1680
c44af4eb
TT
1681/* dump_subexp_body implementation for Rust. */
1682
1683static int
1684rust_dump_subexp_body (struct expression *exp, struct ui_file *stream,
1685 int elt)
1686{
1687 switch (exp->elts[elt].opcode)
1688 {
1689 case OP_AGGREGATE:
1690 {
1691 int length = longest_to_int (exp->elts[elt + 2].longconst);
1692 int i;
1693
1694 fprintf_filtered (stream, "Type @");
1695 gdb_print_host_address (exp->elts[elt + 1].type, stream);
1696 fprintf_filtered (stream, " (");
1697 type_print (exp->elts[elt + 1].type, NULL, stream, 0);
1698 fprintf_filtered (stream, "), length %d", length);
1699
1700 elt += 4;
1701 for (i = 0; i < length; ++i)
1702 elt = dump_subexp (exp, stream, elt);
1703 }
1704 break;
1705
1706 case OP_STRING:
1707 case OP_NAME:
1708 {
1709 LONGEST len = exp->elts[elt + 1].longconst;
1710
1711 fprintf_filtered (stream, "%s: %s",
1712 (exp->elts[elt].opcode == OP_STRING
1713 ? "string" : "name"),
1714 &exp->elts[elt + 2].string);
1715 elt += 4 + BYTES_TO_EXP_ELEM (len + 1);
1716 }
1717 break;
1718
1719 case OP_OTHERS:
1720 elt = dump_subexp (exp, stream, elt + 1);
1721 break;
1722
1723 case STRUCTOP_ANONYMOUS:
1724 {
1725 int field_number;
1726
68f2f2e3 1727 field_number = longest_to_int (exp->elts[elt + 1].longconst);
c44af4eb
TT
1728
1729 fprintf_filtered (stream, "Field number: %d", field_number);
68f2f2e3 1730 elt = dump_subexp (exp, stream, elt + 3);
c44af4eb
TT
1731 }
1732 break;
1733
1734 case OP_RUST_ARRAY:
68f2f2e3 1735 ++elt;
c44af4eb
TT
1736 break;
1737
1738 default:
1739 elt = dump_subexp_body_standard (exp, stream, elt);
1740 break;
1741 }
1742
1743 return elt;
1744}
1745
1746/* print_subexp implementation for Rust. */
1747
1748static void
1749rust_print_subexp (struct expression *exp, int *pos, struct ui_file *stream,
1750 enum precedence prec)
1751{
1752 switch (exp->elts[*pos].opcode)
1753 {
1754 case OP_AGGREGATE:
1755 {
1756 int length = longest_to_int (exp->elts[*pos + 2].longconst);
1757 int i;
1758
1759 type_print (exp->elts[*pos + 1].type, "", stream, 0);
1760 fputs_filtered (" { ", stream);
1761
1762 *pos += 4;
1763 for (i = 0; i < length; ++i)
1764 {
1765 rust_print_subexp (exp, pos, stream, prec);
1766 fputs_filtered (", ", stream);
1767 }
1768 fputs_filtered (" }", stream);
1769 }
1770 break;
1771
1772 case OP_NAME:
1773 {
1774 LONGEST len = exp->elts[*pos + 1].longconst;
1775
1776 fputs_filtered (&exp->elts[*pos + 2].string, stream);
1777 *pos += 4 + BYTES_TO_EXP_ELEM (len + 1);
1778 }
1779 break;
1780
1781 case OP_OTHERS:
1782 {
1783 fputs_filtered ("<<others>> (", stream);
1784 ++*pos;
1785 rust_print_subexp (exp, pos, stream, prec);
1786 fputs_filtered (")", stream);
1787 }
1788 break;
1789
1790 case STRUCTOP_ANONYMOUS:
1791 {
1792 int tem = longest_to_int (exp->elts[*pos + 1].longconst);
1793
1794 (*pos) += 3;
1795 print_subexp (exp, pos, stream, PREC_SUFFIX);
1796 fprintf_filtered (stream, ".%d", tem);
1797 }
256afbc2 1798 break;
c44af4eb
TT
1799
1800 case OP_RUST_ARRAY:
1801 ++*pos;
1802 fprintf_filtered (stream, "[");
1803 rust_print_subexp (exp, pos, stream, prec);
1804 fprintf_filtered (stream, "; ");
1805 rust_print_subexp (exp, pos, stream, prec);
1806 fprintf_filtered (stream, "]");
1807 break;
1808
1809 default:
1810 print_subexp_standard (exp, pos, stream, prec);
1811 break;
1812 }
1813}
1814
1815/* operator_check implementation for Rust. */
1816
1817static int
1818rust_operator_check (struct expression *exp, int pos,
1819 int (*objfile_func) (struct objfile *objfile,
1820 void *data),
1821 void *data)
1822{
1823 switch (exp->elts[pos].opcode)
1824 {
1825 case OP_AGGREGATE:
1826 {
1827 struct type *type = exp->elts[pos + 1].type;
1828 struct objfile *objfile = TYPE_OBJFILE (type);
1829
1830 if (objfile != NULL && (*objfile_func) (objfile, data))
1831 return 1;
1832 }
1833 break;
1834
1835 case OP_OTHERS:
1836 case OP_NAME:
1837 case OP_RUST_ARRAY:
1838 break;
1839
1840 default:
1841 return operator_check_standard (exp, pos, objfile_func, data);
1842 }
1843
1844 return 0;
1845}
1846
1847\f
1848
1c485265 1849const struct exp_descriptor rust_language::exp_descriptor_tab =
c44af4eb
TT
1850{
1851 rust_print_subexp,
1852 rust_operator_length,
1853 rust_operator_check,
c44af4eb
TT
1854 rust_dump_subexp_body,
1855 rust_evaluate_subexp
1856};
1857
1c485265 1858/* See language.h. */
0874fd07 1859
1c485265
AB
1860void
1861rust_language::language_arch_info (struct gdbarch *gdbarch,
1862 struct language_arch_info *lai) const
0874fd07 1863{
1c485265 1864 const struct builtin_type *builtin = builtin_type (gdbarch);
87afa652 1865
1c485265
AB
1866 /* Helper function to allow shorter lines below. */
1867 auto add = [&] (struct type * t) -> struct type *
87afa652 1868 {
1c485265
AB
1869 lai->add_primitive_type (t);
1870 return t;
1871 };
1872
1873 struct type *bool_type
1874 = add (arch_boolean_type (gdbarch, 8, 1, "bool"));
1875 add (arch_character_type (gdbarch, 32, 1, "char"));
1876 add (arch_integer_type (gdbarch, 8, 0, "i8"));
1877 struct type *u8_type
1878 = add (arch_integer_type (gdbarch, 8, 1, "u8"));
1879 add (arch_integer_type (gdbarch, 16, 0, "i16"));
1880 add (arch_integer_type (gdbarch, 16, 1, "u16"));
1881 add (arch_integer_type (gdbarch, 32, 0, "i32"));
1882 add (arch_integer_type (gdbarch, 32, 1, "u32"));
1883 add (arch_integer_type (gdbarch, 64, 0, "i64"));
1884 add (arch_integer_type (gdbarch, 64, 1, "u64"));
1885
1886 unsigned int length = 8 * TYPE_LENGTH (builtin->builtin_data_ptr);
1887 add (arch_integer_type (gdbarch, length, 0, "isize"));
1888 struct type *usize_type
1889 = add (arch_integer_type (gdbarch, length, 1, "usize"));
1890
1891 add (arch_float_type (gdbarch, 32, "f32", floatformats_ieee_single));
1892 add (arch_float_type (gdbarch, 64, "f64", floatformats_ieee_double));
1893 add (arch_integer_type (gdbarch, 0, 1, "()"));
1894
1895 struct type *tem = make_cv_type (1, 0, u8_type, NULL);
1896 add (rust_slice_type ("&str", tem, usize_type));
1897
1898 lai->set_bool_type (bool_type);
1899 lai->set_string_char_type (u8_type);
1900}
39e7ecca 1901
1c485265 1902/* See language.h. */
efdf6a73 1903
1c485265
AB
1904void
1905rust_language::print_type (struct type *type, const char *varstring,
1906 struct ui_file *stream, int show, int level,
1907 const struct type_print_options *flags) const
1908{
1909 print_offset_data podata;
1910 rust_internal_print_type (type, varstring, stream, show, level,
1911 flags, false, &podata);
1912}
efdf6a73 1913
1c485265 1914/* See language.h. */
5aba6ebe 1915
1c485265
AB
1916void
1917rust_language::emitchar (int ch, struct type *chtype,
1918 struct ui_file *stream, int quoter) const
1919{
1920 if (!rust_chartype_p (chtype))
1921 generic_emit_char (ch, chtype, stream, quoter,
1922 target_charset (get_type_arch (chtype)));
1923 else if (ch == '\\' || ch == quoter)
1924 fprintf_filtered (stream, "\\%c", ch);
1925 else if (ch == '\n')
1926 fputs_filtered ("\\n", stream);
1927 else if (ch == '\r')
1928 fputs_filtered ("\\r", stream);
1929 else if (ch == '\t')
1930 fputs_filtered ("\\t", stream);
1931 else if (ch == '\0')
1932 fputs_filtered ("\\0", stream);
1933 else if (ch >= 32 && ch <= 127 && isprint (ch))
1934 fputc_filtered (ch, stream);
1935 else if (ch <= 255)
1936 fprintf_filtered (stream, "\\x%02x", ch);
1937 else
1938 fprintf_filtered (stream, "\\u{%06x}", ch);
1939}
5aba6ebe 1940
1c485265 1941/* See language.h. */
b7c6e27d 1942
1c485265
AB
1943bool
1944rust_language::is_string_type_p (struct type *type) const
1945{
1946 LONGEST low_bound, high_bound;
b7c6e27d 1947
1c485265
AB
1948 type = check_typedef (type);
1949 return ((type->code () == TYPE_CODE_STRING)
1950 || (type->code () == TYPE_CODE_PTR
1951 && (TYPE_TARGET_TYPE (type)->code () == TYPE_CODE_ARRAY
1952 && rust_u8_type_p (TYPE_TARGET_TYPE (TYPE_TARGET_TYPE (type)))
1953 && get_array_bounds (TYPE_TARGET_TYPE (type), &low_bound,
1954 &high_bound)))
1955 || (type->code () == TYPE_CODE_STRUCT
1956 && !rust_enum_p (type)
1957 && rust_slice_type_p (type)
1958 && strcmp (type->name (), "&str") == 0));
1959}
0874fd07
AB
1960
1961/* Single instance of the Rust language class. */
1962
1963static rust_language rust_language_defn;
This page took 0.644584 seconds and 4 git commands to generate.