From: "Martin B. B." <MartinBBjerregaard@gmail.com>
Subject: Different aliasing rules for containers?
Date: Thu, 20 Feb 2020 04:24:36 -0800 (PST)
Date: 2020-02-20T04:24:36-08:00 [thread overview]
Message-ID: <a35322eb-cd4c-4af2-b7c2-de03aa75c5c5@googlegroups.com> (raw)
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?
next reply other threads:[~2020-02-20 12:24 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-02-20 12:24 Martin B. B. [this message]
2020-02-20 13:36 ` Different aliasing rules for containers? joakimds
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