Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+49 −16 2 files
gcc/c-family/c-ada-spec.cc
+13−16modified
| @@ -3717 +3717 @@print_method_qualifiers (pretty_printer *buffer, tree t) | |||
| 3717 | 3717 | pp_string (buffer, "_Rvalue"); | |
| 3718 | 3718 | } | |
| 3719 | 3719 | | |
| 3720 | Removed line. /* Return true if METHOD_NAME collides with the enclosing C++ TYPE name after | ||
| 3721 | Removed line. Ada's case-insensitive identifier conversion. */ | ||
| 3720 | Added line. /* Return true if METHOD_NAME collides with the enclosing class or another | ||
| 3721 | Added line. type made directly visible by a generated class-package use clause. */ | ||
| 3722 | 3722 | | |
| 3723 | 3723 | static bool | |
| 3724 | Removed line. method_name_matches_type (tree method_name, tree type) | ||
| 3724 | Added line. method_name_matches_visible_type (tree method_name, tree type) | ||
| 3725 | 3725 | { | |
| 3726 | Removed line. if (!method_name || !RECORD_OR_UNION_TYPE_P (type) || !TYPE_NAME (type)) | ||
| 3726 | Added line. if (!method_name) | ||
| 3727 | 3727 | return false; | |
| 3728 | 3728 | | |
| 3729 | Removed line. tree type_decl = TYPE_NAME (type); | ||
| 3730 | Removed line. tree type_name_node = TREE_CODE (type_decl) == TYPE_DECL | ||
| 3731 | Removed line. ? DECL_NAME (type_decl) : type_decl; | ||
| 3732 | Removed line. if (!type_name_node || TREE_CODE (type_name_node) != IDENTIFIER_NODE) | ||
| 3733 | Removed line. return false; | ||
| 3729 | Added line. if (identifier_matches_type (method_name, type)) | ||
| 3730 | Added line. return true; | ||
| 3734 | 3731 | | |
| 3735 | Removed line. char *method_ada = to_ada_name (IDENTIFIER_POINTER (method_name), NULL); | ||
| 3736 | Removed line. char *type_ada = to_ada_name (IDENTIFIER_POINTER (type_name_node), NULL); | ||
| 3737 | Removed line. const bool matches = !strcasecmp (method_ada, type_ada); | ||
| 3738 | Removed line. free (method_ada); | ||
| 3739 | Removed line. free (type_ada); | ||
| 3740 | Removed line. return matches; | ||
| 3732 | Added line. for (int i = 0; i < to_dump_count; i++) | ||
| 3733 | Added line. if (TREE_CODE (to_dump[i]) == TYPE_DECL | ||
| 3734 | Added line. && identifier_matches_type (method_name, TREE_TYPE (to_dump[i]))) | ||
| 3735 | Added line. return true; | ||
| 3736 | Added line. | ||
| 3737 | Added line. return false; | ||
| 3741 | 3738 | } | |
| 3742 | 3739 | | |
| 3743 | 3740 | /* Return the name of type T. */ | |
| @@ -4084 +4081 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 4084 | 4081 | if (is_method) | |
| 4085 | 4082 | { | |
| 4086 | 4083 | print_method_qualifiers (buffer, t); | |
| 4087 | Removed line. if (method_name_matches_type (decl_name, type)) | ||
| 4084 | Added line. if (method_name_matches_visible_type (decl_name, type)) | ||
| 4088 | 4085 | pp_string (buffer, "_Method"); | |
| 4089 | 4086 | } | |
| 4090 | 4087 | if (suffix > 1) | |
gcc/testsuite/g++.dg/ada-spec/visible-type-method-names.C
+36−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 visible_type_method_names_c.ads "function result_Method" } } */ | ||
| 4 | Added line. | ||
| 5 | Added line. struct Result | ||
| 6 | Added line. { | ||
| 7 | Added line. int get (); | ||
| 8 | Added line. int value; | ||
| 9 | Added line. }; | ||
| 10 | Added line. | ||
| 11 | Added line. class Widget | ||
| 12 | Added line. { | ||
| 13 | Added line. public: | ||
| 14 | Added line. int result (); | ||
| 15 | Added line. int value; | ||
| 16 | Added line. }; | ||
| 17 | Added line. | ||
| 18 | Added line. int Result::get () { return value; } | ||
| 19 | Added line. int Widget::result () { return value; } | ||
| 20 | Added line. | ||
| 21 | Added line. extern "C" Widget *cpp_create_widget (int value) | ||
| 22 | Added line. { | ||
| 23 | Added line. Widget *object = new Widget; | ||
| 24 | Added line. object->value = value; | ||
| 25 | Added line. return object; | ||
| 26 | Added line. } | ||
| 27 | Added line. | ||
| 28 | Added line. extern "C" Result *cpp_create_result (int value) | ||
| 29 | Added line. { | ||
| 30 | Added line. return new Result { value }; | ||
| 31 | Added line. } | ||
| 32 | Added line. | ||
| 33 | Added line. extern "C" void cpp_delete_widget (Widget *object) { delete object; } | ||
| 34 | Added line. extern "C" void cpp_delete_result (Result *object) { delete object; } | ||
| 35 | Added line. | ||
| 36 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 37 | | ||
| 1 | 38 | | |
| 2 | 39 | | |