diff mbox series

[Ada] Refine patch for spurious link error involving discriminated types

Message ID 20210921152558.GA3094503@adacore.com
State New
Headers show
Series [Ada] Refine patch for spurious link error involving discriminated types | expand

Commit Message

Pierre-Marie de Rodat Sept. 21, 2021, 3:25 p.m. UTC
This patch handles properly the case of a Component_Definition appearing
in a Component_Declaration.

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

gcc/ada/

	* sem_ch3.adb (Process_Discriminant_Expressions): If the
	constraint is for a Component_Definition that appears in a
	Component_Declaration, the entity to be used to create the
	potentially global symbol is the Defining_Identifier of the
	Component_Declaration.
diff mbox series

Patch

diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb
--- a/gcc/ada/sem_ch3.adb
+++ b/gcc/ada/sem_ch3.adb
@@ -10502,13 +10502,30 @@  package body Sem_Ch3 is
                if Expander_Active
                  and then Comes_From_Source (Def)
                  and then not Is_Subprogram (Current_Scope)
-                 and then Nkind (Parent (Def)) in
-                   N_Object_Declaration | N_Component_Declaration
                then
-                  Force_Evaluation (
-                    Discr_Expr (J),
-                    Related_Id => Defining_Identifier (Parent (Def)),
-                    Discr_Number => J);
+                  declare
+                     Id : Entity_Id := Empty;
+                  begin
+                     if Nkind (Parent (Def)) = N_Object_Declaration then
+                        Id := Defining_Identifier (Parent (Def));
+
+                     elsif Nkind (Parent (Def)) = N_Component_Definition
+                       and then
+                         Nkind (Parent (Parent (Def)))
+                            = N_Component_Declaration
+                     then
+                        Id := Defining_Identifier (Parent (Parent (Def)));
+                     end if;
+
+                     if Present (Id) then
+                        Force_Evaluation (
+                          Discr_Expr (J),
+                          Related_Id => Id,
+                          Discr_Number => J);
+                     else
+                        Force_Evaluation (Discr_Expr (J));
+                     end if;
+                  end;
                else
                   Force_Evaluation (Discr_Expr (J));
                end if;