aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2022-12-08 23:21:58 +0100
committerMarc Poulhiès <poulhies@adacore.com>2023-01-03 10:29:53 +0100
commit32841e7e8480cb16d34f60feda226e4f582c3186 (patch)
tree60d866e4fd81c68f950a4ddddc5c912cd589cdf2 /gcc
parentbfe1ab222a8095b31c29d8f3530268f048fea00f (diff)
downloadgcc-32841e7e8480cb16d34f60feda226e4f582c3186.zip
gcc-32841e7e8480cb16d34f60feda226e4f582c3186.tar.gz
gcc-32841e7e8480cb16d34f60feda226e4f582c3186.tar.bz2
ada: Make Apply_Discriminant_Check.Denotes_Explicit_Dereference more robust
The predicate implements the rules of the language so it needs to cope with constructs rewritten by the expander, in particular explicit dereferences that the expander uses liberally for various purposes. This change makes the detection of rewritten calls more robust and adds the detection of rewritten return objects. gcc/ada/ * checks.adb (Apply_Discriminant_Check.Denotes_Explicit_Dereference): Return false for artificial dereferences generated by the expander.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/checks.adb28
1 files changed, 18 insertions, 10 deletions
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb
index 5833be3..d518e67 100644
--- a/gcc/ada/checks.adb
+++ b/gcc/ada/checks.adb
@@ -1388,13 +1388,23 @@ package body Checks is
function Denotes_Explicit_Dereference (Obj : Node_Id) return Boolean is
begin
- return
- Nkind (Obj) = N_Explicit_Dereference
- or else
- (Is_Entity_Name (Obj)
- and then Present (Renamed_Object (Entity (Obj)))
- and then Nkind (Renamed_Object (Entity (Obj))) =
- N_Explicit_Dereference);
+ if Is_Entity_Name (Obj) then
+ return Present (Renamed_Object (Entity (Obj)))
+ and then
+ Denotes_Explicit_Dereference (Renamed_Object (Entity (Obj)));
+
+ -- This routine uses the rules of the language so we need to exclude
+ -- rewritten constructs that introduce artificial dereferences.
+
+ elsif Nkind (Obj) = N_Explicit_Dereference then
+ return not Is_Captured_Function_Call (Obj)
+ and then not
+ (Nkind (Parent (Obj)) = N_Object_Renaming_Declaration
+ and then Is_Return_Object (Defining_Entity (Parent (Obj))));
+
+ else
+ return False;
+ end if;
end Denotes_Explicit_Dereference;
----------------------------------------
@@ -1497,9 +1507,7 @@ package body Checks is
and then not Is_Aliased_Unconstrained_Component)
or else (Ada_Version >= Ada_2005
and then not Is_Constrained (T_Typ)
- and then Denotes_Explicit_Dereference (Lhs)
- and then Nkind (Original_Node (Lhs)) /=
- N_Function_Call))
+ and then Denotes_Explicit_Dereference (Lhs)))
then
T_Typ := Get_Actual_Subtype (Lhs);
end if;