From 43057533fe24b3bbcc08f7e094af6fcaf58f279e Mon Sep 17 00:00:00 2001 From: Yannick Moy <moy@adacore.com> Date: Fri, 28 Jul 2023 09:17:41 +0200 Subject: [PATCH] ada: Crash in GNATprove due to wrong detection of inlining When a function is called in a predicate, it was not properly detected as not always inlined in GNATprove mode, which led to crashes later during analysis. Fixed now. gcc/ada/ * sem_res.adb (Resolve_Call): Always call Cannot_Inline so that subprogram called is marked as not always inlined. --- gcc/ada/sem_res.adb | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb index ac0c60f5f22d..9755e4d14a6d 100644 --- a/gcc/ada/sem_res.adb +++ b/gcc/ada/sem_res.adb @@ -7330,30 +7330,32 @@ package body Sem_Res is or else Is_Invariant_Procedure (Current_Subprogram) or else Is_DIC_Procedure (Current_Subprogram)) then - if Present (Body_Id) - and then Present (Body_To_Inline (Nam_Decl)) - then + declare + Issue_Msg : constant Boolean := + Present (Body_Id) + and then Present (Body_To_Inline (Nam_Decl)); + begin if Is_Predicate_Function (Current_Subprogram) then Cannot_Inline ("cannot inline & (inside predicate)?", - N, Nam_UA); + N, Nam_UA, Suppress_Info => not Issue_Msg); elsif Is_Invariant_Procedure (Current_Subprogram) then Cannot_Inline ("cannot inline & (inside invariant)?", - N, Nam_UA); + N, Nam_UA, Suppress_Info => not Issue_Msg); elsif Is_DIC_Procedure (Current_Subprogram) then Cannot_Inline ("cannot inline & (inside Default_Initial_Condition)?", - N, Nam_UA); + N, Nam_UA, Suppress_Info => not Issue_Msg); else Cannot_Inline ("cannot inline & (inside expression function)?", - N, Nam_UA); + N, Nam_UA, Suppress_Info => not Issue_Msg); end if; - end if; + end; -- Cannot inline a call inside the definition of a record type, -- typically inside the constraints of the type. Calls in -- GitLab