--- gcc/ada/exp_aggr.adb +++ gcc/ada/exp_aggr.adb @@ -3103,6 +3103,13 @@ package body Exp_Aggr is Make_Selected_Component (Loc, Prefix => New_Copy_Tree (Lhs), Selector_Name => Make_Identifier (Loc, Chars (Expr)))); + + -- The generated code will be reanalyzed, but if the reference + -- to the discriminant appears within an already analyzed + -- expression (e.g. a conditional) we must set its proper entity + -- now. Context is an initialization procedure. + + Analyze (Expr); end if; return OK; --- /dev/null new file mode 100644 +++ gcc/testsuite/gnat.dg/discr58.adb @@ -0,0 +1,33 @@ +-- { dg-do compile } + +with Ada.Text_IO; use Ada.Text_IO; + +procedure Discr58 is + + type Field(Flag : Boolean := True) is record + case Flag is + when True => Param1 : Boolean := False; + when False => Param2 : Boolean := True; + end case; + end record; + + type Header(Flag : Boolean := True) is record + Param3 : Integer := 0; + Params : Field(Flag) := (if Flag = True then + (Flag => True, others => <>) + else + (Flag => False, others => <>)); + end record; + + type Message(Flag : Boolean) is record + + -- This assignment crashes GNAT + The_Header : Header(Flag) := Header'(Flag => True, others => <>); + end record; + + It : Message (True); +begin + Put_Line("Hello World"); + Put_Line (Boolean'Image (It.The_Header.Flag)); + Put_Line (Boolean'Image (It.The_Header.Params.Flag)); +end Discr58; \ No newline at end of file