comp.lang.ada
 help / color / mirror / Atom feed
From: joakimds@kth.se
Subject: Re: Different aliasing rules for containers?
Date: Thu, 20 Feb 2020 05:36:36 -0800 (PST)
Date: 2020-02-20T05:36:36-08:00	[thread overview]
Message-ID: <3c675051-911e-44b2-9eba-c4712892e6dd@googlegroups.com> (raw)
In-Reply-To: <a35322eb-cd4c-4af2-b7c2-de03aa75c5c5@googlegroups.com>

Den torsdag 20 februari 2020 kl. 13:24:37 UTC+1 skrev Martin B. B.:
> The following code:
> 
> with Ada.Containers.Vectors;
> with Ada.Text_IO;
> 
> procedure Test is
> 
>    package IO renames Ada.Text_IO;
> 
>    type Obj is record
>       Id : Integer;
>    end record;
> 
>    package Obj_Vectors is new Ada.Containers.Vectors
>      (Index_Type   => Positive,
>       Element_Type => Obj);
>    
>    use type Obj_Vectors.Vector;
>       
>    Objects : Obj_Vectors.Vector := Obj'(Id => 0) & Obj'(Id => 1) & Obj'(Id => 2);
> 
> begin
>    for O of Objects loop
>       O.Id := 999;
>    end loop;
>    
>    for O of Objects loop
>       IO.Put_Line (Integer'Image (O.Id));
>    end loop;
> end Test;
> 
> Using GNAT Community 2019 (20190517-83) produces the following output:
>  999
>  999
>  999
> 
> When looking at the Ada.Containers.Vectors package specification, I see the following:
>    type Vector is tagged private
>    with
>       Constant_Indexing => Constant_Reference,
>       Variable_Indexing => Reference,
>       Default_Iterator  => Iterate,
>       Iterator_Element  => Element_Type;
> 
> However, both the `Rerefence` and `Constant_Reference` functions takes aliased parameters:
>    function Reference
>      (Container : aliased in out Vector;
>       Position  : Cursor) return Reference_Type;
> 
> My question is then: How is the code above possible then, when my `Objects` vector is not aliased? Shouldn't the compiler complain that I haven't declared `Objects` as being aliased?
> 
> Even creating my own procedure that takes a `V : aliased Obj_Vectors.Vector` still produces no aliasing errors when passing it a non-aliased vector.
> 
> This code:
> with Ada.Text_IO;
> 
> procedure Test is
> 
>    package IO renames Ada.Text_IO;
>    
>    procedure Takes_Aliased_Integer (X : aliased Integer);
> 
>    procedure Takes_Aliased_Integer (X : aliased Integer) is
>    begin
>       null;
>    end Takes_Aliased_Integer;
> 
>    My_Int : Integer := 123;
> 
> begin
>    Takes_Aliased_Integer (My_Int);
> end Test;
> 
> However, correctly(?) generates the following compiler error: "actual for aliased formal "X" must be aliased object".
> 
> So, what exactly is going on here? Am I missing something?

Hi Martin,

Could it be because Obj_Vectors.Vector is a tagged type and is therefore always passed by reference in subprogram calls and that implies it is aliased?

Best regards,
Joakim

  reply	other threads:[~2020-02-20 13:36 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-20 12:24 Different aliasing rules for containers? Martin B. B.
2020-02-20 13:36 ` joakimds [this message]
2020-02-20 13:47   ` Martin B. B.
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox