Commit 7145d799 by Ed Schonberg Committed by Pierre-Marie de Rodat

[Ada] Spurious error on aggregate with choice that is predicted subtype

This patch fixes a spurious error on a record aggregate for a variant
record when a choice in the aggregate is given by a subtype with a
static predicate. The same expansion mechanism for such a variant, used
in case statements, must be used here as well.

2019-07-05  Ed Schonberg  <schonberg@adacore.com>

gcc/ada/

	* sem_util.adb (Encloing_Subprogram): If Enclosing_Dynamic_Scope
	is a loop, continue climbing the scope stack to find the
	enclosing subprogram.
	(Gather_Components): Handle properly a choice in a record
	aggregate that is given by a subtype with a static predicate.

gcc/testsuite/

	* gnat.dg/aggr25.adb, gnat.dg/aggr25.ads: New testcase.

From-SVN: r273112
parent de70d01f
2019-07-05 Ed Schonberg <schonberg@adacore.com>
* sem_util.adb (Encloing_Subprogram): If Enclosing_Dynamic_Scope
is a loop, continue climbing the scope stack to find the
enclosing subprogram.
(Gather_Components): Handle properly a choice in a record
aggregate that is given by a subtype with a static predicate.
2019-07-05 Javier Miranda <miranda@adacore.com> 2019-07-05 Javier Miranda <miranda@adacore.com>
* debug.adb (-gnatd.K): Leave available this switch. * debug.adb (-gnatd.K): Leave available this switch.
......
...@@ -6895,7 +6895,7 @@ package body Sem_Util is ...@@ -6895,7 +6895,7 @@ package body Sem_Util is
elsif Ekind (Dyn_Scop) = E_Subprogram_Body then elsif Ekind (Dyn_Scop) = E_Subprogram_Body then
return Corresponding_Spec (Parent (Parent (Dyn_Scop))); return Corresponding_Spec (Parent (Parent (Dyn_Scop)));
elsif Ekind_In (Dyn_Scop, E_Block, E_Return_Statement) then elsif Ekind_In (Dyn_Scop, E_Block, E_Return_Statement, E_Loop) then
return Enclosing_Subprogram (Dyn_Scop); return Enclosing_Subprogram (Dyn_Scop);
elsif Ekind (Dyn_Scop) = E_Entry then elsif Ekind (Dyn_Scop) = E_Entry then
...@@ -8939,6 +8939,12 @@ package body Sem_Util is ...@@ -8939,6 +8939,12 @@ package body Sem_Util is
begin begin
Find_Discrete_Value : while Present (Variant) loop Find_Discrete_Value : while Present (Variant) loop
-- If a choice is a subtype with a static predicate, it must
-- be rewritten as an explicit list of non-predicated choices.
Expand_Static_Predicates_In_Choices (Variant);
Discrete_Choice := First (Discrete_Choices (Variant)); Discrete_Choice := First (Discrete_Choices (Variant));
while Present (Discrete_Choice) loop while Present (Discrete_Choice) loop
exit Find_Discrete_Value when exit Find_Discrete_Value when
......
2019-07-05 Ed Schonberg <schonberg@adacore.com> 2019-07-05 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/aggr25.adb, gnat.dg/aggr25.ads: New testcase.
2019-07-05 Ed Schonberg <schonberg@adacore.com>
* gnat.dg/predicate7.adb, gnat.dg/predicate7.ads, * gnat.dg/predicate7.adb, gnat.dg/predicate7.ads,
gnat.dg/predicate7_pkg.ads: New testcase. gnat.dg/predicate7_pkg.ads: New testcase.
......
-- { dg-do compile }
package body Aggr25 is
procedure Foo is null;
end Aggr25;
package Aggr25 is
type T_A is (A, B , C ,D);
subtype Has_B_D is T_A with Static_Predicate => Has_B_D in B | D;
type Obj_T (Kind : T_A) is
record
case Kind is
--OK-- when A | C => null; --OK--
when Has_B_D => Value : Boolean;
--BAD-- when A | C => null;
when others => null;
end case;
end record;
type T is access Obj_T;
Unavailable : constant T := new Obj_T'(Kind => A);
procedure Foo;
end Aggr25;
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment