aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorGary Dismukes <dismukes@adacore.com>2025-03-22 00:01:52 +0000
committerEric Botcazou <ebotcazou@adacore.com>2025-06-10 11:00:12 +0200
commita35f642d231baa62d6b28e5e5aaf3cc30425552c (patch)
tree8a037402f2c919ea3c23fcea32bb76f173d800d5 /gcc
parente249cec1ac9957a1e0d064104014f9c4c339d2d6 (diff)
downloadgcc-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.ads2
-rw-r--r--gcc/ada/sem_case.adb8
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