From: Eric Botcazou <ebotca...@adacore.com> The problem is that the predicated subtype does not inherit all the required attributes of a string subtype with a static predicate.
gcc/ada/ * sem_ch3.adb (Analyze_Subtype_Declaration): Remove a short-circuit for subtypes without aspects when it comes to predicates. * sem_util.adb (Inherit_Predicate_Flags): Deal with private subtypes whose full view is an Itype. Tested on x86_64-pc-linux-gnu, committed on master. --- gcc/ada/sem_ch3.adb | 11 ++--------- gcc/ada/sem_util.adb | 7 ++++++- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/gcc/ada/sem_ch3.adb b/gcc/ada/sem_ch3.adb index 33d8f116bc2..a6bc8c95cd2 100644 --- a/gcc/ada/sem_ch3.adb +++ b/gcc/ada/sem_ch3.adb @@ -6032,17 +6032,10 @@ package body Sem_Ch3 is -- If this is a subtype declaration for an actual in an instance, -- inherit static and dynamic predicates if any. - -- If declaration has no aspect specifications, inherit predicate - -- info as well. Unclear how to handle the case of both specified - -- and inherited predicates ??? Other inherited aspects, such as - -- invariants, should be OK, but the combination with later pragmas - -- may also require special merging. - if Has_Predicates (T) and then Present (Predicate_Function (T)) - and then - ((In_Instance and then not Comes_From_Source (N)) - or else No (Aspect_Specifications (N))) + and then In_Instance + and then not Comes_From_Source (N) then -- Inherit Subprograms_For_Type from the full view, if present diff --git a/gcc/ada/sem_util.adb b/gcc/ada/sem_util.adb index 791fa7bc12e..9cff9e1be16 100644 --- a/gcc/ada/sem_util.adb +++ b/gcc/ada/sem_util.adb @@ -14531,11 +14531,16 @@ package body Sem_Util is -- A named subtype does not inherit the predicate function of its -- parent but an itype declared for a loop index needs the discrete -- predicate information of its parent to execute the loop properly. + -- Moreover, a named private subtype whose full view is an itype also + -- needs to inherit a predicate function because it will not be frozen. -- A non-discrete type may has a static predicate (for example True) -- but has no static_discrete_predicate. if not Only_Flags - and then Is_Itype (Subt) + and then (Is_Itype (Subt) + or else (Ekind (Subt) = E_Private_Subtype + and then Present (Full_View (Subt)) + and then Is_Itype (Full_View (Subt)))) and then Present (Predicate_Function (Par)) then Set_Subprograms_For_Type (Subt, Subprograms_For_Type (Par)); -- 2.43.0