+2019-08-14 Yannick Moy <moy@adacore.com>
+
+ * sem_disp.adb (Check_Dispatching_Operation): Update assertion
+ for the separate declarations created in GNATprove mode.
+ * sem_disp.ads (Is_Overriding_Subprogram): Update comment.
+ * sem_elab.adb (SPARK_Processor): Fix test for checking of
+ overriding primitives.
+
2019-08-14 Eric Botcazou <ebotcazou@adacore.com>
* inline.adb (Add_Inlined_Body): Tweak comments.
-- overridden primitives. The wrappers include checks on these
-- modified conditions. (AI12-113).
+ -- 5. Declarations built for subprograms without separate spec which
+ -- are eligible for inlining in GNATprove (inside
+ -- Sem_Ch6.Analyze_Subprogram_Body_Helper).
+
if Present (Old_Subp)
and then Present (Overridden_Operation (Subp))
and then Is_Dispatching_Operation (Old_Subp)
or else Get_TSS_Name (Subp) = TSS_Stream_Read
or else Get_TSS_Name (Subp) = TSS_Stream_Write
- or else Present (Contract (Overridden_Operation (Subp))));
+ or else Present (Contract (Overridden_Operation (Subp)))
+
+ or else GNATprove_Mode);
Check_Controlling_Formals (Tagged_Type, Subp);
Override_Dispatching_Operation (Tagged_Type, Old_Subp, Subp);
-- Returns True if E is a null procedure that is an interface primitive
function Is_Overriding_Subprogram (E : Entity_Id) return Boolean;
- -- Returns True if E is an overriding subprogram
+ -- Returns True if E is an overriding subprogram and False otherwise, in
+ -- particular for an inherited subprogram.
function Is_Tag_Indeterminate (N : Node_Id) return Boolean;
-- Returns true if the expression N is tag-indeterminate. An expression
with Sem_Cat; use Sem_Cat;
with Sem_Ch7; use Sem_Ch7;
with Sem_Ch8; use Sem_Ch8;
+with Sem_Disp; use Sem_Disp;
with Sem_Prag; use Sem_Prag;
with Sem_Util; use Sem_Util;
with Sinfo; use Sinfo;
begin
-- Nothing to do for predefined primitives because they are
-- artifacts of tagged type expansion and cannot override source
- -- primitives.
+ -- primitives. Nothing to do as well for inherited primitives as
+ -- the check concerns overridding ones.
- if Is_Predefined_Dispatching_Operation (Prim) then
+ if Is_Predefined_Dispatching_Operation (Prim)
+ or else not Is_Overriding_Subprogram (Prim)
+ then
return;
end if;