Variant gcc-13-14
Applies to 13.2.0, 14.2.0. Source flavors: linux, darwin_arm64.
+74 −9 2 files
gcc/c-family/c-ada-spec.cc
+34−9modified
| @@ -1591 +1591 @@dump_ada_function_declaration (pretty_printer *buffer, tree func, | |||
| 1591 | 1591 | tree t; | |
| 1592 | 1592 | char buf[18]; | |
| 1593 | 1593 | int num, num_args = 0, have_args = true, have_ellipsis = false; | |
| 1594 | Added line. bool is_derived_destructor = false; | ||
| 1595 | Added line. | ||
| 1596 | Added line. if (is_destructor) | ||
| 1597 | Added line. for (tree field = TYPE_FIELDS (DECL_CONTEXT (func)); | ||
| 1598 | Added line. field; | ||
| 1599 | Added line. field = TREE_CHAIN (field)) | ||
| 1600 | Added line. if (cpp_check && cpp_check (field, IS_PRIMARY_BASE_FIELD) | ||
| 1601 | Added line. && is_tagged_type (TREE_TYPE (field))) | ||
| 1602 | Added line. { | ||
| 1603 | Added line. is_derived_destructor = true; | ||
| 1604 | Added line. break; | ||
| 1605 | Added line. } | ||
| 1594 | 1606 | | |
| 1595 | 1607 | /* Compute number of arguments. */ | |
| 1596 | 1608 | if (arg) | |
| @@ -1686 +1698 @@dump_ada_function_declaration (pretty_printer *buffer, tree func, | |||
| 1686 | Removed line. && !(num == 1 && is_method && (DECL_VINDEX (func) || is_constructor))) | ||
| 1698 | Added line. && !(num == 1 && is_method | ||
| 1699 | Added line. && (DECL_VINDEX (func) || is_constructor) | ||
| 1700 | Added line. && !is_derived_destructor)) | ||
| 1687 | 1701 | pp_string (buffer, "'Class"); | |
| @@ -3591 +3591 @@ | |||
| 3591 | 3591 | /* Dump in BUFFER destructor spec corresponding to T. */ | |
| 3592 | 3592 | | |
| 3593 | 3593 | static void | |
| 3594 | Removed line. print_destructor (pretty_printer *buffer, tree t, tree type) | ||
| 3594 | Added line. print_destructor (pretty_printer *buffer, tree t) | ||
| 3595 | 3595 | { | |
| 3596 | Removed line. tree decl_name = DECL_NAME (TYPE_NAME (type)); | ||
| 3597 | Removed line. | ||
| 3598 | Removed line. pp_string (buffer, "Delete_"); | ||
| 3599 | 3596 | if (startswith (IDENTIFIER_POINTER (DECL_NAME (t)), "__dt_del")) | |
| 3600 | Removed line. pp_string (buffer, "And_Free_"); | ||
| 3601 | Removed line. pp_ada_tree_identifier (buffer, decl_name, t, false); | ||
| 3597 | Added line. pp_string (buffer, "Delete_And_Free"); | ||
| 3598 | Added line. else | ||
| 3599 | Added line. pp_string (buffer, "Delete"); | ||
| 3602 | 3600 | } | |
| 3603 | 3601 | | |
| 3604 | 3602 | /* Dump in BUFFER assignment operator spec corresponding to T. */ | |
| @@ -3653 +3651 @@ | |||
| 3653 | 3651 | return false; | |
| 3654 | 3652 | } | |
| 3655 | 3653 | | |
| 3654 | Added line. /* Return true if METHOD_NAME would collide with a stable generated C++ | ||
| 3655 | Added line. destructor name. These names must remain identical throughout a class | ||
| 3656 | Added line. hierarchy so Ada assigns overriding destructors to their C++ vtable slots. */ | ||
| 3657 | Added line. | ||
| 3658 | Added line. static bool | ||
| 3659 | Added line. method_name_matches_destructor (tree method_name) | ||
| 3660 | Added line. { | ||
| 3661 | Added line. const char *name = IDENTIFIER_POINTER (method_name); | ||
| 3662 | Added line. return !strcasecmp (name, "Delete") | ||
| 3663 | Added line. || !strcasecmp (name, "Delete_And_Free"); | ||
| 3664 | Added line. } | ||
| 3665 | Added line. | ||
| 3656 | 3666 | /* Return the name of type T. */ | |
| 3657 | 3667 | | |
| 3658 | 3668 | static const char * | |
| @@ -3987 +3997 @@ | |||
| 3987 | 3997 | if (is_constructor) | |
| 3988 | 3998 | print_constructor (buffer, t, type); | |
| 3989 | 3999 | else if (is_destructor) | |
| 3990 | Removed line. print_destructor (buffer, t, type); | ||
| 4000 | Added line. print_destructor (buffer, t); | ||
| 3991 | 4001 | else if (is_assignment_operator) | |
| 3992 | 4002 | print_assignment_operator (buffer, t, type); | |
| 3993 | 4003 | else | |
| @@ -3997 +4007 @@ | |||
| 3997 | 4007 | if (is_method) | |
| 3998 | 4008 | { | |
| 3999 | 4009 | print_method_qualifiers (buffer, t); | |
| 4000 | Removed line. if (method_name_matches_visible_type (decl_name, type)) | ||
| 4010 | Added line. if (method_name_matches_visible_type (decl_name, type) | ||
| 4011 | Added line. || method_name_matches_destructor (decl_name)) | ||
| 4001 | 4012 | pp_string (buffer, "_Method"); | |
| 4002 | 4013 | } | |
| 4003 | 4014 | if (suffix > 1) | |
gcc/testsuite/g++.dg/ada-spec/derived-virtual-slots.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 derived_virtual_slots_c.ads "procedure Delete \(this : access Derived'Class\)" } } */ | ||
| 4 | Added line. /* { dg-final { scan-file derived_virtual_slots_c.ads "procedure Delete_And_Free \(this : access Derived'Class\)" } } */ | ||
| 5 | Added line. /* { dg-final { scan-file derived_virtual_slots_c.ads "function Delete_Method \(this : access Base'Class\)" } } */ | ||
| 6 | Added line. | ||
| 7 | Added line. class Base | ||
| 8 | Added line. { | ||
| 9 | Added line. public: | ||
| 10 | Added line. Base (int base_value); | ||
| 11 | Added line. virtual ~Base () = default; | ||
| 12 | Added line. virtual int inherited_slot () { return base; } | ||
| 13 | Added line. int Delete () { return base; } | ||
| 14 | Added line. int base; | ||
| 15 | Added line. int reserved; | ||
| 16 | Added line. }; | ||
| 17 | Added line. | ||
| 18 | Added line. class Derived : public Base | ||
| 19 | Added line. { | ||
| 20 | Added line. public: | ||
| 21 | Added line. Derived (int base_value, int own_value); | ||
| 22 | Added line. ~Derived () override = default; | ||
| 23 | Added line. int inherited_slot () override { return base + own; } | ||
| 24 | Added line. virtual int added_slot () { return base + own + 5; } | ||
| 25 | Added line. int own; | ||
| 26 | Added line. }; | ||
| 27 | Added line. | ||
| 28 | Added line. Base::Base (int base_value) : base (base_value), reserved (0) {} | ||
| 29 | Added line. Derived::Derived (int base_value, int own_value) | ||
| 30 | Added line. : Base (base_value), own (own_value) {} | ||
| 31 | Added line. | ||
| 32 | Added line. extern "C" Derived *create_derived () { return new Derived (10, 2); } | ||
| 33 | Added line. extern "C" void delete_derived (Derived *object) { delete object; } | ||
| 34 | Added line. extern "C" int cpp_call_inherited (Derived *object) | ||
| 35 | Added line. { | ||
| 36 | Added line. return object->inherited_slot (); | ||
| 37 | Added line. } | ||
| 38 | Added line. extern "C" int cpp_call_added (Derived *object) { return object->added_slot (); } | ||
| 39 | Added line. | ||
| 40 | Added line. /* { dg-final { cleanup-ada-spec } } */ | ||
| 41 | | ||