+2015-10-16 Ed Schonberg <schonberg@adacore.com>
+
+ * sem_ch13.adb (Build_Predicate_Functions): The expression for
+ the predicate is side-effect free if it does not contain any
+ variable references.
+
+2015-10-16 Bob Duff <duff@adacore.com>
+
+ * a-convec.adb ("="): Previous version depended
+ on "=" composing, but that doesn't quite work -- we want the "="
+ operator passed in to the generic. So we need a loop after all.
+
+2015-10-16 Yannick Moy <moy@adacore.com>
+
+ * sem_util.adb (Is_Object_Reference): Attribute 'Loop_Entry produces
+ an object.
+ * sem_ch6.adb: Minor fix in comment.
+
2015-10-16 Bob Duff <duff@adacore.com>
* a-contai.ads: Add two check names: Container_Checks and
---------
overriding function "=" (Left, Right : Vector) return Boolean is
- begin
-- Per AI05-0022, the container implementation is required to detect
-- element tampering by a generic actual subprogram.
- declare
- Lock_Left : With_Lock (Left.TC'Unrestricted_Access);
- Lock_Right : With_Lock (Right.TC'Unrestricted_Access);
- Left_Valid : Elements_Array renames
- Left.Elements.EA (Index_Type'First .. Left.Last);
- Right_Valid : Elements_Array renames
- Right.Elements.EA (Index_Type'First .. Right.Last);
- begin
- return Left_Valid = Right_Valid;
- end;
+ Lock_Left : With_Lock (Left.TC'Unrestricted_Access);
+ Lock_Right : With_Lock (Right.TC'Unrestricted_Access);
+ begin
+ if Left.Last /= Right.Last then
+ return False;
+ end if;
+
+ for J in Index_Type range Index_Type'First .. Left.Last loop
+ if Left.Elements.EA (J) /= Right.Elements.EA (J) then
+ return False;
+ end if;
+ end loop;
+
+ return True;
end "=";
------------
-- Static predicate functions are always side-effect free, and
-- in most cases dynamic predicate functions are as well. Mark
-- them as such whenever possible, so redundant predicate checks
- -- can be optimized.
-
- -- Shouldn't Variable_Ref be True for Side_Effect_Free call ???
+ -- can be optimized. If there is a variable reference within the
+ -- expression, the function is not pure.
if Expander_Active then
- Set_Is_Pure (SId, Side_Effect_Free (Expr));
+ Set_Is_Pure (SId,
+ Side_Effect_Free (Expr, Variable_Ref => True));
Set_Is_Inlined (SId);
end if;
end;
Item : Node_Id;
begin
- -- Check for unanalyzed aspects in the body that will generate a
- -- contract.
+ -- Check for aspects that may generate a contract
if Present (Aspect_Specifications (N)) then
Item := First (Aspect_Specifications (N));
while Present (Item) loop
- if Is_Contract_Annotation (Item) then
+ if Is_Subprogram_Contract_Annotation (Item) then
return True;
end if;
Item := First (Decls);
while Present (Item) loop
if Nkind (Item) = N_Pragma
- and then Is_Contract_Annotation (Item)
+ and then Is_Subprogram_Contract_Annotation (Item)
then
return True;
end if;
when N_Function_Call =>
return Etype (N) /= Standard_Void_Type;
- -- Attributes 'Input, 'Old and 'Result produce objects
+ -- Attributes 'Input, 'Loop_Entry, 'Old and 'Result produce
+ -- objects.
when N_Attribute_Reference =>
return
- Nam_In
- (Attribute_Name (N), Name_Input, Name_Old, Name_Result);
+ Nam_In (Attribute_Name (N), Name_Input,
+ Name_Loop_Entry,
+ Name_Old,
+ Name_Result);
when N_Selected_Component =>
return