diff options
author | Gary Dismukes <dismukes@adacore.com> | 2025-03-22 00:01:52 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@adacore.com> | 2025-06-10 11:00:12 +0200 |
commit | a35f642d231baa62d6b28e5e5aaf3cc30425552c (patch) | |
tree | 8a037402f2c919ea3c23fcea32bb76f173d800d5 /gcc | |
parent | e249cec1ac9957a1e0d064104014f9c4c339d2d6 (diff) | |
download | gcc-a35f642d231baa62d6b28e5e5aaf3cc30425552c.zip gcc-a35f642d231baa62d6b28e5e5aaf3cc30425552c.tar.gz gcc-a35f642d231baa62d6b28e5e5aaf3cc30425552c.tar.bz2 |
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.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ada/einfo.ads | 2 | ||||
-rw-r--r-- | 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 f154e7f..7c05e53 100644 --- a/gcc/ada/einfo.ads +++ b/gcc/ada/einfo.ads @@ -1623,7 +1623,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 3399a41..c81b563 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 |