"J-P. Rosen" wrote in message news:p71rvj$vgh$1@gioia.aioe.org... > Le 26/02/2018 à 17:26, Mehdi Saada a écrit : >> Hello. >> >> I would like an constrained String subtype with narrower bounds that >> Positive'Range. >> How can I do something like: >> subtype Possible_Length is NATURAL range 1..80; >> subtype T_Line is String (Possible_Length range <>); >> ? I know "range <>" isn't included in the definition of >> "range_constraint". How can I express the same thing. >> So that I can get after, a dynamic string with: >> A: access T_LINE := new T_LINE'("BLABLABLA"); while checking for its >> range. >> > You can't do that, because a subtype can't be both constrained and > unconstrainde at the same time... > > OTOH, you can define your own string type: > type Short_String is array (Possible_length range <>) of character; Or you could use a subtype with a dynamic predicate: subtype Short_String is String with Dynamic_Predicate => Short_String'First >= Possible_Length'First and Short_String'Last <= Possible_Length'Last; This would be checked any time that you convert a string value into a Short_String subtype (explicitly or implicitly), so it probably would give the right effect. Note that unlike a real constraint, it wouldn't have any effect on other subtypes, so: Silly_Object : Short_String (1..100); would not raise Constraint_Error, but any attempt to assign into it would raise Assertion_Error. (Assuming the Assertion_Policy is Check, it isn't for GNAT by default.) Randy.