comp.lang.ada
 help / color / mirror / Atom feed
From: Simon Wright <simon@pushface.org>
Subject: Re: Compiler error (2) ?
Date: Mon, 26 Sep 2022 09:12:05 +0100	[thread overview]
Message-ID: <lyedvy1rmy.fsf@pushface.org> (raw)
In-Reply-To: 7085edb5-688c-410c-b401-23ff3ca2a38fn@googlegroups.com

I'm not sure what compiler error you mean.

Agreed that the code as stands reports a strange issue,

    11.    S_Names: constant S_Names_P.Vector := [for I in 3..N => S0];
                                                 |
        >>> error: expected type "Standard.Integer"
        >>> error: found type "Ada.Containers.Count_Type"

which does look like a compiler error (even if it's only misreporting a
valid issue, I'm not sure).

What's more interesting is what happens if you make your suggested
change and it compiles. When you run it,

   $ ./reinert_2 

   raised CONSTRAINT_ERROR : test1a.s_names_p.Replace_Element: Index is
   out of range

Running this under the debugger, with 'catch exception',

   Catchpoint 1, CONSTRAINT_ERROR (test1a.s_names_p.Replace_Element: Index is out of range) at 0x0000000100008ae5 in test1a () at reinert_2.adb:15
   15	   s_names: constant s_names_p.Vector := [for i in 3..n => S0];

So, what's Index?

   (gdb) p index
   No definition of "index" in current context.

Looing at the backtrace,

   (gdb) bt
   [...]
   #4  0x0000000100011711 in test1a.s_names_p.replace_element (container=..., 
       index=6, new_item=s0)
       at /opt/gcc-12.1.0/lib/gcc/x86_64-apple-darwin15/12.1.0/adainclude/a-convec.adb:2522
   #5  0x0000000100008ae5 in test1a () at reinert_2.adb:15

Frame 4 is in the runtime; maybe we can see what's going on,

   (gdb) fr 4
   #4  0x0000000100011711 in test1a.s_names_p.replace_element (container=..., 
       index=6, new_item=s0)
       at /opt/gcc-12.1.0/lib/gcc/x86_64-apple-darwin15/12.1.0/adainclude/a-convec.adb:2522
   2522	         raise Constraint_Error with "Index is out of range";
   (gdb) p index
   $1 = 6

Hmm. What does the source say?

   (gdb) l
   2517	   is
   2518	   begin
   2519	      TE_Check (Container.TC);
   2520	
   2521	      if Checks and then Index > Container.Last then
   2522	         raise Constraint_Error with "Index is out of range";
   2523	      end if;
   2524	
   2525	      Container.Elements.EA (Index) := New_Item;
   2526	   end Replace_Element;

So Index (6) is more than Container.Last:

   (gdb) p container
   $2 = (elements => 0x600000008000, last => 5, tc => (busy => 0, lock => 0))
   (gdb)

6 is certainly more than 5. Where does 5 come from?

Index is Positive. We were hoping to have our container with indices
supporting values up to 7, but the first index of a container has to be
Index_Type'First i.e. 1; the compiler has looked at the length of the
aggregate (5) and created an empty Vector s_names of that length.

Clearly you can't do slices in this context!

  reply	other threads:[~2022-09-26  8:12 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-26  6:54 Compiler error (2) ? reinert
2022-09-26  8:12 ` Simon Wright [this message]
2022-09-26  8:34 ` J-P. Rosen
2022-09-26  8:47   ` reinert
2022-09-26  9:59     ` reinert
replies disabled

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