This is the same bug as PR ada/123857, but at a nested level, and the fix is
the same 1-liner but at a different place.
Tested on x86-64/Linux, applied on the mainline.
Jakub or Richard, I'd like to backport it for the 16.2 release too, since it's
again a trivial 1-liner that cannot break anything. Thanks in advance.
2026-08-01 Eric Botcazou <[email protected]>
PR ada/126553
* exp_attr.adb (Build_Record_VS_Func.Validate_Field): Do nothing
if the field is of an Unchecked_Union type.
2026-08-01 Eric Botcazou <[email protected]>
* gnat.dg/unchecked_union5.adb: New test.
--
Eric Botcazoudiff --git a/gcc/ada/exp_attr.adb b/gcc/ada/exp_attr.adb
index 15219a73c27..6ed2de30cb8 100644
--- a/gcc/ada/exp_attr.adb
+++ b/gcc/ada/exp_attr.adb
@@ -781,9 +781,12 @@ package body Exp_Attr is
if Field_Nam in Name_uObject | Name_uParent | Name_uTag then
null;
- -- Do not process fields without any scalar components
+ -- Do not process fields without any scalar components, or whose type
+ -- is an unchecked union since we cannot know where they are.
- elsif not Scalar_Part_Present (Field_Typ) then
+ elsif not Scalar_Part_Present (Field_Typ)
+ or else Is_Unchecked_Union (Field_Typ)
+ then
null;
-- Otherwise the field needs to be validated. Use Make_Identifier
-- { dg-do compile }
-- { dg-options "-gnateV" }
procedure Unchecked_Union5 is
type R (Bytes_Mode : Boolean := False) is record
case Bytes_Mode is
when True =>
A : Boolean;
when False =>
B : Boolean;
end case;
end record with Unchecked_Union;
type T is record
Data : R;
end record;
function F (Message : T) return Integer is (0);
begin
null;
end;