]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
ada: Fix the detection of configuration pragmas
authorViljar Indus <indus@adacore.com>
Wed, 19 Mar 2025 09:28:13 +0000 (11:28 +0200)
committerMarc Poulhiès <dkm@gcc.gnu.org>
Tue, 10 Jun 2025 07:32:04 +0000 (09:32 +0200)
Some pragma nodes like the ones for Assertion_Policy are
replaced by a Null_Statement. This is not taken into account
when analyzing if the pragma is a configuration pragma.

gcc/ada/ChangeLog:

* sem_prag.adb (Is_Configuration_Pragma): Check that nodes
preceding the pragma are pragma nodes or originally were
pragma nodes.

gcc/ada/sem_prag.adb

index 688ccc7c007294157673b05ed55dbef3644c5944..2fc3698a67bf72afe0b9a400de7d73f93c3ce245 100644 (file)
@@ -8087,10 +8087,26 @@ package body Sem_Prag is
       --  the test below also permits use in a configuration pragma file.
 
       function Is_Configuration_Pragma return Boolean is
+         function Is_Pragma_Node (Prg : Node_Id) return Boolean is
+           (Nkind (Prg) = N_Pragma
+            or else
+            (Present (Original_Node (Prg))
+             and then Nkind (Original_Node (Prg)) = N_Pragma));
+         --  Returns true whether the node is a pragma or was originally a
+         --  pragma.
+         --
+         --  Note that some pragmas like Assertion_Policy are rewritten as
+         --  Null_Statment nodes but we still need to make sure here that the
+         --  original node was a pragma node.
+
+         --  Local variables
+
          Lis : List_Id;
          Par : constant Node_Id := Parent (N);
          Prg : Node_Id;
 
+      --  Start of processing for Is_Configuration_Pragma
+
       begin
          --  Don't evaluate List_Containing (N) if Parent (N) could be
          --  an N_Aspect_Specification node.
@@ -8119,7 +8135,7 @@ package body Sem_Prag is
             loop
                if Prg = N then
                   return True;
-               elsif Nkind (Prg) /= N_Pragma then
+               elsif not Is_Pragma_Node (Prg) then
                   return False;
                end if;