• renaming as classwide type

    From Simon Belmont@21:1/5 to All on Thu Sep 21 12:29:03 2023
    is it really illegal to rename an object as it's classwide parent? gnat claims so. Similar results using a type extension as a generic formal "in out" object of classwide type.

    declare
    type P is interface;
    type C is new P with null record;

    o : C;
    r : P'Class renames o; --error
    begin
    null;
    end;

    expected type "P'Class" defined at line
    found type "C" defined at line

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From G.B.@21:1/5 to Simon Belmont on Thu Sep 21 23:03:02 2023
    On 21.09.23 21:29, Simon Belmont wrote:
    is it really illegal to rename an object as it's classwide parent? gnat claims so. Similar results using a type extension as a generic formal "in out" object of classwide type.

    declare
    type P is interface;
    type C is new P with null record;

    o : C;
    r : P'Class renames o; --error
    begin
    null;
    end;

    expected type "P'Class" defined at line
    found type "C" defined at line

    O does not denote an object of a class-wide type,
    I think. However, P'Class (o) does, so that renaming
    that would make r be of its declared type P'Class.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon Belmont@21:1/5 to G.B. on Thu Sep 21 16:19:07 2023
    On Thursday, September 21, 2023 at 5:03:06 PM UTC-4, G.B. wrote:
    O does not denote an object of a class-wide type,
    I think. However, P'Class (o) does, so that renaming
    that would make r be of its declared type P'Class.

    That seems needlessly pedantic, considering that assignment is fine (o2 : P'Class := o) as well as assigning it to an intermediate pointer (po : access P'Class := o'Access; r : P'Class renames po.all)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Simon Wright@21:1/5 to Simon Belmont on Fri Sep 22 10:31:01 2023
    Simon Belmont <sbelmont700@gmail.com> writes:

    r : P'Class renames o; --error

    This compiles OK with GCC 13.1.0:

    r : P'Class renames P'Class (o);

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Randy Brukardt@21:1/5 to G.B. on Tue Sep 26 00:46:07 2023
    It's not needless; there is an implicit conversion on an assignment, and it only needs to work one way. When you rename a variable, the conversion has
    to work both ways. But that's problematic, since conversions often involve checks and we don't want checks popping up in unexpected places (both for implementation reasons and for readability reasons).

    Also, renaming does not change the nominal subtype of an object, regardless
    of what subtype is given in the renames. Ada 2022 allows you to omit the
    type name altogether since it provides little value.

    Randy.

    "Simon Belmont" <sbelmont700@gmail.com> wrote in message news:5ab7e1d5-1491-49c3-877d-32bb6e12b43an@googlegroups.com...
    On Thursday, September 21, 2023 at 5:03:06?PM UTC-4, G.B. wrote:
    O does not denote an object of a class-wide type,
    I think. However, P'Class (o) does, so that renaming
    that would make r be of its declared type P'Class.

    That seems needlessly pedantic, considering that assignment is fine (o2 : P'Class := o) as well as assigning it to an intermediate pointer (po :
    access P'Class := o'Access; r : P'Class renames po.all)

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)