CVS difference for ai05s/ai05-0144-2.txt

Differences between 1.7 and version 1.8
Log of other versions for file ai05s/ai05-0144-2.txt

--- ai05s/ai05-0144-2.txt	2010/04/24 05:59:35	1.7
+++ ai05s/ai05-0144-2.txt	2010/05/04 03:44:13	1.8
@@ -1,4 +1,4 @@
-!standard 6.02 (11)                                 10-04-23  AI05-0144-2/05
+!standard 6.02 (11)                                 10-05-03  AI05-0144-2/06
 !class Amendment 09-06-07
 !status Amendment 2012 10-04-23
 !status ARG Approved  5-0-4  10-02-26
@@ -38,63 +38,83 @@
 
 Add after 6.2(11):
 
-Two names or prefixes, N1 and N2, are *known to denote the same object* if:
+Two names are *known to denote the same object* if:
 
-  * N1 statically denotes a part of a stand-alone object or parameter, and
-    N2 statically denotes the same part of the same stand-alone object or
-    parameter; or
-
-  * N1 is a selected_component P1.C1 that represents a component, N2 is a
-    selected_component P2.C2 that represents a component, selectors C1
-    and C2 are the same, and prefixes P1 and P2 are known to denote the
-    same object; or
-
-  * N1 is a dereference (implicit or explicit) of P1, N2 is a dereference
-    (implicit or explicit) of P2, and prefixes P1 and P2 are known to denote
-    the same object; or
-
-  * N1 is an indexed_component P1(I1,...), N2 is an indexed_component
-    P2(I2,...), the prefix P1 is known to denote the same object as the
-    prefix P2, and for each index of the indexed_component, I1 and I2 are
-    static expressions with the same value, or I1 and I2 are names that
-    are known to denote the same object; or
+  * both names statically denote the same stand-alone object
+    or parameter; or
 
-  * N1 and N2 are slices, their prefixes are known to denote the
+  * both names are selected_components, their prefixes are known to
+    denote the same object, and their selector_names denote the
+    same component; or
+
+  * both names are dereferences (implicit or explicit), the
+    dereferenced names are known to denote the same object,
+    and both names have the same immediately enclosing statement or
+    declaration; or
+
+AARM Reason: We need the requirement to have the same enclosing statement in order
+to avoid problems with renames. Consider:
+
+      type Ref is access Some_Type;
+      Ptr : Ref := new Some_Type'(...);
+      X : Some_Type renames Ptr.all;
+   begin
+      Ptr := new Some_Type'(...);
+      P (Func_With_Out_Params (Ptr.all, X));
+
+X and Ptr.all should not be known to denote the same object, since they denote different
+allocated objects.
+End AARM Reason.
+
+  * both names are indexed_components, their prefixes are known
+    to denote the same object, and each of the pairs of corresponding
+    index values are either static expressions with the same value
+    or names that are known to denote the same object; or
+
+  * both names are slices, their prefixes are known to denote the
     same object, and the two slices have statically matching
     index constraints; or
+
+  * one of the two names statically denotes a renaming declaration
+    whose renamed object_name is known to denote the same object
+    as the other name; or
+
+AARM Reason: This exposes known renamings of slices, indexing, and so on
+to this definition. In particular, if we have
+   C : Character renames S(1);
+then C and S(1) are known to denote the same object.
+End AARM Reason.
+
+    * both names are known to denote the same object as a third name.
+
+AARM Reason: "Known to denote the same object" is intended to be an equivalence
+relationship, that is, it is reflexive, symmetric, and transitive. This last bullet
+is needed to make the relationship transitive. For instance, given the following
+declarations:
+     S   : String(1..10);
+     ONE : constant Natural := 1;
+     R   : Character renames S(1);
+the names R and S(1) are known to denote the same object by the sixth bullet, and
+S(1) and S(ONE) are known to denote the same object by the fourth bullet, but we need
+the last bullet for R and S(ONE) to be known to denote the same object.
+END AARM Reason. 
 
-  * N2 is a slice whose prefix is known to denote the same object as N1, and
-    the index constraint of N2 statically matches the constraint
-    N1'First .. N1'Last; or
-
-  * N1 is a slice whose prefix is known to denote the same object as N2, and
-    the index constraint of N1 statically matches the constraint
-    N2'First .. N2'Last.
 
     AARM Discussion: Whether or not names or prefixes are known to denote the
     same object is determined statically. If the name contains some dynamic
     portion other than a dereference, indexed_component, or
     slice, it is not "known to denote the same object".
 
-    These rules make no attempt to handle overlapping slices or slices constrained
-    for objects that are known to denote the same object.
-
-    These rules are intended to be symmetric: if A is known to denote the same object
-    as B, then reverse is also true.
+    These rules make no attempt to handle slices of objects that are known to be
+    the same when the slices have dynamic bounds (other than the trivial case of
+    bounds being defined by the same subtype), even when the bounds could be proven to be the
+    same, as it is just too complex to get right and these rules are intended to be
+    conservative.
     End AARM Discussion.
-
-For the purpose of evaluating these rules, if N denotes a visible renaming of name R,
-R shall be used in the rules instead of N.
 
