[Ada] Fix ALI source location for dominance markers

Message ID 20210616084355.GA95226@adacore.com
State New
Headers show
Series
  • [Ada] Fix ALI source location for dominance markers
Related show

Commit Message

Pierre-Marie de Rodat June 16, 2021, 8:43 a.m.
As First_Sloc is used to compute source location for entry guards, it
must be also used to compute the dominance marker source location in
this particular case (when a statement is dominated by an entry guard).

Tested on x86_64-pc-linux-gnu, committed on trunk

gcc/ada/

	* par_sco.adb (Set_Statement_Entry): Change sloc for dominance
	marker.
	(Traverse_One): Fix typo.
	(Output_Header): Fix comment.

Patch

diff --git a/gcc/ada/par_sco.adb b/gcc/ada/par_sco.adb
--- a/gcc/ada/par_sco.adb
+++ b/gcc/ada/par_sco.adb
@@ -683,9 +683,12 @@  package body Par_SCO is
                --  two levels (through the pragma argument association) to
                --  get to the pragma node itself. For the guard on a select
                --  alternative, we do not have access to the token location for
-               --  the WHEN, so we use the first sloc of the condition itself
-               --  (note: we use First_Sloc, not Sloc, because this is what is
-               --  referenced by dominance markers).
+               --  the WHEN, so we use the first sloc of the condition itself.
+               --  First_Sloc gives the most sensible result, but we have to
+               --  beware of also using it when computing the dominance marker
+               --  sloc (in the Set_Statement_Entry procedure), as this is not
+               --  fully equivalent to the "To" sloc computed by
+               --  Sloc_Range (Guard, To, From).
 
                --  Doesn't this requirement of using First_Sloc need to be
                --  documented in the spec ???
@@ -1579,6 +1582,18 @@  package body Par_SCO is
                         To := No_Location;
                      end if;
 
+                     --  Be consistent with the location determined in
+                     --  Output_Header.
+
+                     if Current_Dominant.K = 'T'
+                        and then Nkind (Parent (Current_Dominant.N))
+                                   in N_Accept_Alternative
+                                    | N_Delay_Alternative
+                                    | N_Terminate_Alternative
+                     then
+                        From := First_Sloc (Current_Dominant.N);
+                     end if;
+
                      Set_Raw_Table_Entry
                        (C1                 => '>',
                         C2                 => Current_Dominant.K,
@@ -1867,7 +1882,7 @@  package body Par_SCO is
                      Process_Decisions_Defer (Cond, 'G');
 
                      --  For an entry body with a barrier, the entry body
-                     --  is dominanted by a True evaluation of the barrier.
+                     --  is dominated by a True evaluation of the barrier.
 
                      Inner_Dominant := ('T', N);
                   end if;