[Ada] Fix recent regression on _Master declaration
authorJavier Miranda <miranda@adacore.com>
Fri, 22 May 2020 19:29:57 +0000 (15:29 -0400)
committerPierre-Marie de Rodat <derodat@adacore.com>
Wed, 8 Jul 2020 14:55:55 +0000 (10:55 -0400)
gcc/ada/

* exp_ch9.adb
(Build_Class_Wide_Master): Insert the declaration of _Master
before its use; required to avoid assertion failure in the
backend.

gcc/ada/exp_ch9.adb

index 70fdf1d1851d3aedd74cf2e412202c63139235f1..c4b98822684eed669dbd248587a29bbbd81d595b 100644 (file)
@@ -1215,10 +1215,21 @@ package body Exp_Ch9 is
       if not Has_Master_Entity (Master_Scope)
         or else No (Current_Entity_In_Scope (Name_Id))
       then
+         declare
+            Ins_Nod : Node_Id;
+
          begin
             Set_Has_Master_Entity (Master_Scope);
             Master_Decl := Build_Master_Declaration (Loc);
-            Insert_Action (Find_Hook_Context (Related_Node), Master_Decl);
+
+            --  Ensure that the master declaration is placed before its use
+
+            Ins_Nod := Find_Hook_Context (Related_Node);
+            while not Is_List_Member (Ins_Nod) loop
+               Ins_Nod := Parent (Ins_Nod);
+            end loop;
+
+            Insert_Before (First (List_Containing (Ins_Nod)), Master_Decl);
             Analyze (Master_Decl);
 
             --  Mark the containing scope as a task master. Masters associated