+2017-04-25 Bob Duff <duff@adacore.com>
+
+ * sem_ch8.adb (Use_One_Type): If a use_type_clause
+ is redundant, set its Used_Operations to empty. This is only
+ necessary for use clauses that appear in the parent of a generic
+ child unit, because those use clauses get reanalyzed when we
+ instantiate the generic, and we don't want the Used_Operations
+ carried over from the original context (where it was probably
+ not redundant).
+
+2017-04-25 Hristian Kirtchev <kirtchev@adacore.com>
+
+ * exp_ch6.adb: Minor reformatting.
+
2017-04-25 Bob Duff <duff@adacore.com>
* sem_prag.adb (Process_Restrictions_Or_Restriction_Warnings):
Attribute_Name => Name_Tag);
end if;
- if not CodePeer_Mode then
- -- CodePeer doesn't do anything useful with
- -- Ada.Tags.Type_Specific_Data components
+ -- CodePeer does not do anything useful with
+ -- Ada.Tags.Type_Specific_Data components.
+ if not CodePeer_Mode then
Insert_Action (Exp,
Make_Raise_Program_Error (Loc,
Condition =>
Right_Opnd =>
Make_Integer_Literal (Loc,
Scope_Depth (Enclosing_Dynamic_Scope (Scope_Id)))),
- Reason => PE_Accessibility_Check_Failed));
+ Reason => PE_Accessibility_Check_Failed));
end if;
end;
("incomplete type from limited view "
& "cannot appear in use clause", Id);
+ -- If the use clause is redundant, Used_Operations will usually be
+ -- empty, but we need to set it to empty here in one case: If we are
+ -- instantiating a generic library unit, then we install the ancestors
+ -- of that unit in the scope stack, which involves reprocessing use
+ -- clauses in those ancestors. Such a use clause will typically have a
+ -- nonempty Used_Operations unless it was redundant in the generic unit,
+ -- even if it is redundant at the place of the instantiation.
+
+ elsif Redundant_Use (Id) then
+ Set_Used_Operations (Parent (Id), New_Elmt_List);
+
-- If the subtype mark designates a subtype in a different package,
-- we have to check that the parent type is visible, otherwise the
-- use type clause is a noop. Not clear how to do that???
- elsif not Redundant_Use (Id) then
+ else
Set_In_Use (T);
-- If T is tagged, primitive operators on class-wide operands