--- ai05s/ai05-0297-1.txt 2012/03/14 00:17:44 1.1 +++ ai05s/ai05-0297-1.txt 2012/03/15 03:21:38 1.2 @@ -1,4 +1,4 @@ -!standard 3.5.5(7) 12-02-26 AI05-0297-1/01 +!standard 3.5.5(7) 12-03-13 AI05-0297-1/02 !class Amendment 12-02-26 !status Amendment 2012 12-02-26 !status ARG Approved 8-1-1 12-02-26 @@ -33,31 +33,44 @@ !wording -Change section name of 13.9.2 from - The Valid Attribute -to - Validity Attributes +Add after 3.5.5(7) (i.e. at the end of the existing Static Semantics section): -Add after 13.9.2(13.c/2) (i.e. at the end of the existing Static Semantics section): + For every static discrete subtype S for which there exists at least + one value belonging to S that satisfies any predicate of S, the + following attributes are defined: - For each static discrete subtype S for which there exists at least - one value belonging to S, the following attributes - are defined: - S'First_Valid - S'First_Valid denotes the smallest value that belongs to S. + S'First_Valid denotes the smallest value that belongs to S and + satisfies any predicate of S. The value of this attribute is of the type of S. S'Last_Valid - S'Last_Valid denotes the largest value that belongs to S. + S'Last_Valid denotes the largest value that belongs to S and + satisfies any predicate of S. The value of this attribute is of the type of S. + + [Redundant: First_Valid and Last_Valid attribute_references are always static + expressions. Any predicate of S is always a static predicate.] - Redundant: - First_Valid and Last_Valid attribute values are always static. + AARM Reason: + We require there to be at least one value so that these are always values of + the subtype. (This sidesteps the question of what to return for a subtype + with no values.) - AARM note: + AARM discussion: These attributes are intended primarily for use in the case - where the Static_Predicate aspect of S has been specified. + where the Static_Predicate aspect of S has been specified; First and Last + are equivalent if these are allowed and there is no predicate. + +Add an AARM Note after 3.2.4(18/3): + This is to prevent confusion about whether the + First value is the lowest value of the subtype (which does not depend on the + predicate) or the lowest value of the subtype which meets the predicate. + (For a dynamic predicate, determining this latter value is expensive as it + would usually require a loop.) For a static subtype that has a static + predicate, the First_Valid and Last_Valid attributes (see 3.5.5) can be + used instead. + !discussion One could imagine defining these attributes for nonstatic subtypes but we always want @@ -71,6 +84,37 @@ a separate legality rule that the attribute prefix must denote a subtype which has at least one value. +---- + +The idea of the naming of these attributes is that they return the smallest (largest) value +for which Obj'Valid would be True (that is, the smallest (largest) valid value). + +---- + +Note that the requirement that the prefix of these attributes be static prevents them from +ever being used on a subtype descended from a generic formal type (these are never static). + +!corrigendum 3.5.5(7) + +@dinsa +@xindent<This function returns a value of the type of S whose position number equals the +value of @i<Arg>. For the evaluation of a call on S'Val, if there is no value in the base +range of its type with the given position number, Constraint_Error is raised.> +@dinss +For every static discrete subtype S for which there exists at least +one value belonging to S that satisfies any predicate of S, the +following attributes are defined: + +@xhang<@xterm<S'First_Valid> +S'First_Valid denotes the smallest value that belongs to S and +satisfies any predicate of S. The value of this attribute is of the type of S.> +@xhang<@xterm<S'Last_Valid> +S'Last_Valid denotes the largest value that belongs to S and +satisfies any predicate of S. The value of this attribute is of the type of S.> + +First_Valid and Last_Valid attribute_references are always static +expressions. Any predicate of S is always a static predicate. + !ACATS Test An ACATS C-Test should be created to test these attributes, especially in the Static_Predicate @@ -157,7 +201,8 @@ Aside: while 'Last (or 'Max) is well-defined even for dynamic predicates, we would not want to support that because it could be very expensive. Consider: - subtype Power_of_Two is Long_Long_Integer with Dynamic_Predicate => Is_Power_of_Two (Power_of_Two); + subtype Power_of_Two is Long_Long_Integer + with Dynamic_Predicate => Is_Power_of_Two (Power_of_Two); Assume that Long_Long_Integer'Last is (2**127)-1. In that case, Power_of_Two'Last (or Max) = 2**126. But to figure that out, you would need a loop that goes from Long_Long_Integer'Last down until the predicate is True - @@ -601,5 +646,68 @@ > that works? :-) Yes, I see. We find a bug, and we thereby open Pandora's Box. ;-) + +**************************************************************** + +From: Randy Brukardt +Sent: Tuesday, March 13, 2012 7:11 PM + +(Please Bob, forget the "I told you so" - Randy). + +I'm afraid that we were so focused on the names of these attributes that we never +bothered to check the actual wording. (And I put it into the standard draft before +I realized that it is complete junk.) + +Steve proposed: + + For every static discrete subtype S for which there exists at least + one value belonging to S, the following attributes + are defined: + + S'First_Valid + S'First_Valid denotes the smallest value that belongs to S. + The value of this attribute is of the type of S. + S'Last_Valid + S'Last_Valid denotes the largest value that belongs to S. + The value of this attribute is of the type of S. + +The problem with this is that predicates don't modify the value set of a subtype, and they don't +have any effect on the "belongs" relationship. Just look at 4.5.2(29/3): + + The membership_choice is a subtype_mark, the tested type is scalar, the value of the + simple_expression belongs to the range of the named subtype, and the predicate of the named + subtype evaluates to True. + +So the problem is that both the lead-in and the definitions are completely wrong. + +The problem with the lead-in is that just because there is "one value belonging to S" doesn't +mean that there are any values that satisfy the predicate (and that's the point). The problem +with the bullets is that they don't mention the predicates. + +The fix is fairly easy, I think (hope?): + + For every static discrete subtype S for which there exists at least + one value belonging to S {that satisfies any predicate of S}, the following attributes + are defined: + + S'First_Valid + S'First_Valid denotes the smallest value that belongs to S {and + satisfies any predicate of S}. The value of this attribute is of the type of S. + S'Last_Valid + S'Last_Valid denotes the largest value that belongs to S {and + satisfies any predicate of S}. The value of this attribute is of the type of S. + +**************************************************************** + +From: Tucker Taft +Sent: Tuesday, March 13, 2012 8:30 PM + +Good catch. + +I think we all just believed that "belong" took static predicates into account, but alas, +I think we argued with ourselves about that for a long time and ultimately decided it +shouldn't. + +I don't remember all the reasons, but they are too late to reexamine at this point... ****************************************************************

Questions? Ask the ACAA Technical Agent