[Ada] Spurious error on imported subprogram with precondition
authorHristian Kirtchev <kirtchev@adacore.com>
Thu, 24 May 2018 13:04:34 +0000 (13:04 +0000)
committerPierre-Marie de Rodat <pmderodat@gcc.gnu.org>
Thu, 24 May 2018 13:04:34 +0000 (13:04 +0000)
commitd72099ebf764ad96452153de8a77ab52d4731e18
tree708a3eb0682131c904a74f560fcc3aef2a61f763
parent0b5252ac694ea0393cc9443ef2cebcab60bab40d
[Ada] Spurious error on imported subprogram with precondition

This patch modifies the generation of wrappers for imported subprograms which
are subject to contracts. In the case of an imported function, the original
function is relocated within the wrapper, and the wrapper simply invokes the
imported subprogram, returning its value. When the result type of the imported
subprogram is anonymous access, the relocation creates a new anonymous access
type, but with a different accessibility level. Since both return types are
essentially the same type, eliminate the accessibility level inconsistency by
unchecked converting the result of calling the imported function to the return
type.

------------
-- Source --
------------

--  pack.ads

package Pack is
   type Integer_Ptr is access all Integer;
   type Typ is null record;

   function Predicate (Val : Typ) return Boolean is (True);

   function Imported_1 (Val : Typ) return access Integer
     with Pre => Predicate (Val), Import;

   function Imported_2 (Val : Typ) return Integer_Ptr
     with Pre => Predicate (Val), Import;
end Pack;

-----------------
-- Compilation --
-----------------

$ gcc -c pack.ads

2018-05-24  Hristian Kirtchev  <kirtchev@adacore.com>

gcc/ada/

* 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.

From-SVN: r260645
gcc/ada/ChangeLog
gcc/ada/freeze.adb