https://gcc.gnu.org/g:31bd253c363e61f14eb7a530e0d6824beb72ca9c
commit r16-1383-g31bd253c363e61f14eb7a530e0d6824beb72ca9c Author: Gary Dismukes <dismu...@adacore.com> Date: Sat Mar 22 00:01:52 2025 +0000 ada: Error on subtype with static predicate used in case_expression The compiler improperly flags an error on the use of a subtype with a static predicate as a choice in a case expression alternative, complaining that the subtype has a nonstatic predicate. The fix for this is to add a test for the subtype not having a static predicate. gcc/ada/ChangeLog: * einfo.ads: Revise comment about Dynamic_Predicate flag to make it more accurate. * sem_case.adb (Check_Choices): Test "not Has_Static_Predicate_Aspect" as additional guard for error about use of subtype with nonstatic predicate as a case choice. Improve related error message. Diff: --- gcc/ada/einfo.ads | 2 +- gcc/ada/sem_case.adb | 8 +++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gcc/ada/einfo.ads b/gcc/ada/einfo.ads index f1e18a385bad..e529a64e0f67 100644 --- a/gcc/ada/einfo.ads +++ b/gcc/ada/einfo.ads @@ -1606,7 +1606,7 @@ package Einfo is -- Has_Dynamic_Predicate_Aspect -- Defined in all types and subtypes. Set if a Dynamic_Predicate aspect --- was explicitly applied to the type. Generally we treat predicates as +-- was applied to the type or subtype. Generally we treat predicates as -- static if possible, regardless of whether they are specified using -- Predicate, Static_Predicate, or Dynamic_Predicate. And if a predicate -- can be treated as static (i.e. its expression is predicate-static), diff --git a/gcc/ada/sem_case.adb b/gcc/ada/sem_case.adb index 3399a41343e8..c81b56337f6a 100644 --- a/gcc/ada/sem_case.adb +++ b/gcc/ada/sem_case.adb @@ -3684,13 +3684,15 @@ package body Sem_Case is -- Use of nonstatic predicate is an error if not Is_Discrete_Type (E) - or else not Has_Static_Predicate (E) + or else (not Has_Static_Predicate (E) + and then + not Has_Static_Predicate_Aspect (E)) or else Has_Dynamic_Predicate_Aspect (E) or else Has_Ghost_Predicate_Aspect (E) then Bad_Predicated_Subtype_Use - ("cannot use subtype& with non-static " - & "predicate as case alternative", + ("cannot use subtype& with nonstatic " + & "predicate as choice in case alternative", Choice, E, Suggest_Static => True); -- Static predicate case. The bounds are those of