Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+91 −1 2 files
gcc/c-family/c-ada-spec.cc
+56−1modified
| @@ -1680 +1680 @@dump_ada_import (pretty_printer *buffer, tree t, int spc) | |||
| 1680 | 1680 | pp_string (buffer, "\";"); | |
| 1681 | 1681 | } | |
| 1682 | 1682 | | |
| 1683 | Added line. /* Return true if NAME and TYPE use the same Ada identifier. Strip anonymous | ||
| 1684 | Added line. pointer and reference layers because the generated profile names their | ||
| 1685 | Added line. designated type directly. */ | ||
| 1686 | Added line. | ||
| 1687 | Added line. static bool | ||
| 1688 | Added line. identifier_matches_type (tree name, tree type) | ||
| 1689 | Added line. { | ||
| 1690 | Added line. if (!name || !type || type == error_mark_node) | ||
| 1691 | Added line. return false; | ||
| 1692 | Added line. | ||
| 1693 | Added line. while ((TREE_CODE (type) == POINTER_TYPE | ||
| 1694 | Added line. || TREE_CODE (type) == REFERENCE_TYPE) | ||
| 1695 | Added line. && !TYPE_NAME (type)) | ||
| 1696 | Added line. type = TREE_TYPE (type); | ||
| 1697 | Added line. | ||
| 1698 | Added line. if (TREE_CODE (type) == FUNCTION_TYPE || !TYPE_NAME (type)) | ||
| 1699 | Added line. return false; | ||
| 1700 | Added line. | ||
| 1701 | Added line. tree type_name_node = TYPE_NAME (type); | ||
| 1702 | Added line. if (TREE_CODE (type_name_node) == TYPE_DECL) | ||
| 1703 | Added line. type_name_node = DECL_NAME (type_name_node); | ||
| 1704 | Added line. if (!type_name_node || TREE_CODE (type_name_node) != IDENTIFIER_NODE) | ||
| 1705 | Added line. return false; | ||
| 1706 | Added line. | ||
| 1707 | Added line. char *decl_ada = to_ada_name (IDENTIFIER_POINTER (name), NULL); | ||
| 1708 | Added line. char *type_ada = to_ada_name (IDENTIFIER_POINTER (type_name_node), NULL); | ||
| 1709 | Added line. const bool matches = !strcasecmp (decl_ada, type_ada); | ||
| 1710 | Added line. free (decl_ada); | ||
| 1711 | Added line. free (type_ada); | ||
| 1712 | Added line. return matches; | ||
| 1713 | Added line. } | ||
| 1714 | Added line. | ||
| 1683 | 1715 | /* Check whether T and its type have different names, and append "the_" | |
| 1684 | 1716 | otherwise in BUFFER. */ | |
| 1685 | 1717 | | |
| @@ -1709 +1741 @@check_type_name_conflict (pretty_printer *buffer, tree t) | |||
| 1709 | 1741 | } | |
| 1710 | 1742 | } | |
| 1711 | 1743 | | |
| 1744 | Added line. /* Return true if PARAMETER would hide a type used by its own or a later | ||
| 1745 | Added line. profile element. Ada formal parameters are visible through the remainder | ||
| 1746 | Added line. of the profile, including its return type. */ | ||
| 1747 | Added line. | ||
| 1748 | Added line. static bool | ||
| 1749 | Added line. parameter_name_conflicts_with_profile (tree parameter, tree func, | ||
| 1750 | Added line. bool is_constructor) | ||
| 1751 | Added line. { | ||
| 1752 | Added line. tree name = DECL_NAME (parameter); | ||
| 1753 | Added line. if (!name) | ||
| 1754 | Added line. return false; | ||
| 1755 | Added line. | ||
| 1756 | Added line. for (tree arg = parameter; arg; arg = DECL_CHAIN (arg)) | ||
| 1757 | Added line. if (identifier_matches_type (name, TREE_TYPE (arg))) | ||
| 1758 | Added line. return true; | ||
| 1759 | Added line. | ||
| 1760 | Added line. tree return_type = is_constructor | ||
| 1761 | Added line. ? DECL_CONTEXT (func) : TREE_TYPE (TREE_TYPE (func)); | ||
| 1762 | Added line. return identifier_matches_type (name, return_type); | ||
| 1763 | Added line. } | ||
| 1764 | Added line. | ||
| 1712 | 1765 | /* Dump in BUFFER a function declaration FUNC in Ada syntax. | |
| 1713 | 1766 | IS_METHOD indicates whether FUNC is a C++ method. | |
| 1714 | 1767 | IS_CONSTRUCTOR whether FUNC is a C++ constructor. | |
| @@ -1786 +1839 @@dump_ada_function_declaration (pretty_printer *buffer, tree func, | |||
| 1786 | 1839 | { | |
| 1787 | 1840 | if (DECL_NAME (arg)) | |
| 1788 | 1841 | { | |
| 1789 | Removed line. check_type_name_conflict (buffer, arg); | ||
| 1842 | Added line. if (parameter_name_conflicts_with_profile (arg, func, | ||
| 1843 | Added line. is_constructor)) | ||
| 1844 | Added line. pp_string (buffer, "the_"); | ||
| 1790 | 1845 | pp_ada_tree_identifier (buffer, DECL_NAME (arg), NULL_TREE, | |
| 1791 | 1846 | false); | |
| 1792 | 1847 | pp_string (buffer, " : "); | |
gcc/testsuite/g++.dg/ada-spec/profile-formal-type-names.C
+35−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 profile_formal_type_names_c.ads "function New_Widget \(the_widget : int\)" } } */ | ||
| 4 | Added line. /* { dg-final { scan-file profile_formal_type_names_c.ads "function make_result \(the_result : int\)" } } */ | ||
| 5 | Added line. /* { dg-final { scan-file profile_formal_type_names_c.ads "function inspect \(the_result : int; item : access Result\)" } } */ | ||
| 6 | Added line. | ||
| 7 | Added line. struct Result | ||
| 8 | Added line. { | ||
| 9 | Added line. int value; | ||
| 10 | Added line. }; | ||
| 11 | Added line. | ||
| 12 | Added line. struct Widget | ||
| 13 | Added line. { | ||
| 14 | Added line. Widget (int widget); | ||
| 15 | Added line. int value; | ||
| 16 | Added line. }; | ||
| 17 | Added line. | ||
| 18 | Added line. Widget::Widget (int widget) : value (widget) {} | ||
| 19 | Added line. | ||
| 20 | Added line. extern "C" Result *make_result (int result) | ||
| 21 | Added line. { | ||
| 22 | Added line. return new Result { result }; | ||
| 23 | Added line. } | ||
| 24 | Added line. | ||
| 25 | Added line. extern "C" int inspect (int result, Result *item) | ||
| 26 | Added line. { | ||
| 27 | Added line. return result + item->value; | ||
| 28 | Added line. } | ||
| 29 | Added line. | ||
| 30 | Added line. extern "C" void delete_result (Result *item) | ||
| 31 | Added line. { | ||
| 32 | Added line. delete item; | ||
| 33 | Added line. } | ||
| 34 | Added line. | ||
| 35 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 36 | | ||