From: Simon Wright <simon@pushface.org>
Subject: Containers, dangling references
Date: Mon, 09 Mar 2020 16:43:55 +0000
Date: 2020-03-09T16:43:55+00:00 [thread overview]
Message-ID: <lya74pbhro.fsf@pushface.org> (raw)
I've been working on checking the upcoming FSF GCC 10 against existing
projects.
One case is a set of containers which include reference types (which,
under the hood, support for example the "for all X of Y" iteration
style).
The original version of the code looked like
type Reference_Type
(Element : not null access Element_Type)
is record
Dummy : Integer := raise Program_Error with "uninitialized reference";
end record;
(this is the full declaration; Dummy is there so that default
initialization will raise PE, as required, e.g. ARM A.18.2(147.4)).
function Reference
(C :aliased in out Container; Position : in Cursor)
return Reference_Type;
with implementation
function Reference (C : aliased in out Container; Position : in Cursor)
return Reference_Type
is
pragma Unreferenced (C);
begin
return (Element => Position.The_Node.all.The_Element'Access, Dummy => 1);
end Reference;
which was fine with compilers up to FSF GCC 9, GNAT CE 2019. With GCC
10, we get
references.adb:8:26: access discriminant in return aggregate would be
a dangling reference
I was a bit puzzled by the Position.The_Node.all.The_Element'Access -
why the .all? It turns out that if you remove it, the compilers that
were happy are no longer. Perhaps this was some circuitry in GNAT to
suppress this error?
How do the Ada.Containers manage this? It turns out that GNAT's
version is more like
return R : constant Reference_Type :=
(Element => Position.The_Node.The_Element'Access, Dummy => 1)
do
null;
end return;
and this is fine in GCC 10 (but if you put in the .all the error
message returns).
I found where the error message is raised[1], but it's hard to tell
what the compiler is actually checking for.
[1] https://github.com/gcc-mirror/gcc/blob/master/gcc/ada/sem_ch6.adb#L858
next reply other threads:[~2020-03-09 16:43 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-03-09 16:43 Simon Wright [this message]
2020-03-09 23:19 ` Containers, dangling references Randy Brukardt
2020-03-10 18:07 ` Simon Wright
2020-03-10 20:28 ` Randy Brukardt
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox