comp.lang.ada
 help / color / mirror / Atom feed
* Different aliasing rules for containers?
@ 2020-02-20 12:24 Martin B. B.
  2020-02-20 13:36 ` joakimds
  0 siblings, 1 reply; 3+ messages in thread
From: Martin B. B. @ 2020-02-20 12:24 UTC (permalink / 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?

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-02-20 13:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-02-20 12:24 Different aliasing rules for containers? Martin B. B.
2020-02-20 13:36 ` joakimds
2020-02-20 13:47   ` Martin B. B.

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