From c95f21001dc9b7dbe717ef84924220192c7b48ae Mon Sep 17 00:00:00 2001 From: Gary Dismukes Date: Sun, 5 Jul 2020 13:29:02 -0400 Subject: [PATCH] [Ada] AI12-0170: Abstract subprogram calls in class-wide precond exprs gcc/ada/ * sem_disp.adb (Check_Dispatching_Context): When the enclosing subprogram is abstract, bypass early return if the call is tag-indeterminate, to continue with the later error checking. --- gcc/ada/sem_disp.adb | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gcc/ada/sem_disp.adb b/gcc/ada/sem_disp.adb index 67a8cdf..cf54337 100644 --- a/gcc/ada/sem_disp.adb +++ b/gcc/ada/sem_disp.adb @@ -575,12 +575,16 @@ package body Sem_Disp is -- Similarly, if this is a pre/postcondition for an abstract -- subprogram, it may call another abstract function which is -- a primitive of an abstract type. The call is non-dispatching - -- but will be legal in overridings of the operation. + -- but will be legal in overridings of the operation. However, + -- if the call is tag-indeterminate we want to continue with + -- with the error checking below, as this case is illegal even + -- for abstract subprograms (see AI12-0170). elsif (Is_Subprogram (Scop) or else Chars (Scop) = Name_Postcondition) and then - (Is_Abstract_Subprogram (Scop) + ((Is_Abstract_Subprogram (Scop) + and then not Is_Tag_Indeterminate (N)) or else (Nkind (Parent (Scop)) = N_Procedure_Specification and then Null_Present (Parent (Scop)))) -- 2.7.4