+2018-05-24 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * freeze.adb (Wrap_Imported_Subprogram): Generate an unchecked
+ conversion to the return type to avoid a side effect where an imported
+ relocated function generates a new anonymous access type, whose
+ accessibility level does not agree with with that of the wrapper.
+
2018-05-24 Javier Miranda <miranda@adacore.com>
* sem_util.adb (Abstract_Interface_List): Add missing support for
-- Build the call
+ -- An imported function whose result type is anonymous access
+ -- creates a new anonynous access type when it is relocated into
+ -- the declarations of the body generated below. As a result, the
+ -- accessibility level of these two anonymous access types may not
+ -- be compatible even though they are essentially the same type.
+ -- Use an unchecked type conversion to reconcile this case. Note
+ -- that the conversion is safe because in the named access type
+ -- case, both the body and imported function utilize the same
+ -- type.
+
if Ekind_In (E, E_Function, E_Generic_Function) then
Stmt :=
Make_Simple_Return_Statement (Loc,
Expression =>
- Make_Function_Call (Loc,
- Name => Make_Identifier (Loc, CE),
- Parameter_Associations => Parms));
+ Unchecked_Convert_To (Etype (E),
+ Make_Function_Call (Loc,
+ Name => Make_Identifier (Loc, CE),
+ Parameter_Associations => Parms)));
else
Stmt :=