https://gcc.gnu.org/g:faca90cb58c209c21c54bb86305f5a3c39e2dbbd

commit r16-9008-gfaca90cb58c209c21c54bb86305f5a3c39e2dbbd
Author: Eric Botcazou <[email protected]>
Date:   Wed Mar 4 20:43:02 2026 +0100

    ada: Reject non-primitive operations in Finalizable aspect
    
    The implementation does not support them and allowing them would not bring
    any significant benefit.
    
    gcc/ada/ChangeLog:
    
            * doc/gnat_rm/gnat_language_extensions.rst
            (Generalized Finalization): Document the new restriction.
            * sem_ch13.adb (Resolve_Finalizable_Argument): Adjust wording of
            error message.
            (Resolve_Finalization_Procedure.Is_Finalizable_Primitive): Require
            the procedure to be a primitive operation.
            * gnat_rm.texi: Regenerate.

Diff:
---
 gcc/ada/doc/gnat_rm/gnat_language_extensions.rst | 5 +++--
 gcc/ada/gnat_rm.texi                             | 5 +++--
 gcc/ada/sem_ch13.adb                             | 7 ++++++-
 3 files changed, 12 insertions(+), 5 deletions(-)

diff --git a/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst 
b/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst
index 92a9fc5589f6..de08d892dcaf 100644
--- a/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst
+++ b/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst
@@ -635,8 +635,9 @@ Here is the archetypal example:
     procedure Finalize   (Obj : in out T);
     procedure Initialize (Obj : in out T);
 
-The three procedures have the same profile, with a single ``in out`` parameter,
-and also have the same dynamic semantics as for controlled types:
+The three procedures must be primitive operations of ``T`` and have a single
+``in out`` parameter. They need not be all specified by the aspect. If they
+are specified, they have the same dynamic semantics as for controlled types:
 
  - ``Initialize`` is called when an object of type ``T`` is declared without
    initialization expression.
diff --git a/gcc/ada/gnat_rm.texi b/gcc/ada/gnat_rm.texi
index f4359db64e3c..993bbdbd84c4 100644
--- a/gcc/ada/gnat_rm.texi
+++ b/gcc/ada/gnat_rm.texi
@@ -31573,8 +31573,9 @@ procedure Finalize   (Obj : in out T);
 procedure Initialize (Obj : in out T);
 @end example
 
-The three procedures have the same profile, with a single @code{in out} 
parameter,
-and also have the same dynamic semantics as for controlled types:
+The three procedures must be primitive operations of @code{T} and have a single
+@code{in out} parameter. They need not be all specified by the aspect. If they
+are specified, they have the same dynamic semantics as for controlled types:
 
 @quotation
 
diff --git a/gcc/ada/sem_ch13.adb b/gcc/ada/sem_ch13.adb
index dd54bddf0229..fc6724a760ad 100644
--- a/gcc/ada/sem_ch13.adb
+++ b/gcc/ada/sem_ch13.adb
@@ -17871,10 +17871,14 @@ package body Sem_Ch13 is
       end if;
 
       Error_Msg_N
-        ("finalizable primitive must be local procedure whose only formal " &
+        ("subprogram must denote primitive procedure whose only formal " &
          "parameter has mode `IN OUT` and is of the finalizable type", N);
    end Resolve_Finalizable_Argument;
 
+   ------------------------------------
+   -- Resolve_Finalization_Procedure --
+   ------------------------------------
+
    function Resolve_Finalization_Procedure
      (N   : Node_Id;
       Typ : Entity_Id)
@@ -17891,6 +17895,7 @@ package body Sem_Ch13 is
       begin
          return Ekind (E) = E_Procedure
            and then Scope (E) = Scope (Typ)
+           and then Is_Primitive (E)
            and then Present (First_Formal (E))
            and then Ekind (First_Formal (E)) = E_In_Out_Parameter
            and then Etype (First_Formal (E)) = Typ

Reply via email to