From 40b0325ba5b779e36d24f61b72faf2d0450671c4 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 23 Oct 2025 19:20:49 +0200 Subject: [PATCH] ada: Fix ancient bug in pragma Suppress (Alignment_Check) The recent change that streamlined the implementation of alignment checks has uncovered an ancient bug in the implementation of pragma Suppress on a specific object: pragma Suppress (Alignment_Check, A); The pragma would work only if placed before the address clause: A : Integer; pragma Suppress (Alignment_Check, A); for A'Address use ... but not if placed (just) after it: A : Integer; for A'Address use ... pragma Suppress (Alignment_Check, A); which seems unfriendly at best. gcc/ada/ChangeLog: * sem_prag.adb (Analyze_Pragma) : For Alignment_Check on a specific object with an address clause and no alignment clause, toggle the Check_Address_Alignment flag present on the address clause. --- gcc/ada/sem_prag.adb | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/gcc/ada/sem_prag.adb b/gcc/ada/sem_prag.adb index 0ebf421fc96..88558a35478 100644 --- a/gcc/ada/sem_prag.adb +++ b/gcc/ada/sem_prag.adb @@ -11995,6 +11995,26 @@ package body Sem_Prag is if Is_First_Subtype (E) and then Etype (E) /= E then Suppress_Unsuppress_Echeck (Etype (E), C); end if; + + -- For the alignment check of an object with an address clause, + -- we want the pragma to be taken into account even if it comes + -- after the address clause: + + -- A : Integer; + -- for A'Address use ... + -- pragma Suppress (Alignment_Check, A); + + -- When there is also an alignment clause, the check is generated + -- unconditionally, see Analyze_Attribute_Definition_Clause. + + if C = Alignment_Check + and then not Is_Type (E) + and then Present (Address_Clause (E)) + and then No (Alignment_Clause (E)) + then + Set_Check_Address_Alignment + (Address_Clause (E), not Suppress_Case); + end if; end Suppress_Unsuppress_Echeck; -- Start of processing for Process_Suppress_Unsuppress -- 2.47.3