diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2023-04-24 17:11:01 +0200 |
---|---|---|
committer | Marc Poulhiès <poulhies@adacore.com> | 2023-06-13 09:31:44 +0200 |
commit | 54dd56f5c82ff26e46e8b24214d0988da8e3ad8a (patch) | |
tree | 9cf1b52a7b3a4d2cc2f1684119cb286e87233182 /gcc/ada/contracts.adb | |
parent | c0ceba6c86ae4fcefa720b0976c58481c903eb63 (diff) | |
download | gcc-54dd56f5c82ff26e46e8b24214d0988da8e3ad8a.zip gcc-54dd56f5c82ff26e46e8b24214d0988da8e3ad8a.tar.gz gcc-54dd56f5c82ff26e46e8b24214d0988da8e3ad8a.tar.bz2 |
ada: Fix internal error on imported function with post-condition
The problem, which is also present for an expression function, is that the
function is invoked in the initializing expression of a variable declared
in the same declarative part as the function, which causes the freezing of
its artificial body before the post-condition is analyzed on its spec.
gcc/ada/
* contracts.adb (Analyze_Entry_Or_Subprogram_Body_Contract): For a
subprogram body that has no contracts and does not come from source,
make sure that contracts on its corresponding spec are analyzed, if
any, before expanding them.
Diffstat (limited to 'gcc/ada/contracts.adb')
-rw-r--r-- | gcc/ada/contracts.adb | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/gcc/ada/contracts.adb b/gcc/ada/contracts.adb index 7625abf..ae9e07f 100644 --- a/gcc/ada/contracts.adb +++ b/gcc/ada/contracts.adb @@ -598,6 +598,22 @@ package body Contracts is else Set_Analyzed (Items); end if; + + -- When this is a subprogram body not coming from source, for example an + -- expression function, it does not cause freezing of previous contracts + -- (see Analyze_Subprogram_Body_Helper), in particular not of those on + -- its spec if it exists. In this case make sure they have been properly + -- analyzed before being expanded below, as we may be invoked during the + -- freezing of the subprogram in the middle of its enclosing declarative + -- part because the declarative part contains e.g. the declaration of a + -- variable initialized by means of a call to the subprogram. + + elsif Nkind (Body_Decl) = N_Subprogram_Body + and then not Comes_From_Source (Original_Node (Body_Decl)) + and then Present (Corresponding_Spec (Body_Decl)) + and then Present (Contract (Corresponding_Spec (Body_Decl))) + then + Analyze_Entry_Or_Subprogram_Contract (Corresponding_Spec (Body_Decl)); end if; -- Due to the timing of contract analysis, delayed pragmas may be |