From: Marek <ficorax@gmail.com>
Subject: Messing with access types...
Date: Mon, 28 Dec 2020 10:44:47 +0100 [thread overview]
Message-ID: <rsc9eg$a2h$1@dont-email.me> (raw)
Hello,
I have some code:
- util.ads:
with System;
package Util is
type Handle is record
Str : access String;
Data : System.Address;
end record;
type Handle_Access is access all Handle;
Null_Handle : constant Handle := (null, System.Null_Address);
type Handle_Array is array (Natural range <>) of aliased Handle;
generic
type T is private;
type T_Access is access all T;
function Get_Data (H : access Handle; Str : access String) return
T_Access;
generic
type T is private;
type T_Access is access all T;
function Get_Query
(H : access Handle; Str : access String; Data : in out T_Access;
Required : Boolean) return access String;
end Util;
- util.adb
pragma Ada_2012;
with Interfaces.C.Pointers;
with System.Address_To_Access_Conversions;
package body Util is
package Ptr is new Interfaces.C.Pointers
(Index => Natural,
Element => Handle,
Element_Array => Handle_Array,
Default_Terminator => Null_Handle);
use Ptr;
--------------
-- Get_Data --
--------------
function Get_Data (H : access Handle; Str : access String) return
T_Access
is
Pointer : Ptr.Pointer := Ptr.Pointer (H);
package ATA is new System.Address_To_Access_Conversions (T);
begin
if H /= null then
loop
declare
F : access Handle := Pointer;
begin
if Str.all = F.Str.all then
return T_Access (ATA.To_Pointer (F.Data));
end if;
end;
Ptr.Increment (Pointer);
exit when Pointer = null;
end loop;
end if;
return null;
end Get_Data;
---------------
-- Get_Query --
---------------
function Get_Query
(H : access Handle; Str : access String; Data : in out T_Access;
Required : Boolean) return access String
is
function Get is new Get_Data (T, T_Access);
begin
Data := Get (H, Str);
if Required and (Data /= null) then
return Str;
end if;
return null;
end Get_Query;
end Util;
- test.adb
pragma Ada_2012;
with Util;
procedure Test is
use Util;
type Some_Record is record
Foo : Integer;
end record;
type Some_Record_Access is access all Some_Record;
Test_Record : Some_Record_Access;
H : access Handle := null;
Str : access String := new String'("Test");
function Query is new Get_Query (Some_Record, Some_Record_Access);
Result : access String := Query (H, Str, Test_Record, False);
begin
null;
end Test;
When I try to compile test.adb I get some warnings:
Compile
[Ada] test.adb
test.adb:20:04: warning: in instantiation at util.adb:34
test.adb:20:04: warning: in instantiation at util.adb:56
test.adb:20:04: warning: accessibility check failure
test.adb:20:04: warning: "Program_Error" will be raised at run time
test.adb:20:04: warning: in instantiation at util.adb:34
test.adb:20:04: warning: in instantiation at util.adb:56
test.adb:20:04: warning: cannot convert local pointer to non-local
access type
test.adb:20:04: warning: Program_Error will be raised at run time
[Ada] util.adb
Bind
[gprbind] test.bexch
[Ada] test.ali
Link
[link] test.adb
[2020-12-28 10:30:50] process terminated successfully, elapsed time: 00.92s
I tried also to move every local (to Test procedure) variables to global
scope but result is the same.
What is going on? Can you explain where is the problem?
thanks in advance
Marek
next reply other threads:[~2020-12-28 9:44 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-12-28 9:44 Marek [this message]
2020-12-28 10:14 ` Messing with access types Dmitry A. Kazakov
2020-12-28 11:43 ` Marek
2020-12-28 13:56 ` Dmitry A. Kazakov
2020-12-28 18:56 ` Marek
2020-12-28 19:53 ` Dmitry A. Kazakov
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox