https://gcc.gnu.org/g:4631b74b97fbe0e411fe60a1cc0f8432c4eb694e

commit r16-1340-g4631b74b97fbe0e411fe60a1cc0f8432c4eb694e
Author: Piotr Trojanek <troja...@adacore.com>
Date:   Mon Mar 17 13:20:53 2025 +0100

    ada: Reject component-related aspects on formal non-array types
    
    In Ada 2022 aspects Atomic_Components and Volatile_Components can be 
specified
    for a formal array type, but they were wrongly accepted on any formal type.
    
    Also, we don't need to check if the corresponding pragmas appear in Ada 2022
    mode, because generic formal parameters can't have explicit representation
    pragmas in any Ada version and can only have aspects since Ada 2022.
    
    gcc/ada/ChangeLog:
    
            * sem_prag.adb (Analyze_Pragma): Fix conditions for legality checks 
on
            formal type declarations.

Diff:
---
 gcc/ada/sem_prag.adb | 11 ++++-------
 1 file changed, 4 insertions(+), 7 deletions(-)

diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb
index 01983f9d89fd..688ccc7c0072 100644
--- a/gcc/ada/sem_prag.adb
+++ b/gcc/ada/sem_prag.adb
@@ -14677,21 +14677,18 @@ package body Sem_Prag is
 
             D := Declaration_Node (E);
 
-            if (Nkind (D) = N_Full_Type_Declaration and then Is_Array_Type (E))
+            if (Nkind (D) in N_Full_Type_Declaration
+                           | N_Formal_Type_Declaration
+                  and then Is_Array_Type (E))
               or else
                 (Nkind (D) = N_Object_Declaration
                    and then Ekind (E) in E_Constant | E_Variable
                    and then Nkind (Object_Definition (D)) =
                                        N_Constrained_Array_Definition)
-              or else
-                 (Ada_Version >= Ada_2022
-                   and then Nkind (D) = N_Formal_Type_Declaration)
             then
                --  The flag is set on the base type, or on the object
 
-               if Nkind (D) in N_Full_Type_Declaration
-                             | N_Formal_Type_Declaration
-               then
+               if Is_Array_Type (E) then
                   E := Base_Type (E);
                end if;

Reply via email to