aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/contracts.adb
diff options
context:
space:
mode:
authorPiotr Trojanek <trojanek@adacore.com>2023-04-02 14:47:49 +0200
committerMarc Poulhiès <poulhies@adacore.com>2023-05-29 10:23:21 +0200
commit11f406ee4747e48a9b0e34aa6f6b3cdb38665a1b (patch)
tree6e39edb72405c43c38f74c1662785a2f96011546 /gcc/ada/contracts.adb
parent8bb536cc97645208482ec3303d1cf9f99f95b42c (diff)
downloadgcc-11f406ee4747e48a9b0e34aa6f6b3cdb38665a1b.zip
gcc-11f406ee4747e48a9b0e34aa6f6b3cdb38665a1b.tar.gz
gcc-11f406ee4747e48a9b0e34aa6f6b3cdb38665a1b.tar.bz2
ada: Attach pre/post on access-to-subprogram to internal subprogram type
Aspects Pre/Post that annotate access-to-subprogram type were attached to the source entity (whose kind is either E_Access_Subprogram_Type or E_Access_Protected_Subprogram_Type). However, it is more convenient to attach them to the internal entity (whose kind is E_Subprogram_Type), so that both Pre/Post aspects and First_Formal/Next_Formal chain are attached to the same entity, just like for ordinary subprograms. The drawback of having the Post aspect attached to an internal entity is that name in prefixes of attribute Result no longer match the name of entity where this Post aspect is attached. However, currently there is no code that relies on this matching and, in general, there are fewer routines that deal with attribute Result so they are easier to adapt than the code that queries the Pre/Post aspects. gcc/ada/ * contracts.adb (Add_Pre_Post_Condition): Attach pre/post aspects to E_Subprogram_Type entity. (Analyze_Entry_Or_Subprogram_Contract): Adapt to use full type declaration for a contract attached to E_Subprogram_Type entity. * sem_prag.adb (Analyze_Pre_Post_Condition): Add pre/post aspects to the designed type.
Diffstat (limited to 'gcc/ada/contracts.adb')
-rw-r--r--gcc/ada/contracts.adb12
1 files changed, 8 insertions, 4 deletions
diff --git a/gcc/ada/contracts.adb b/gcc/ada/contracts.adb
index 15b65ee..7625abf 100644
--- a/gcc/ada/contracts.adb
+++ b/gcc/ada/contracts.adb
@@ -334,7 +334,7 @@ package body Contracts is
if Is_OK_Classification then
Add_Classification;
- elsif Ekind (Id) in Access_Subprogram_Kind
+ elsif Ekind (Id) = E_Subprogram_Type
and then Prag_Nam in Name_Precondition
| Name_Postcondition
then
@@ -665,7 +665,10 @@ package body Contracts is
Freeze_Id : Entity_Id := Empty)
is
Items : constant Node_Id := Contract (Subp_Id);
- Subp_Decl : constant Node_Id := Unit_Declaration_Node (Subp_Id);
+ Subp_Decl : constant Node_Id :=
+ (if Ekind (Subp_Id) = E_Subprogram_Type
+ then Associated_Node_For_Itype (Subp_Id)
+ else Unit_Declaration_Node (Subp_Id));
Saved_SM : constant SPARK_Mode_Type := SPARK_Mode;
Saved_SMP : constant Node_Id := SPARK_Mode_Pragma;
@@ -1593,8 +1596,9 @@ package body Contracts is
-- Analyze Pre/Post on access-to-subprogram type
- if Is_Access_Subprogram_Type (Type_Id) then
- Analyze_Entry_Or_Subprogram_Contract (Type_Id);
+ if Ekind (Type_Id) in Access_Subprogram_Kind then
+ Analyze_Entry_Or_Subprogram_Contract
+ (Directly_Designated_Type (Type_Id));
end if;
end Analyze_Type_Contract;