diff options
Diffstat (limited to 'gcc/ada/doc')
-rw-r--r-- | gcc/ada/doc/gnat_rm/gnat_language_extensions.rst | 68 | ||||
-rw-r--r-- | gcc/ada/doc/gnat_rm/standard_and_implementation_defined_restrictions.rst | 6 |
2 files changed, 71 insertions, 3 deletions
diff --git a/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst b/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst index f313179..ff111dd 100644 --- a/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst +++ b/gcc/ada/doc/gnat_rm/gnat_language_extensions.rst @@ -1793,3 +1793,71 @@ statement in the sequence of statements of the specified loop_statement. Note that ``continue`` is a keyword but it is not a reserved word. This is a configuration that does not exist in standard Ada. + +Destructors +----------- + +The ``Destructor`` aspect can be applied to any record type, tagged or not. +It must denote a primitive of the type that is a procedure with one parameter +of the type and of mode ``in out``: + +.. code-block:: ada + + type T is record + ... + end record with Destructor => Foo; + + procedure Foo (X : in out T); + +This is equivalent to the following code that uses ``Finalizable``: + +.. code-block:: ada + + type T is record + ... + end record with Finalizable => (Finalize => Foo); + + procedure Foo (X : in out T); + +Unlike ``Finalizable``, however, ``Destructor`` can be specified on a derived +type. And when it is, the effect of the aspect combines with the destructors of +the parent type. Take, for example: + +.. code-block:: ada + + type T1 is record + ... + end record with Destructor => Foo; + + procedure Foo (X : in out T1); + + type T2 is new T1 with Destructor => Bar; + + procedure Bar (X : in out T2); + +Here, when an object of type ``T2`` is finalized, a call to ``Bar`` +will be performed and it will be followed by a call to ``Foo``. + +The ``Destructor`` aspect comes with a legality rule: if a primitive procedure +of a type is denoted by a ``Destructor`` aspect specification, it is illegal to +override this procedure in a derived type. For example, the following is illegal: + +.. code-block:: ada + + type T1 is record + ... + end record with Destructor => Foo; + + procedure Foo (X : in out T1); + + type T2 is new T1; + + overriding + procedure Foo (X : in out T2); -- Error here + +It is possible to specify ``Destructor`` on the completion of a private type, +but there is one more restriction in that case: the denoted primitive must +be private to the enclosing package. This is necessary due to the previously +mentioned legality rule, to prevent breaking the privacy of the type when +imposing that rule on outside types that derive from the private view of the +type. diff --git a/gcc/ada/doc/gnat_rm/standard_and_implementation_defined_restrictions.rst b/gcc/ada/doc/gnat_rm/standard_and_implementation_defined_restrictions.rst index 0e9162a..1f0aa03 100644 --- a/gcc/ada/doc/gnat_rm/standard_and_implementation_defined_restrictions.rst +++ b/gcc/ada/doc/gnat_rm/standard_and_implementation_defined_restrictions.rst @@ -333,9 +333,9 @@ must define with the following profile: "__gnat_last_chance_handler"); -The parameter is a C null-terminated string representing a message to be -associated with the exception (typically the source location of the raise -statement generated by the compiler). The Line parameter when nonzero +The ``Source_Location`` parameter is a C null-terminated string representing a +message to be associated with the exception (typically the source location of +the raise statement generated by the compiler). The Line parameter when nonzero represents the line number in the source program where the raise occurs. No_Exception_Propagation |