From: Viljar Indus Date: Wed, 30 Jul 2025 07:32:52 +0000 (+0300) Subject: ada: Fix resolution of assertion levels X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=17fd732c4868fd5484e5bf097d881f31d7961bbf;p=thirdparty%2Fgcc.git ada: Fix resolution of assertion levels Unsuccessful preanalyze_and_resolve still marks identifiers as Any_Id. Override that result if an identifier matched an assertion level. gcc/ada/ChangeLog: * ghost.adb (Assertion_Level_From_Arg): Ensure that assertion level is stored as the entity for its reference. (Enables_Ghostness): Derive the result from whether or not the an argument indicated an assertion level. * tbuild.adb (Make_Assertion_Level): ensure that assertion levels have a standard scope. --- diff --git a/gcc/ada/ghost.adb b/gcc/ada/ghost.adb index 4af4e4be93e..574f7f2cda4 100644 --- a/gcc/ada/ghost.adb +++ b/gcc/ada/ghost.adb @@ -161,11 +161,13 @@ package body Ghost is -- Alternatively the argument could be an Assertion_Level - if Nkind (Expr) = N_Identifier - and then Present (Get_Assertion_Level (Chars (Expr))) - then + if Nkind (Expr) = N_Identifier then Level := Get_Assertion_Level (Chars (Expr)); if Present (Level) then + -- The identifier resolved to an assertion level. Override the + -- Any_Id from a failed resolution in pre-analysis. + + Set_Entity (Expr, Level); return Level; end if; end if; @@ -1774,31 +1776,11 @@ package body Ghost is ----------------------- function Enables_Ghostness (Arg : Node_Id) return Boolean is - Expr : constant Node_Id := Get_Pragma_Arg (Arg); - begin - -- Aspect Ghost without an expression enables ghostness - - if No (Expr) then - return True; - end if; + -- Ghostness is enabled if the argument implies a default assertion + -- level or it is explicitly a reference to an assertion level. - -- Check if the expression matches a static boolean expression first - - Preanalyze_And_Resolve_Without_Errors (Expr); - if Is_OK_Static_Expression (Expr) then - return Is_True (Expr_Value (Expr)); - end if; - - -- Alternatively the argument could be an Assertion_Level - - if Nkind (Expr) = N_Identifier - and then Present (Get_Assertion_Level (Chars (Expr))) - then - return True; - end if; - - return False; + return Present (Assertion_Level_From_Arg (Arg)); end Enables_Ghostness; -- Local variables diff --git a/gcc/ada/tbuild.adb b/gcc/ada/tbuild.adb index 57ea93260f1..2840707f2e9 100644 --- a/gcc/ada/tbuild.adb +++ b/gcc/ada/tbuild.adb @@ -162,6 +162,7 @@ package body Tbuild is begin Mutate_Ekind (Level, E_Assertion_Level); Set_Etype (Level, Standard_Void_Type); + Set_Scope (Level, Standard_Standard); return Level; end Make_Assertion_Level;