aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Squirek <squirek@adacore.com>2020-12-03 10:06:26 -0500
committerPierre-Marie de Rodat <derodat@adacore.com>2020-12-17 05:49:21 -0500
commitf6219730a1ac4a24cbbc2428e3f30e1b11abe1e8 (patch)
tree935f358a32c8fd555795a481dde3fc512a686bbb
parent383814537116f6a3c5c08aa9a9069fb9f438d52c (diff)
downloadgcc-f6219730a1ac4a24cbbc2428e3f30e1b11abe1e8.zip
gcc-f6219730a1ac4a24cbbc2428e3f30e1b11abe1e8.tar.gz
gcc-f6219730a1ac4a24cbbc2428e3f30e1b11abe1e8.tar.bz2
[Ada] Crash on discriminant check with current instance
gcc/ada/ * checks.adb (Build_Discriminant_Checks): Add condition to replace references to the current instance of the type when we are within an Init_Proc. (Replace_Current_Instance): Examine a given node and replace the current instance of the type with the corresponding _init formal. (Search_And_Replace_Current_Instance): Traverse proc which calls Replace_Current_Instance in order to replace all references within a given expression.
-rw-r--r--gcc/ada/checks.adb34
1 files changed, 34 insertions, 0 deletions
diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb
index f475710..891c4c8 100644
--- a/gcc/ada/checks.adb
+++ b/gcc/ada/checks.adb
@@ -3922,6 +3922,13 @@ package body Checks is
function Aggregate_Discriminant_Val (Disc : Entity_Id) return Node_Id;
+ function Replace_Current_Instance
+ (N : Node_Id) return Traverse_Result;
+ -- Replace a reference to the current instance of the type with the
+ -- corresponding _init formal of the initialization procedure. Note:
+ -- this function relies on us currently being within the initialization
+ -- procedure.
+
--------------------------------
-- Aggregate_Discriminant_Val --
--------------------------------
@@ -3949,6 +3956,26 @@ package body Checks is
raise Program_Error;
end Aggregate_Discriminant_Val;
+ ------------------------------
+ -- Replace_Current_Instance --
+ ------------------------------
+
+ function Replace_Current_Instance
+ (N : Node_Id) return Traverse_Result is
+ begin
+ if Is_Entity_Name (N)
+ and then Etype (N) = Entity (N)
+ then
+ Rewrite (N,
+ New_Occurrence_Of (First_Formal (Current_Subprogram), Loc));
+ end if;
+
+ return OK;
+ end Replace_Current_Instance;
+
+ procedure Search_And_Replace_Current_Instance is new
+ Traverse_Proc (Replace_Current_Instance);
+
-- Start of processing for Build_Discriminant_Checks
begin
@@ -3978,6 +4005,13 @@ package body Checks is
Dval := Duplicate_Subexpr_No_Checks (Dval);
end if;
+ -- Replace references to the current instance of the type with the
+ -- corresponding _init formal of the initialization procedure.
+
+ if Within_Init_Proc then
+ Search_And_Replace_Current_Instance (Dval);
+ end if;
+
-- If we have an Unchecked_Union node, we can infer the discriminants
-- of the node.