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
next prev parent 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