Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+416 −95 2 files
gcc/c-family/c-ada-spec.cc
+309−95modified
| @@ -712 +712 @@enum ada_name_role | |||
| 712 | 712 | ADA_NAME_TEMPLATE_INSTANCE, | |
| 713 | 713 | ADA_NAME_AS_BASE, | |
| 714 | 714 | ADA_NAME_SYNTHETIC_FIELD, | |
| 715 | Removed line. ADA_NAME_FORMAL | ||
| 715 | Added line. ADA_NAME_FORMAL, | ||
| 716 | Added line. ADA_NAME_CLASS_PACKAGE, | ||
| 717 | Added line. ADA_NAME_CONSTRUCTOR, | ||
| 718 | Added line. ADA_NAME_DESTRUCTOR, | ||
| 719 | Added line. ADA_NAME_ASSIGNMENT | ||
| 716 | 720 | }; | |
| 717 | 721 | | |
| 718 | 722 | static const char *allocate_ada_name (const char *, tree, ada_name_role, | |
| 719 | 723 | tree, const char *, const char *); | |
| 720 | 724 | | |
| 721 | 725 | static void pp_ada_namespace_name (pretty_printer *, tree); | |
| 726 | Added line. static void reserve_ada_source_names (const char *); | ||
| 727 | Added line. static bool method_name_matches_visible_type (tree, tree); | ||
| 728 | Added line. static bool method_name_matches_destructor (tree); | ||
| 722 | 729 | | |
| 723 | 730 | /* Return the innermost named C++ namespace containing NODE. Anonymous | |
| 724 | 731 | namespaces do not add an Ada package level. */ | |
| @@ -925 +932 @@dump_ada_nodes (pretty_printer *pp, const char *source_file) | |||
| 925 | 932 | /* Sort the table of declarations to dump by sloc. */ | |
| 926 | 933 | qsort (to_dump, to_dump_count, sizeof (tree), compare_node); | |
| 927 | 934 | | |
| 935 | Added line. if (cpp_check) | ||
| 936 | Added line. reserve_ada_source_names (source_file); | ||
| 937 | Added line. | ||
| 928 | 938 | /* Fetch the table of comments. */ | |
| 929 | 939 | comments = cpp_get_comments (parse_in); | |
| 930 | 940 | | |
| @@ -1691 +1701 @@allocate_ada_name (const char *preferred, tree identity, ada_name_role role, | |||
| 1691 | 1701 | return allocated->name; | |
| 1692 | 1702 | } | |
| 1693 | 1703 | | |
| 1704 | Added line. /* Reserve DECL's spelling before any synthetic names are allocated. This | ||
| 1705 | Added line. gives user-written C++ identifiers priority independent of dump order. */ | ||
| 1706 | Added line. | ||
| 1707 | Added line. static void | ||
| 1708 | Added line. reserve_ada_source_decl (tree decl, const char *file) | ||
| 1709 | Added line. { | ||
| 1710 | Added line. if (!decl || !DECL_P (decl)) | ||
| 1711 | Added line. return; | ||
| 1712 | Added line. | ||
| 1713 | Added line. for (tree context = DECL_CONTEXT (decl); context; ) | ||
| 1714 | Added line. { | ||
| 1715 | Added line. if (TREE_CODE (context) == NAMESPACE_DECL | ||
| 1716 | Added line. && DECL_NAME (context) | ||
| 1717 | Added line. && strcmp (IDENTIFIER_POINTER (DECL_NAME (context)), "::")) | ||
| 1718 | Added line. { | ||
| 1719 | Added line. bool space_found = false; | ||
| 1720 | Added line. char *name = to_ada_name (IDENTIFIER_POINTER (DECL_NAME (context)), | ||
| 1721 | Added line. &space_found); | ||
| 1722 | Added line. allocate_ada_name (name, DECL_NAME (context), ADA_NAME_SOURCE, | ||
| 1723 | Added line. DECL_CONTEXT (context), file, "_Case_"); | ||
| 1724 | Added line. free (name); | ||
| 1725 | Added line. } | ||
| 1726 | Added line. | ||
| 1727 | Added line. context = DECL_P (context) ? DECL_CONTEXT (context) | ||
| 1728 | Added line. : TYPE_P (context) ? TYPE_CONTEXT (context) : NULL_TREE; | ||
| 1729 | Added line. } | ||
| 1730 | Added line. | ||
| 1731 | Added line. if (DECL_NAME (decl)) | ||
| 1732 | Added line. { | ||
| 1733 | Added line. bool space_found = false; | ||
| 1734 | Added line. char *name = to_ada_name (IDENTIFIER_POINTER (DECL_NAME (decl)), | ||
| 1735 | Added line. &space_found); | ||
| 1736 | Added line. allocate_ada_name (name, DECL_NAME (decl), ADA_NAME_SOURCE, | ||
| 1737 | Added line. DECL_CONTEXT (decl), file, "_Case_"); | ||
| 1738 | Added line. free (name); | ||
| 1739 | Added line. } | ||
| 1740 | Added line. | ||
| 1741 | Added line. if (TREE_CODE (decl) == FUNCTION_DECL) | ||
| 1742 | Added line. for (tree arg = DECL_ARGUMENTS (decl); arg; arg = DECL_CHAIN (arg)) | ||
| 1743 | Added line. reserve_ada_source_decl (arg, file); | ||
| 1744 | Added line. } | ||
| 1745 | Added line. | ||
| 1746 | Added line. /* Reserve all source spellings in this generated Ada unit. */ | ||
| 1747 | Added line. | ||
| 1748 | Added line. static void | ||
| 1749 | Added line. reserve_ada_source_names (const char *file) | ||
| 1750 | Added line. { | ||
| 1751 | Added line. for (int i = 0; i < to_dump_count; ++i) | ||
| 1752 | Added line. { | ||
| 1753 | Added line. tree decl = to_dump[i]; | ||
| 1754 | Added line. reserve_ada_source_decl (decl, file); | ||
| 1755 | Added line. if (TREE_CODE (decl) == TYPE_DECL | ||
| 1756 | Added line. && RECORD_OR_UNION_TYPE_P (TREE_TYPE (decl))) | ||
| 1757 | Added line. for (tree field = TYPE_FIELDS (TREE_TYPE (decl)); field; | ||
| 1758 | Added line. field = TREE_CHAIN (field)) | ||
| 1759 | Added line. reserve_ada_source_decl (field, file); | ||
| 1760 | Added line. } | ||
| 1761 | Added line. } | ||
| 1762 | Added line. | ||
| 1763 | Added line. /* Return the allocated name of the package that encloses a non-trivial C++ | ||
| 1764 | Added line. class declaration. */ | ||
| 1765 | Added line. | ||
| 1766 | Added line. static const char * | ||
| 1767 | Added line. allocated_class_package_name (tree decl) | ||
| 1768 | Added line. { | ||
| 1769 | Added line. bool space_found = false; | ||
| 1770 | Added line. char *source = to_ada_name (IDENTIFIER_POINTER (DECL_NAME (decl)), | ||
| 1771 | Added line. &space_found); | ||
| 1772 | Added line. const char *base | ||
| 1773 | Added line. = allocate_ada_name (source, DECL_NAME (decl), ADA_NAME_SOURCE, | ||
| 1774 | Added line. DECL_CONTEXT (decl), | ||
| 1775 | Added line. LOCATION_FILE (decl_sloc (decl, false)), "_Case_"); | ||
| 1776 | Added line. char *candidate = concat ("Class_", base, NULL); | ||
| 1777 | Added line. const char *allocated | ||
| 1778 | Added line. = allocate_ada_name (candidate, TREE_TYPE (decl), ADA_NAME_CLASS_PACKAGE, | ||
| 1779 | Added line. DECL_CONTEXT (decl), | ||
| 1780 | Added line. LOCATION_FILE (decl_sloc (decl, false)), "_"); | ||
| 1781 | Added line. free (candidate); | ||
| 1782 | Added line. free (source); | ||
| 1783 | Added line. return allocated; | ||
| 1784 | Added line. } | ||
| 1785 | Added line. | ||
| 1694 | 1786 | /* Dump in BUFFER the name of an identifier NODE of type TYPE, following Ada | |
| 1695 | 1787 | syntax. LIMITED_ACCESS indicates whether NODE can be accessed through a | |
| 1696 | 1788 | limited 'with' clause rather than a regular 'with' clause. */ | |
| @@ -1755 +1847 @@pp_ada_tree_identifier (pretty_printer *buffer, tree node, tree type, | |||
| 1755 | 1847 | && (external_decl | |
| 1756 | 1848 | || named_namespace_context (decl) != current_namespace)) | |
| 1757 | 1849 | { | |
| 1758 | Removed line. pp_string (buffer, "Class_"); | ||
| 1759 | Removed line. pp_string (buffer, allocated); | ||
| 1850 | Added line. pp_string (buffer, allocated_class_package_name (decl)); | ||
| 1760 | 1851 | pp_dot (buffer); | |
| 1761 | 1852 | } | |
| 1762 | 1853 | } | |
| @@ -2006 +2097 @@parameter_name_conflicts_with_profile (tree parameter, tree func, | |||
| 2006 | 2097 | return identifier_matches_type (name, return_type); | |
| 2007 | 2098 | } | |
| 2008 | 2099 | | |
| 2100 | Added line. /* Return PARAMETER's complete Ada formal name. A conflict with a profile | ||
| 2101 | Added line. type is resolved before allocation, so a user-written the_Name remains a | ||
| 2102 | Added line. distinct declaration rather than colliding with the generated spelling. */ | ||
| 2103 | Added line. | ||
| 2104 | Added line. static const char * | ||
| 2105 | Added line. allocated_formal_name (tree parameter, tree func, bool is_constructor) | ||
| 2106 | Added line. { | ||
| 2107 | Added line. bool space_found = false; | ||
| 2108 | Added line. char *base = to_ada_name (IDENTIFIER_POINTER (DECL_NAME (parameter)), | ||
| 2109 | Added line. &space_found); | ||
| 2110 | Added line. const bool renamed | ||
| 2111 | Added line. = parameter_name_conflicts_with_profile (parameter, func, is_constructor); | ||
| 2112 | Added line. char *candidate = renamed ? concat ("the_", base, NULL) : xstrdup (base); | ||
| 2113 | Added line. const char *allocated | ||
| 2114 | Added line. = allocate_ada_name (candidate, renamed ? parameter : DECL_NAME (parameter), | ||
| 2115 | Added line. renamed ? ADA_NAME_FORMAL : ADA_NAME_SOURCE, | ||
| 2116 | Added line. DECL_CONTEXT (parameter), | ||
| 2117 | Added line. LOCATION_FILE (decl_sloc (func, false)), "_"); | ||
| 2118 | Added line. free (candidate); | ||
| 2119 | Added line. free (base); | ||
| 2120 | Added line. return allocated; | ||
| 2121 | Added line. } | ||
| 2122 | Added line. | ||
| 2009 | 2123 | /* Dump in BUFFER a function declaration FUNC in Ada syntax. | |
| 2010 | 2124 | IS_METHOD indicates whether FUNC is a C++ method. | |
| 2011 | 2125 | IS_CONSTRUCTOR whether FUNC is a C++ constructor. | |
| @@ -2083 +2197 @@dump_ada_function_declaration (pretty_printer *buffer, tree func, | |||
| 2083 | 2197 | { | |
| 2084 | 2198 | if (DECL_NAME (arg)) | |
| 2085 | 2199 | { | |
| 2086 | Removed line. if (parameter_name_conflicts_with_profile (arg, func, | ||
| 2087 | Removed line. is_constructor)) | ||
| 2088 | Removed line. pp_string (buffer, "the_"); | ||
| 2089 | Removed line. pp_ada_tree_identifier (buffer, DECL_NAME (arg), NULL_TREE, | ||
| 2090 | Removed line. false); | ||
| 2200 | Added line. pp_string (buffer, allocated_formal_name (arg, func, | ||
| 2201 | Added line. is_constructor)); | ||
| 2091 | 2202 | pp_string (buffer, " : "); | |
| 2092 | 2203 | } | |
| 2093 | 2204 | else | |
| @@ -2290 +2401 @@dump_template_types (pretty_printer *buffer, tree types, int spc) | |||
| 2290 | 2401 | } | |
| 2291 | 2402 | } | |
| 2292 | 2403 | | |
| 2404 | Added line. /* Dump the allocated package name for a concrete template INSTANCE. */ | ||
| 2405 | Added line. | ||
| 2406 | Added line. static void | ||
| 2407 | Added line. dump_template_instance_name (pretty_printer *pp, tree tmpl, tree instance, | ||
| 2408 | Added line. tree types, int spc) | ||
| 2409 | Added line. { | ||
| 2410 | Added line. pretty_printer name_pp; | ||
| 2411 | Added line. const bool saved_package_prefix = package_prefix; | ||
| 2412 | Added line. package_prefix = false; | ||
| 2413 | Added line. dump_ada_node (&name_pp, instance, tmpl, spc, false, true); | ||
| 2414 | Added line. dump_template_types (&name_pp, types, spc); | ||
| 2415 | Added line. package_prefix = saved_package_prefix; | ||
| 2416 | Added line. const char *candidate = pp_formatted_text (&name_pp); | ||
| 2417 | Added line. const char *allocated | ||
| 2418 | Added line. = allocate_ada_name (candidate, instance, ADA_NAME_TEMPLATE_INSTANCE, | ||
| 2419 | Added line. DECL_CONTEXT (tmpl), | ||
| 2420 | Added line. LOCATION_FILE (decl_sloc (tmpl, false)), "_"); | ||
| 2421 | Added line. pp_string (pp, allocated); | ||
| 2422 | Added line. } | ||
| 2423 | Added line. | ||
| 2293 | 2424 | /* If NODE is a concrete template instance emitted in a nested package, | |
| 2294 | 2425 | dump the type name owned by that package. */ | |
| 2295 | 2426 | | |
| @@ -2330 +2461 @@dump_template_type_name (pretty_printer *buffer, tree node, int spc) | |||
| 2330 | 2461 | continue; | |
| 2331 | 2462 | | |
| 2332 | 2463 | package_prefix = false; | |
| 2333 | Removed line. dump_ada_node (buffer, TYPE_NAME (instance), tmpl, spc, false, true); | ||
| 2334 | Removed line. dump_template_types (buffer, types, spc); | ||
| 2464 | Added line. dump_template_instance_name (buffer, tmpl, instance, types, spc); | ||
| 2335 | 2465 | pp_dot (buffer); | |
| 2336 | 2466 | dump_ada_node (buffer, TYPE_NAME (instance), tmpl, spc, false, true); | |
| 2337 | 2467 | package_prefix = true; | |
| @@ -2387 +2517 @@dump_ada_template (pretty_printer *buffer, tree t, int spc) | |||
| 2387 | 2517 | INDENT (spc); | |
| 2388 | 2518 | pp_string (buffer, "package "); | |
| 2389 | 2519 | package_prefix = false; | |
| 2390 | Removed line. dump_ada_node (buffer, instance, t, spc, false, true); | ||
| 2391 | Removed line. dump_template_types (buffer, types, spc); | ||
| 2520 | Added line. dump_template_instance_name (buffer, t, instance, types, spc); | ||
| 2392 | 2521 | pp_string (buffer, " is"); | |
| 2393 | 2522 | spc += INDENT_INCR; | |
| 2394 | 2523 | newline_and_indent (buffer, spc); | |
| @@ -2420 +2549 @@dump_ada_template (pretty_printer *buffer, tree t, int spc) | |||
| 2420 | 2549 | newline_and_indent (buffer, spc); | |
| 2421 | 2550 | pp_string (buffer, "use "); | |
| 2422 | 2551 | package_prefix = false; | |
| 2423 | Removed line. dump_ada_node (buffer, instance, t, spc, false, true); | ||
| 2424 | Removed line. dump_template_types (buffer, types, spc); | ||
| 2552 | Added line. dump_template_instance_name (buffer, t, instance, types, spc); | ||
| 2425 | 2553 | package_prefix = true; | |
| 2426 | 2554 | current_template = previous_template; | |
| 2427 | 2555 | current_template_instance = previous_template_instance; | |
| @@ -3284 +3412 @@is_shortened_base_field (tree field) | |||
| 3284 | 3412 | < (unsigned HOST_WIDE_INT) object_size * BITS_PER_UNIT; | |
| 3285 | 3413 | } | |
| 3286 | 3414 | | |
| 3415 | Added line. /* Return the allocated name of NODE's shortened base-subobject type. */ | ||
| 3416 | Added line. | ||
| 3417 | Added line. static const char * | ||
| 3418 | Added line. allocated_as_base_name (tree node) | ||
| 3419 | Added line. { | ||
| 3420 | Added line. tree decl = get_underlying_decl (node); | ||
| 3421 | Added line. gcc_assert (decl && DECL_NAME (decl)); | ||
| 3422 | Added line. bool space_found = false; | ||
| 3423 | Added line. char *source = to_ada_name (IDENTIFIER_POINTER (DECL_NAME (decl)), | ||
| 3424 | Added line. &space_found); | ||
| 3425 | Added line. const char *base | ||
| 3426 | Added line. = allocate_ada_name (source, DECL_NAME (decl), ADA_NAME_SOURCE, | ||
| 3427 | Added line. DECL_CONTEXT (decl), | ||
| 3428 | Added line. LOCATION_FILE (decl_sloc (decl, false)), "_Case_"); | ||
| 3429 | Added line. char *candidate = concat (base, "_As_Base", NULL); | ||
| 3430 | Added line. const char *allocated | ||
| 3431 | Added line. = allocate_ada_name (candidate, node, ADA_NAME_AS_BASE, | ||
| 3432 | Added line. DECL_CONTEXT (decl), | ||
| 3433 | Added line. LOCATION_FILE (decl_sloc (decl, false)), "_"); | ||
| 3434 | Added line. free (candidate); | ||
| 3435 | Added line. free (source); | ||
| 3436 | Added line. return allocated; | ||
| 3437 | Added line. } | ||
| 3438 | Added line. | ||
| 3439 | Added line. /* Dump NODE's shortened base-subobject type name. */ | ||
| 3440 | Added line. | ||
| 3441 | Added line. static void | ||
| 3442 | Added line. dump_ada_as_base_name (pretty_printer *buffer, tree node) | ||
| 3443 | Added line. { | ||
| 3444 | Added line. pp_ada_namespace_prefix (buffer, get_underlying_decl (node)); | ||
| 3445 | Added line. pp_string (buffer, allocated_as_base_name (node)); | ||
| 3446 | Added line. } | ||
| 3447 | Added line. | ||
| 3448 | Added line. /* Return the allocated name of an unnamed C++ base component. NUMBER is its | ||
| 3449 | Added line. one-based position among represented fields. */ | ||
| 3450 | Added line. | ||
| 3451 | Added line. static const char * | ||
| 3452 | Added line. allocated_synthetic_field_name (tree owner, tree field, int number) | ||
| 3453 | Added line. { | ||
| 3454 | Added line. char candidate[32]; | ||
| 3455 | Added line. if (number == 1) | ||
| 3456 | Added line. strcpy (candidate, "parent"); | ||
| 3457 | Added line. else | ||
| 3458 | Added line. snprintf (candidate, sizeof (candidate), "field_%d", number); | ||
| 3459 | Added line. tree decl = get_underlying_decl (owner); | ||
| 3460 | Added line. gcc_assert (decl); | ||
| 3461 | Added line. const char *allocated | ||
| 3462 | Added line. = allocate_ada_name (candidate, field, ADA_NAME_SYNTHETIC_FIELD, | ||
| 3463 | Added line. owner, LOCATION_FILE (decl_sloc (decl, false)), | ||
| 3464 | Added line. "_Base_"); | ||
| 3465 | Added line. return allocated; | ||
| 3466 | Added line. } | ||
| 3467 | Added line. | ||
| 3287 | 3468 | /* Dump FIELD's named type, selecting the shortened storage type when FIELD | |
| 3288 | 3469 | is a base subobject that excludes its type's virtual bases. */ | |
| 3289 | 3470 | | |
| 3290 | 3471 | static void | |
| 3291 | 3472 | dump_ada_record_field_type (pretty_printer *buffer, tree field) | |
| 3292 | 3473 | { | |
| 3293 | Removed line. dump_ada_decl_name (buffer, TYPE_NAME (TREE_TYPE (field)), false); | ||
| 3294 | 3474 | if (is_shortened_base_field (field)) | |
| 3295 | Removed line. pp_string (buffer, "_As_Base"); | ||
| 3475 | Added line. dump_ada_as_base_name (buffer, TREE_TYPE (field)); | ||
| 3476 | Added line. else | ||
| 3477 | Added line. dump_ada_decl_name (buffer, TYPE_NAME (TREE_TYPE (field)), false); | ||
| 3296 | 3478 | } | |
| 3297 | 3479 | | |
| 3298 | 3480 | /* Return true if FIELD lies wholly inside NODE's C++ as-base size. */ | |
| @@ -3343 +3525 @@dump_ada_as_base_storage_type (pretty_printer *buffer, tree node, tree type, | |||
| 3343 | 3525 | pp_newline (buffer); | |
| 3344 | 3526 | newline_and_indent (buffer, spc); | |
| 3345 | 3527 | pp_string (buffer, "type "); | |
| 3346 | Removed line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); | ||
| 3347 | Removed line. pp_string (buffer, "_As_Base is record"); | ||
| 3528 | Added line. pp_string (buffer, allocated_as_base_name (node)); | ||
| 3529 | Added line. pp_string (buffer, " is record"); | ||
| 3348 | 3530 | pp_newline (buffer); | |
| 3349 | 3531 | | |
| 3350 | 3532 | for (tree field = TYPE_FIELDS (node); field; field = TREE_CHAIN (field)) | |
| @@ -3356 +3538 @@dump_ada_as_base_storage_type (pretty_printer *buffer, tree node, tree type, | |||
| 3356 | 3538 | continue; | |
| 3357 | 3539 | | |
| 3358 | 3540 | INDENT (spc + INDENT_INCR); | |
| 3359 | Removed line. if (field_num == 0) | ||
| 3360 | Removed line. pp_string (buffer, "parent : "); | ||
| 3361 | Removed line. else | ||
| 3362 | Removed line. { | ||
| 3363 | Removed line. char buf[32]; | ||
| 3364 | Removed line. sprintf (buf, "field_%d : ", field_num + 1); | ||
| 3365 | Removed line. pp_string (buffer, buf); | ||
| 3366 | Removed line. } | ||
| 3541 | Added line. pp_string (buffer, allocated_synthetic_field_name (node, field, | ||
| 3542 | Added line. field_num + 1)); | ||
| 3543 | Added line. pp_string (buffer, " : "); | ||
| 3367 | 3544 | dump_ada_record_field_type (buffer, field); | |
| 3368 | 3545 | pp_semicolon (buffer); | |
| 3369 | 3546 | pp_newline (buffer); | |
| @@ -3399 +3576 @@dump_ada_as_base_storage_type (pretty_printer *buffer, tree node, tree type, | |||
| 3399 | 3576 | { | |
| 3400 | 3577 | newline_and_indent (buffer, spc); | |
| 3401 | 3578 | pp_string (buffer, "pragma Component_Alignment (Storage_Unit, "); | |
| 3402 | Removed line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); | ||
| 3403 | Removed line. pp_string (buffer, "_As_Base);"); | ||
| 3579 | Added line. pp_string (buffer, allocated_as_base_name (node)); | ||
| 3580 | Added line. pp_string (buffer, ");"); | ||
| 3404 | 3581 | } | |
| 3405 | 3582 | | |
| 3406 | 3583 | newline_and_indent (buffer, spc); | |
| 3407 | 3584 | pp_string (buffer, "for "); | |
| 3408 | Removed line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); | ||
| 3409 | Removed line. pp_string (buffer, "_As_Base'Size use "); | ||
| 3585 | Added line. pp_string (buffer, allocated_as_base_name (node)); | ||
| 3586 | Added line. pp_string (buffer, "'Size use "); | ||
| 3410 | 3587 | pp_wide_integer (buffer, (HOST_WIDE_INT) data_size * BITS_PER_UNIT); | |
| 3411 | 3588 | pp_semicolon (buffer); | |
| 3412 | 3589 | | |
| 3413 | 3590 | newline_and_indent (buffer, spc); | |
| 3414 | 3591 | pp_string (buffer, "for "); | |
| 3415 | Removed line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); | ||
| 3416 | Removed line. pp_string (buffer, "_As_Base'Object_Size use "); | ||
| 3592 | Added line. pp_string (buffer, allocated_as_base_name (node)); | ||
| 3593 | Added line. pp_string (buffer, "'Object_Size use "); | ||
| 3417 | 3594 | pp_wide_integer (buffer, (HOST_WIDE_INT) data_size * BITS_PER_UNIT); | |
| 3418 | 3595 | pp_semicolon (buffer); | |
| 3419 | 3596 | | |
| 3420 | 3597 | newline_and_indent (buffer, spc); | |
| 3421 | 3598 | pp_string (buffer, "for "); | |
| 3422 | Removed line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); | ||
| 3423 | Removed line. pp_string (buffer, "_As_Base'Alignment use "); | ||
| 3599 | Added line. pp_string (buffer, allocated_as_base_name (node)); | ||
| 3600 | Added line. pp_string (buffer, "'Alignment use "); | ||
| 3424 | 3601 | pp_decimal_int (buffer, as_base_alignment (node, data_size)); | |
| 3425 | 3602 | pp_semicolon (buffer); | |
| 3426 | 3603 | | |
| 3427 | 3604 | newline_and_indent (buffer, spc); | |
| 3428 | 3605 | pp_string (buffer, "for "); | |
| 3429 | Removed line. dump_ada_node (buffer, TYPE_NAME (node), type, spc, false, true); | ||
| 3430 | Removed line. pp_string (buffer, "_As_Base use record"); | ||
| 3606 | Added line. pp_string (buffer, allocated_as_base_name (node)); | ||
| 3607 | Added line. pp_string (buffer, " use record"); | ||
| 3431 | 3608 | | |
| 3432 | 3609 | int repr_field_num = 0; | |
| 3433 | 3610 | for (tree field = TYPE_FIELDS (node); field; field = TREE_CHAIN (field)) | |
| @@ -3448 +3625 @@dump_ada_as_base_storage_type (pretty_printer *buffer, tree node, tree type, | |||
| 3448 | 3625 | newline_and_indent (buffer, spc + INDENT_INCR); | |
| 3449 | 3626 | if (DECL_NAME (field)) | |
| 3450 | 3627 | dump_ada_decl_name (buffer, field, false); | |
| 3451 | Removed line. else if (repr_field_num == 1) | ||
| 3452 | Removed line. pp_string (buffer, "parent"); | ||
| 3453 | 3628 | else | |
| 3454 | Removed line. { | ||
| 3455 | Removed line. char buf[32]; | ||
| 3456 | Removed line. sprintf (buf, "field_%d", repr_field_num); | ||
| 3457 | Removed line. pp_string (buffer, buf); | ||
| 3458 | Removed line. } | ||
| 3629 | Added line. pp_string (buffer, allocated_synthetic_field_name (node, field, | ||
| 3630 | Added line. repr_field_num)); | ||
| 3459 | 3631 | pp_string (buffer, " at "); | |
| 3460 | 3632 | pp_unsigned_wide_integer (buffer, position); | |
| 3461 | 3633 | pp_string (buffer, " range "); | |
| @@ -3575 +3747 @@dump_ada_cpp_layout (pretty_printer *buffer, tree node, tree type, int spc, | |||
| 3575 | 3747 | newline_and_indent (buffer, spc + INDENT_INCR); | |
| 3576 | 3748 | if (DECL_NAME (field)) | |
| 3577 | 3749 | dump_ada_decl_name (buffer, field, false); | |
| 3578 | Removed line. else if (field_num == 1) | ||
| 3579 | Removed line. pp_string (buffer, "parent"); | ||
| 3580 | 3750 | else | |
| 3581 | Removed line. { | ||
| 3582 | Removed line. char buf[32]; | ||
| 3583 | Removed line. sprintf (buf, "field_%d", field_num); | ||
| 3584 | Removed line. pp_string (buffer, buf); | ||
| 3585 | Removed line. } | ||
| 3751 | Added line. pp_string (buffer, allocated_synthetic_field_name (node, field, | ||
| 3752 | Added line. field_num)); | ||
| 3586 | 3753 | pp_string (buffer, " at "); | |
| 3587 | 3754 | pp_unsigned_wide_integer (buffer, position); | |
| 3588 | 3755 | pp_string (buffer, " range "); | |
| @@ -3856 +4023 @@overloading_index (tree name) | |||
| 3856 | 4023 | static void | |
| 3857 | 4024 | print_constructor (pretty_printer *buffer, tree t, tree type) | |
| 3858 | 4025 | { | |
| 3859 | Removed line. tree decl_name = DECL_NAME (TYPE_NAME (type)); | ||
| 3860 | Removed line. | ||
| 3861 | Removed line. pp_string (buffer, "New_"); | ||
| 3862 | Removed line. pp_ada_tree_identifier (buffer, decl_name, t, false); | ||
| 4026 | Added line. tree type_decl = TYPE_NAME (type); | ||
| 4027 | Added line. bool space_found = false; | ||
| 4028 | Added line. char *source = to_ada_name (IDENTIFIER_POINTER (DECL_NAME (type_decl)), | ||
| 4029 | Added line. &space_found); | ||
| 4030 | Added line. const char *base | ||
| 4031 | Added line. = allocate_ada_name (source, DECL_NAME (type_decl), ADA_NAME_SOURCE, | ||
| 4032 | Added line. DECL_CONTEXT (type_decl), | ||
| 4033 | Added line. LOCATION_FILE (decl_sloc (type_decl, false)), "_Case_"); | ||
| 4034 | Added line. char *candidate = concat ("New_", base, NULL); | ||
| 4035 | Added line. pp_string (buffer, allocate_ada_name (candidate, t, ADA_NAME_CONSTRUCTOR, | ||
| 4036 | Added line. DECL_CONTEXT (t), | ||
| 4037 | Added line. LOCATION_FILE (decl_sloc (t, false)), "_")); | ||
| 4038 | Added line. free (candidate); | ||
| 4039 | Added line. free (source); | ||
| 3863 | 4040 | } | |
| 3864 | 4041 | | |
| 3865 | 4042 | /* Dump in BUFFER destructor spec corresponding to T. */ | |
| @@ -3867 +4044 @@print_constructor (pretty_printer *buffer, tree t, tree type) | |||
| 3867 | 4044 | static void | |
| 3868 | 4045 | print_destructor (pretty_printer *buffer, tree t) | |
| 3869 | 4046 | { | |
| 3870 | Removed line. if (startswith (IDENTIFIER_POINTER (DECL_NAME (t)), "__dt_del")) | ||
| 3871 | Removed line. pp_string (buffer, "Delete_And_Free"); | ||
| 3872 | Removed line. else | ||
| 3873 | Removed line. pp_string (buffer, "Delete"); | ||
| 4047 | Added line. const char *candidate | ||
| 4048 | Added line. = startswith (IDENTIFIER_POINTER (DECL_NAME (t)), "__dt_del") | ||
| 4049 | Added line. ? "Delete_And_Free" : "Delete"; | ||
| 4050 | Added line. pp_string (buffer, allocate_ada_name (candidate, t, ADA_NAME_DESTRUCTOR, | ||
| 4051 | Added line. DECL_CONTEXT (t), | ||
| 4052 | Added line. LOCATION_FILE (decl_sloc (t, false)), "_")); | ||
| 3874 | 4053 | } | |
| 3875 | 4054 | | |
| 3876 | 4055 | /* Dump in BUFFER assignment operator spec corresponding to T. */ | |
| @@ -3878 +4057 @@print_destructor (pretty_printer *buffer, tree t) | |||
| 3878 | 4057 | static void | |
| 3879 | 4058 | print_assignment_operator (pretty_printer *buffer, tree t, tree type) | |
| 3880 | 4059 | { | |
| 3881 | Removed line. tree decl_name = DECL_NAME (TYPE_NAME (type)); | ||
| 3882 | Removed line. | ||
| 3883 | Removed line. pp_string (buffer, "Assign_"); | ||
| 3884 | Removed line. pp_ada_tree_identifier (buffer, decl_name, t, false); | ||
| 3885 | Removed line. | ||
| 3886 | Removed line. if (cpp_check (t, GET_FUNCTION_QUALIFIERS) | ||
| 3887 | Removed line. & CPP_FUNCTION_MOVE_ASSIGNMENT) | ||
| 3888 | Removed line. pp_string (buffer, "_Move"); | ||
| 4060 | Added line. tree type_decl = TYPE_NAME (type); | ||
| 4061 | Added line. bool space_found = false; | ||
| 4062 | Added line. char *source = to_ada_name (IDENTIFIER_POINTER (DECL_NAME (type_decl)), | ||
| 4063 | Added line. &space_found); | ||
| 4064 | Added line. const char *base | ||
| 4065 | Added line. = allocate_ada_name (source, DECL_NAME (type_decl), ADA_NAME_SOURCE, | ||
| 4066 | Added line. DECL_CONTEXT (type_decl), | ||
| 4067 | Added line. LOCATION_FILE (decl_sloc (type_decl, false)), "_Case_"); | ||
| 4068 | Added line. char *candidate | ||
| 4069 | Added line. = concat ("Assign_", base, | ||
| 4070 | Added line. (cpp_check (t, GET_FUNCTION_QUALIFIERS) | ||
| 4071 | Added line. & CPP_FUNCTION_MOVE_ASSIGNMENT) ? "_Move" : "", NULL); | ||
| 4072 | Added line. pp_string (buffer, allocate_ada_name (candidate, t, ADA_NAME_ASSIGNMENT, | ||
| 4073 | Added line. DECL_CONTEXT (t), | ||
| 4074 | Added line. LOCATION_FILE (decl_sloc (t, false)), "_")); | ||
| 4075 | Added line. free (candidate); | ||
| 4076 | Added line. free (source); | ||
| 3889 | 4077 | } | |
| 3890 | 4078 | | |
| 3891 | Removed line. /* Append the C++ method qualifiers that Ada profiles cannot represent. */ | ||
| 4079 | Added line. /* Return the complete Ada name of T, including distinctions Ada profiles | ||
| 4080 | Added line. cannot express. Allocate the complete name as one unit so it cannot | ||
| 4081 | Added line. collide with a user-written identifier such as inspect_Const. */ | ||
| 3892 | 4082 | | |
| 3893 | Removed line. static void | ||
| 3894 | Removed line. print_method_qualifiers (pretty_printer *buffer, tree t) | ||
| 4083 | Added line. static const char * | ||
| 4084 | Added line. allocated_method_name (tree t, tree type, unsigned int overload_suffix) | ||
| 3895 | 4085 | { | |
| 4086 | Added line. tree decl_name = DECL_NAME (t); | ||
| 4087 | Added line. bool space_found = false; | ||
| 4088 | Added line. char *base = to_ada_name (IDENTIFIER_POINTER (decl_name), &space_found); | ||
| 3896 | 4089 | const int qualifiers = cpp_check (t, GET_FUNCTION_QUALIFIERS); | |
| 4090 | Added line. const bool renamed | ||
| 4091 | Added line. = (method_name_matches_visible_type (decl_name, type) | ||
| 4092 | Added line. || method_name_matches_destructor (decl_name)); | ||
| 4093 | Added line. const size_t length = strlen (base) + 96; | ||
| 4094 | Added line. char *candidate = XNEWVEC (char, length); | ||
| 4095 | Added line. strcpy (candidate, base); | ||
| 3897 | 4096 | | |
| 3898 | 4097 | if (qualifiers & CPP_FUNCTION_CONST) | |
| 3899 | Removed line. pp_string (buffer, "_Const"); | ||
| 4098 | Added line. strcat (candidate, "_Const"); | ||
| 3900 | 4099 | if (qualifiers & CPP_FUNCTION_VOLATILE) | |
| 3901 | Removed line. pp_string (buffer, "_Volatile"); | ||
| 4100 | Added line. strcat (candidate, "_Volatile"); | ||
| 3902 | 4101 | if (qualifiers & CPP_FUNCTION_LVALUE) | |
| 3903 | Removed line. pp_string (buffer, "_Lvalue"); | ||
| 4102 | Added line. strcat (candidate, "_Lvalue"); | ||
| 3904 | 4103 | else if (qualifiers & CPP_FUNCTION_RVALUE) | |
| 3905 | Removed line. pp_string (buffer, "_Rvalue"); | ||
| 4104 | Added line. strcat (candidate, "_Rvalue"); | ||
| 4105 | Added line. if (renamed) | ||
| 4106 | Added line. strcat (candidate, "_Method"); | ||
| 4107 | Added line. if (overload_suffix > 1) | ||
| 4108 | Added line. snprintf (candidate + strlen (candidate), | ||
| 4109 | Added line. length - strlen (candidate), "%u", overload_suffix); | ||
| 4110 | Added line. | ||
| 4111 | Added line. const bool generated = qualifiers || renamed || overload_suffix > 1; | ||
| 4112 | Added line. const char *allocated | ||
| 4113 | Added line. = allocate_ada_name (candidate, generated ? t : decl_name, | ||
| 4114 | Added line. generated ? (renamed ? ADA_NAME_RENAMED_METHOD | ||
| 4115 | Added line. : ADA_NAME_QUALIFIED_METHOD) | ||
| 4116 | Added line. : ADA_NAME_SOURCE, | ||
| 4117 | Added line. DECL_CONTEXT (t), | ||
| 4118 | Added line. LOCATION_FILE (decl_sloc (t, false)), "_"); | ||
| 4119 | Added line. free (candidate); | ||
| 4120 | Added line. free (base); | ||
| 4121 | Added line. return allocated; | ||
| 3906 | 4122 | } | |
| 3907 | 4123 | | |
| 3908 | 4124 | /* Return true if METHOD_NAME collides with the enclosing class or another | |
| @@ -4101 +4317 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 4101 | 4317 | if (separate_class_package (t)) | |
| 4102 | 4318 | { | |
| 4103 | 4319 | is_class = true; | |
| 4104 | Removed line. pp_string (buffer, "package Class_"); | ||
| 4105 | Removed line. dump_ada_node (buffer, t, type, spc, false, true); | ||
| 4320 | Added line. pp_string (buffer, "package "); | ||
| 4321 | Added line. pp_string (buffer, allocated_class_package_name (t)); | ||
| 4106 | 4322 | pp_string (buffer, " is"); | |
| 4107 | 4323 | spc += INDENT_INCR; | |
| 4108 | 4324 | newline_and_indent (buffer, spc); | |
| @@ -4277 +4493 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 4277 | 4493 | else | |
| 4278 | 4494 | { | |
| 4279 | 4495 | const unsigned int suffix = overloading_index (decl_name); | |
| 4280 | Removed line. pp_ada_tree_identifier (buffer, decl_name, t, false); | ||
| 4281 | Removed line. if (is_method) | ||
| 4282 | Removed line. { | ||
| 4283 | Removed line. print_method_qualifiers (buffer, t); | ||
| 4284 | Removed line. if (method_name_matches_visible_type (decl_name, type) | ||
| 4285 | Removed line. || method_name_matches_destructor (decl_name)) | ||
| 4286 | Removed line. pp_string (buffer, "_Method"); | ||
| 4287 | Removed line. } | ||
| 4288 | Removed line. if (suffix > 1) | ||
| 4289 | Removed line. pp_decimal_int (buffer, suffix); | ||
| 4496 | Added line. if (is_method || suffix > 1) | ||
| 4497 | Added line. pp_string (buffer, allocated_method_name (t, type, suffix)); | ||
| 4498 | Added line. else | ||
| 4499 | Added line. pp_ada_tree_identifier (buffer, decl_name, t, false); | ||
| 4290 | 4500 | } | |
| 4291 | 4501 | | |
| 4292 | 4502 | dump_ada_function_declaration | |
| @@ -4452 +4662 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 4452 | 4662 | newline_and_indent (buffer, spc); | |
| 4453 | 4663 | pp_string (buffer, "end;"); | |
| 4454 | 4664 | newline_and_indent (buffer, spc); | |
| 4455 | Removed line. pp_string (buffer, "use Class_"); | ||
| 4456 | Removed line. dump_ada_node (buffer, t, type, spc, false, true); | ||
| 4665 | Added line. pp_string (buffer, "use "); | ||
| 4666 | Added line. pp_string (buffer, allocated_class_package_name (t)); | ||
| 4457 | 4667 | pp_semicolon (buffer); | |
| 4458 | 4668 | pp_newline (buffer); | |
| 4459 | 4669 | | |
| @@ -4470 +4680 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 4470 | 4680 | | |
| 4471 | 4681 | else | |
| 4472 | 4682 | { | |
| 4473 | Removed line. pp_string (buffer, "; -- "); | ||
| 4683 | Added line. const bool layout_terminated | ||
| 4684 | Added line. = (TREE_CODE (t) == TYPE_DECL | ||
| 4685 | Added line. && RECORD_OR_UNION_TYPE_P (TREE_TYPE (t)) | ||
| 4686 | Added line. && (needs_empty_class_layout (TREE_TYPE (t)) | ||
| 4687 | Added line. || (((needs_tail_padding_layout (TREE_TYPE (t)) | ||
| 4688 | Added line. || (cpp_check && cpp_check (TREE_TYPE (t), HAS_VIRTUAL_BASE)) | ||
| 4689 | Added line. || has_concrete_nested_base (TREE_TYPE (t))) | ||
| 4690 | Added line. && has_constant_field_layout (TREE_TYPE (t)))))); | ||
| 4691 | Added line. pp_string (buffer, layout_terminated ? " -- " : "; -- "); | ||
| 4474 | 4692 | dump_sloc (buffer, t); | |
| 4475 | 4693 | | |
| 4476 | 4694 | if (TREE_CODE (t) == TYPE_DECL | |
| @@ -4543 +4761 @@dump_ada_structure (pretty_printer *buffer, tree node, tree type, bool nested, | |||
| 4543 | 4761 | { | |
| 4544 | 4762 | INDENT (field_spc); | |
| 4545 | 4763 | | |
| 4546 | Removed line. if (field_num == 0) | ||
| 4547 | Removed line. pp_string (buffer, "parent : aliased "); | ||
| 4548 | Removed line. else | ||
| 4549 | Removed line. { | ||
| 4550 | Removed line. sprintf (buf, "field_%d : aliased ", field_num + 1); | ||
| 4551 | Removed line. pp_string (buffer, buf); | ||
| 4552 | Removed line. } | ||
| 4764 | Added line. pp_string (buffer, allocated_synthetic_field_name (node, tmp, | ||
| 4765 | Added line. field_num + 1)); | ||
| 4766 | Added line. pp_string (buffer, " : aliased "); | ||
| 4553 | 4767 | dump_ada_record_field_type (buffer, tmp); | |
| 4554 | 4768 | pp_semicolon (buffer); | |
| 4555 | 4769 | } | |
gcc/testsuite/g++.dg/ada-spec/generated-name-identity.C
+107−0new file
| @@ -0 +1 @@ | |||
| 1 | Added line. /* { dg-do compile } */ | ||
| 2 | Added line. /* { dg-options "-fdump-ada-spec-slim" } */ | ||
| 3 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "function inspect_Const_2" } } */ | ||
| 4 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "function inspect_Const " } } */ | ||
| 5 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "package Box_int_2 is" } } */ | ||
| 6 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "subtype Box_int is Box_int_2.Box" } } */ | ||
| 7 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "the_Widget_2 : int; the_Widget : int" } } */ | ||
| 8 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "type Tail_Derived_As_Base_2" } } */ | ||
| 9 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "parent_Base_2 : aliased Left" } } */ | ||
| 10 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "field_2_Base_2 : aliased Right" } } */ | ||
| 11 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "package Class_Gadget_2 is" } } */ | ||
| 12 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "function New_Creator_2" } } */ | ||
| 13 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "procedure Delete_2" } } */ | ||
| 14 | Added line. /* { dg-final { scan-file generated_name_identity_c.ads "function Assign_Assigner_2" } } */ | ||
| 15 | Added line. | ||
| 16 | Added line. class Methods | ||
| 17 | Added line. { | ||
| 18 | Added line. public: | ||
| 19 | Added line. int inspect () const; | ||
| 20 | Added line. int inspect_Const (); | ||
| 21 | Added line. }; | ||
| 22 | Added line. | ||
| 23 | Added line. template<typename T> | ||
| 24 | Added line. struct Box | ||
| 25 | Added line. { | ||
| 26 | Added line. T value; | ||
| 27 | Added line. }; | ||
| 28 | Added line. | ||
| 29 | Added line. typedef Box<int> Box_int; | ||
| 30 | Added line. | ||
| 31 | Added line. struct Widget | ||
| 32 | Added line. { | ||
| 33 | Added line. int value; | ||
| 34 | Added line. }; | ||
| 35 | Added line. | ||
| 36 | Added line. Widget *make_widget (int Widget, int the_Widget); | ||
| 37 | Added line. | ||
| 38 | Added line. struct Tail_Base | ||
| 39 | Added line. { | ||
| 40 | Added line. char bytes[2]; | ||
| 41 | Added line. }; | ||
| 42 | Added line. | ||
| 43 | Added line. struct Tail_Derived_As_Base | ||
| 44 | Added line. { | ||
| 45 | Added line. int value; | ||
| 46 | Added line. }; | ||
| 47 | Added line. | ||
| 48 | Added line. struct alignas(2) Tail_Derived : Tail_Base | ||
| 49 | Added line. { | ||
| 50 | Added line. char extra; | ||
| 51 | Added line. }; | ||
| 52 | Added line. | ||
| 53 | Added line. struct Left | ||
| 54 | Added line. { | ||
| 55 | Added line. int left; | ||
| 56 | Added line. }; | ||
| 57 | Added line. | ||
| 58 | Added line. struct Right | ||
| 59 | Added line. { | ||
| 60 | Added line. int right; | ||
| 61 | Added line. }; | ||
| 62 | Added line. | ||
| 63 | Added line. struct Both : Left, Right | ||
| 64 | Added line. { | ||
| 65 | Added line. int parent; | ||
| 66 | Added line. int field_2; | ||
| 67 | Added line. }; | ||
| 68 | Added line. | ||
| 69 | Added line. struct Class_Gadget | ||
| 70 | Added line. { | ||
| 71 | Added line. int value; | ||
| 72 | Added line. }; | ||
| 73 | Added line. | ||
| 74 | Added line. class Gadget | ||
| 75 | Added line. { | ||
| 76 | Added line. public: | ||
| 77 | Added line. int ping (); | ||
| 78 | Added line. }; | ||
| 79 | Added line. | ||
| 80 | Added line. class Creator | ||
| 81 | Added line. { | ||
| 82 | Added line. public: | ||
| 83 | Added line. Creator (); | ||
| 84 | Added line. int New_Creator (); | ||
| 85 | Added line. }; | ||
| 86 | Added line. | ||
| 87 | Added line. class Destroyer | ||
| 88 | Added line. { | ||
| 89 | Added line. public: | ||
| 90 | Added line. ~Destroyer (); | ||
| 91 | Added line. static int Delete; | ||
| 92 | Added line. }; | ||
| 93 | Added line. | ||
| 94 | Added line. class Assigner | ||
| 95 | Added line. { | ||
| 96 | Added line. public: | ||
| 97 | Added line. Assigner &operator= (const Assigner &); | ||
| 98 | Added line. int Assign_Assigner (); | ||
| 99 | Added line. }; | ||
| 100 | Added line. | ||
| 101 | Added line. extern "C" int | ||
| 102 | Added line. generated_name_identity_oracle () | ||
| 103 | Added line. { | ||
| 104 | Added line. return 73; | ||
| 105 | Added line. } | ||
| 106 | Added line. | ||
| 107 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 108 | | ||