aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/einfo-utils.adb
diff options
context:
space:
mode:
authorSteve Baird <baird@adacore.com>2022-04-04 17:52:11 -0700
committerPierre-Marie de Rodat <derodat@adacore.com>2022-05-19 14:05:30 +0000
commit55a11c7e345dd06d6975fe8f4dc0e11ecbb581ff (patch)
tree1b1faa1b7ab2504a80b5417053e7b869a3b0508b /gcc/ada/einfo-utils.adb
parent8be71a90b15916a966553c47857e1579ca22d507 (diff)
downloadgcc-55a11c7e345dd06d6975fe8f4dc0e11ecbb581ff.zip
gcc-55a11c7e345dd06d6975fe8f4dc0e11ecbb581ff.tar.gz
gcc-55a11c7e345dd06d6975fe8f4dc0e11ecbb581ff.tar.bz2
[Ada] Fix bug in handling of Predicate_Failure aspect
The run-time behavior of the Ada 2022 Predicate_Failure aspect was incorrectly implemented. This could cause incorrect exception messages at execution time in the case of a predicate check failure, as demonstrated by ACATS test C324006. In addition, a new attribute (Predicate_Expression) is defined in order to improve the FE/SPARK interface. gcc/ada/ * einfo-utils.ads, einfo-utils.adb: Delete Predicate_Function_M function and Set_Predicate_Function_M procedure. * einfo.ads: Delete comments for Is_Predicate_Function_M and Predicate_Function_M functions. Add comment for new Predicate_Expression function. Update comment describing predicate functions. * exp_util.ads, exp_util.adb (Make_Predicate_Call): Replace Mem formal parameter with Static_Mem and Dynamic_Mem formals. (Make_Predicate_Check): Delete Add_Failure_Expression and call to it. * exp_ch4.adb (Expand_N_In.Predicate_Check): Update Make_Predicate_Call call to match profile change. * gen_il-fields.ads: Delete Is_Predicate_Function_M field, add Predicate_Expression field. * gen_il-gen-gen_entities.adb: Delete Is_Predicate_Function_M use, add Predicate_Expression use. * sem_ch13.adb (Build_Predicate_Functions): Rename as singular, not plural; we no longer build a Predicate_M function. Delete Predicate_M references. Add new Boolean parameter for predicate functions when needed. Restructure body of generated predicate functions to implement required Predicate_Failure behavior and to set new Predicate_Expression attribute. Remove special treatment of raise expressions within predicate expressions. * sem_util.ads (Predicate_Failure_Expression, Predicate_Function_Needs_Membership_Parameter): New functions. * sem_util.adb (Is_Current_Instance): Fix bugs which caused wrong result. (Is_Current_Instance_Reference_In_Type_Aspect): Delete Is_Predicate_Function_M reference. (Predicate_Failure_Expression): New function. (Propagate_Predicate_Attributes): Delete Is_Predicate_Function_M references.
Diffstat (limited to 'gcc/ada/einfo-utils.adb')
-rw-r--r--gcc/ada/einfo-utils.adb84
1 files changed, 0 insertions, 84 deletions
diff --git a/gcc/ada/einfo-utils.adb b/gcc/ada/einfo-utils.adb
index cf61ec7..48a1bce 100644
--- a/gcc/ada/einfo-utils.adb
+++ b/gcc/ada/einfo-utils.adb
@@ -2390,53 +2390,6 @@ package body Einfo.Utils is
return Empty;
end Predicate_Function;
- --------------------------
- -- Predicate_Function_M --
- --------------------------
-
- function Predicate_Function_M (Id : E) return E is
- Subp_Elmt : Elmt_Id;
- Subp_Id : Entity_Id;
- Subps : Elist_Id;
- Typ : Entity_Id;
-
- begin
- pragma Assert (Is_Type (Id));
-
- -- If type is private and has a completion, predicate may be defined on
- -- the full view.
-
- if Is_Private_Type (Id)
- and then
- (not Has_Predicates (Id) or else No (Subprograms_For_Type (Id)))
- and then Present (Full_View (Id))
- then
- Typ := Full_View (Id);
-
- else
- Typ := Id;
- end if;
-
- Subps := Subprograms_For_Type (Typ);
-
- if Present (Subps) then
- Subp_Elmt := First_Elmt (Subps);
- while Present (Subp_Elmt) loop
- Subp_Id := Node (Subp_Elmt);
-
- if Ekind (Subp_Id) = E_Function
- and then Is_Predicate_Function_M (Subp_Id)
- then
- return Subp_Id;
- end if;
-
- Next_Elmt (Subp_Elmt);
- end loop;
- end if;
-
- return Empty;
- end Predicate_Function_M;
-
-------------------------
-- Present_In_Rep_Item --
-------------------------
@@ -2879,43 +2832,6 @@ package body Einfo.Utils is
end loop;
end Set_Predicate_Function;
- ------------------------------
- -- Set_Predicate_Function_M --
- ------------------------------
-
- procedure Set_Predicate_Function_M (Id : E; V : E) is
- Subp_Elmt : Elmt_Id;
- Subp_Id : Entity_Id;
- Subps : Elist_Id;
-
- begin
- pragma Assert (Is_Type (Id) and then Has_Predicates (Id));
-
- Subps := Subprograms_For_Type (Id);
-
- if No (Subps) then
- Subps := New_Elmt_List;
- Set_Subprograms_For_Type (Id, Subps);
- end if;
-
- Subp_Elmt := First_Elmt (Subps);
- Prepend_Elmt (V, Subps);
-
- -- Check for a duplicate predication function
-
- while Present (Subp_Elmt) loop
- Subp_Id := Node (Subp_Elmt);
-
- if Ekind (Subp_Id) = E_Function
- and then Is_Predicate_Function_M (Subp_Id)
- then
- raise Program_Error;
- end if;
-
- Next_Elmt (Subp_Elmt);
- end loop;
- end Set_Predicate_Function_M;
-
-----------------
-- Size_Clause --
-----------------