-   AARM Reason: This exposes known renamings of slices, indexing, and the like to this
-   definition. In particular, if we have
-      C : Character renames S(1);
-   then C and S(1) are known to denote the same object, as S(1) would replace C when
-   evaluating the rules.
-
-Two names N1 and N2 are *known to refer to the same object* if N1 and N2
-are known to denote the same object, or if N1 is known to denote a
-subcomponent of the object denoted by N2, or vice-versa.
+Two names are *known to refer to the same object* if the names
+are known to denote the same object, or if one of the two names is known to
+denote a subcomponent or slice of the object denoted by the others.
 
     AARM Reason: This ensures that names Prefix.Comp and Prefix are
     known to refer to the same object for the purposes of the
@@ -445,48 +465,40 @@
 by copy or by reference.
 @dinss
 @s8<@i<Legality Rules>>
+
+Two @fa<name>s are @i<known to denote the same object> if:
 
-Two @fa<name>s or @fa<prefix>es, @i<N1> and @i<N2>, are @i<known to denote the
-same object> if:
+@xbullet<both @fa<name>s statically denote the same stand-alone object
+or parameter; or>
 
-@xbullet<@i<N1> statically denotes a part of a stand-alone object or parameter, and
-@i<N2> statically denotes the same part of the same stand-alone object or
-parameter; or>
-
-@xbullet<@i<N1> is a @fa<selected_component> @i<P1.C1> that represents a
-component, @i<N2> is a @fa<selected_component> @i<P2.C2> that represents a
-component, @fa<prefix>es @i<P1> and @i<P2> are known to denote the same object,
-and selectors @i<C1> and @i<C2> are the same; or>
-
-@xbullet<@i<N1> is a dereference (implicit or explicit) of @i<P1>, @i<N2> is a
-dereference (implicit or explicit) of @i<P2>, and @fa<prefix>es @i<P1> and
-@i<P2> are known to denote the same object; or>
-
-@xbullet<@i<N1> is an @fa<indexed_component> @i<P1>(@i<I1>,...), @i<N2> is an
-@fa<indexed_component> @i<P2>(@i<I2>,...), the @fa<prefix> @i<P1> is known to
-denote the same object as the @fa<prefix> @i<P2>, and for each index of the
-@fa<indexed_component>, @i<I1> and @i<I2> are static expressions with the same
-value, or @i<I1> and @i<I2> are names that are known to denote the same object;
-or>
-
-@xbullet<@i<N1> and @i<N2> are @fa<slice>s, their @fa<prefix>es are known to denote
-the same object, and the two @fa<slice>s have statically matching index constraints;
-or>
-
-@xbullet<@i<N2> is a @fa<slice> whose @fa<prefix> is known to denote the same object as
-@i<N1>, and the index constraint of @i<N2> statically matches the constraint
-@i<N1>'First .. @i<N1>'Last; or>
-
-@xbullet<@i<N1> is a @fa<slice> whose @fa<prefix> is known to denote the same object as
-@i<N2>, and the index constraint of @i<N1> statically matches the constraint
-@i<N2>'First .. @i<N2>'Last.>
-
-For the purpose of evaluating these rules, if @i<N> denotes a visible renaming
-of name @i<R>, @i<R> shall be used in the rules instead of @i<N>.
-
-Two @fa<name>s @i<N1> and @i<N2> are @i<known to refer to the same object> if
-@i<N1> and @i<N2> are known to denote the same object, or if @i<N1> is known to
-denote a subcomponent of the object denoted by @i<N2>, or vice-versa.
+@xbullet<both @fa<name>s are @fa<selected_component>s, their @fa<prefix>es are
+known to denote the same object, and their @fa<selector_name>s denote the
+same component; or>
+
+@xbullet<both @fa<name>s are dereferences (implicit or explicit), the
+dereferenced @fa<name>s are known to denote the same object,
+and both @fa<name>s have the same immediately enclosing statement or
+declaration; or>
+
+@xbullet<both @fa<name>s are @fa<indexed_component>s, their @fa<prefix>es are
+known to denote the same object, and each of the pairs of corresponding
+index values are either static expressions with the same value
+or @fa<name>s that are known to denote the same object; or>
+
+@xbullet<both @fa<name>s are @fa<slice>s, their @fa<prefix>es are known to
+denote the same object, and the two @fa<slice>s have statically matching
+index constraints; or
+
+@xbullet<one of the two @fa<name>s statically denotes a renaming declaration
+whose renamed @i<object_>@fa<name> is known to denote the same object
+as the other @fa<name>; or
+
+@xbullet<both @fa<name>s are known to denote the same object as a third
+@fa<name>.>
+
+Two @fa<name>s are @i<known to refer to the same object> if the @fa<name>s
+are known to denote the same object, or if one of the two @fa<name>s is known to
+denote a subcomponent or slice of the object denoted by the others.
 
 If a call @i<C> has two or more parameters of mode @b<in out> or @b<out> that
 are of an elementary type, then the call is legal only if:

Questions? Ask the ACAA Technical Agent