Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+68 −1 2 files
gcc/c-family/c-ada-spec.cc
+28−1modified
| @@ -3294 +3294 @@print_method_qualifiers (pretty_printer *buffer, tree t) | |||
| 3294 | 3294 | pp_string (buffer, "_Rvalue"); | |
| 3295 | 3295 | } | |
| 3296 | 3296 | | |
| 3297 | Added line. /* Return true if METHOD_NAME collides with the enclosing C++ TYPE name after | ||
| 3298 | Added line. Ada's case-insensitive identifier conversion. */ | ||
| 3299 | Added line. | ||
| 3300 | Added line. static bool | ||
| 3301 | Added line. method_name_matches_type (tree method_name, tree type) | ||
| 3302 | Added line. { | ||
| 3303 | Added line. if (!method_name || !RECORD_OR_UNION_TYPE_P (type) || !TYPE_NAME (type)) | ||
| 3304 | Added line. return false; | ||
| 3305 | Added line. | ||
| 3306 | Added line. tree type_decl = TYPE_NAME (type); | ||
| 3307 | Added line. tree type_name_node = TREE_CODE (type_decl) == TYPE_DECL | ||
| 3308 | Added line. ? DECL_NAME (type_decl) : type_decl; | ||
| 3309 | Added line. if (!type_name_node || TREE_CODE (type_name_node) != IDENTIFIER_NODE) | ||
| 3310 | Added line. return false; | ||
| 3311 | Added line. | ||
| 3312 | Added line. char *method_ada = to_ada_name (IDENTIFIER_POINTER (method_name), NULL); | ||
| 3313 | Added line. char *type_ada = to_ada_name (IDENTIFIER_POINTER (type_name_node), NULL); | ||
| 3314 | Added line. const bool matches = !strcasecmp (method_ada, type_ada); | ||
| 3315 | Added line. free (method_ada); | ||
| 3316 | Added line. free (type_ada); | ||
| 3317 | Added line. return matches; | ||
| 3318 | Added line. } | ||
| 3319 | Added line. | ||
| 3297 | 3320 | /* Return the name of type T. */ | |
| 3298 | 3321 | | |
| 3299 | 3322 | static const char * | |
| @@ -3636 +3659 @@dump_ada_declaration (pretty_printer *buffer, tree t, tree type, int spc) | |||
| 3636 | 3659 | const unsigned int suffix = overloading_index (decl_name); | |
| 3637 | 3660 | pp_ada_tree_identifier (buffer, decl_name, t, false); | |
| 3638 | 3661 | if (is_method) | |
| 3639 | Removed line. print_method_qualifiers (buffer, t); | ||
| 3662 | Added line. { | ||
| 3663 | Added line. print_method_qualifiers (buffer, t); | ||
| 3664 | Added line. if (method_name_matches_type (decl_name, type)) | ||
| 3665 | Added line. pp_string (buffer, "_Method"); | ||
| 3666 | Added line. } | ||
| 3640 | 3667 | if (suffix > 1) | |
| 3641 | 3668 | pp_decimal_int (buffer, suffix); | |
| 3642 | 3669 | } | |
gcc/testsuite/g++.dg/ada-spec/enclosing-type-method-names.C
+40−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 enclosing_type_method_names_c.ads "function left_Method" } } */ | ||
| 4 | Added line. /* { dg-final { scan-file enclosing_type_method_names_c.ads "function right_Method" } } */ | ||
| 5 | Added line. | ||
| 6 | Added line. struct Left | ||
| 7 | Added line. { | ||
| 8 | Added line. virtual int left (); | ||
| 9 | Added line. int l; | ||
| 10 | Added line. }; | ||
| 11 | Added line. | ||
| 12 | Added line. struct Right | ||
| 13 | Added line. { | ||
| 14 | Added line. virtual int right (); | ||
| 15 | Added line. int r; | ||
| 16 | Added line. }; | ||
| 17 | Added line. | ||
| 18 | Added line. struct Both : Left, Right | ||
| 19 | Added line. { | ||
| 20 | Added line. int both; | ||
| 21 | Added line. }; | ||
| 22 | Added line. | ||
| 23 | Added line. int Left::left () { return l; } | ||
| 24 | Added line. int Right::right () { return r; } | ||
| 25 | Added line. extern "C" Left *cpp_create_left (int value) | ||
| 26 | Added line. { | ||
| 27 | Added line. Left *object = new Left; | ||
| 28 | Added line. object->l = value; | ||
| 29 | Added line. return object; | ||
| 30 | Added line. } | ||
| 31 | Added line. extern "C" Right *cpp_create_right (int value) | ||
| 32 | Added line. { | ||
| 33 | Added line. Right *object = new Right; | ||
| 34 | Added line. object->r = value; | ||
| 35 | Added line. return object; | ||
| 36 | Added line. } | ||
| 37 | Added line. extern "C" void cpp_delete_left (Left *object) { delete object; } | ||
| 38 | Added line. extern "C" void cpp_delete_right (Right *object) { delete object; } | ||
| 39 | Added line. | ||
| 40 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 41 | | ||