comp.lang.ada
 help / color / mirror / Atom feed
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?

             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