https://gcc.gnu.org/g:1fdbcef462b5ffde1d03eda79c2db41829b84a46
commit r15-10746-g1fdbcef462b5ffde1d03eda79c2db41829b84a46 Author: Eric Botcazou <[email protected]> Date: Wed Jan 28 23:52:41 2026 +0100 Ada: Fix crash on Unchecked_Union parameter with -gnateV -gnata The problem is that the compiler generates 'Valid_Scalars for a formal parameter of an Unchecked_Union type, which cannot work because it is not possible to find out where the scalars are in it, given that the parameter does not contain the discriminants of its Unchecked_Union type. This also changes -gnateV to work without the need for -gnata, as there is no mention of this dependence in the documentation. gcc/ada/ PR ada/123857 * checks.adb (Apply_Parameter_Validity_Checks.Add_Validity_Check): Set Is_Checked on the generated {Pre,Post}_Condition pragma and bail out if the parameter is of an Unchecked_Union type. gcc/testsuite/ * gnat.dg/unchecked_union4.adb: New test. Diff: --- gcc/ada/checks.adb | 14 ++++++++++---- gcc/testsuite/gnat.dg/unchecked_union4.adb | 19 +++++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/gcc/ada/checks.adb b/gcc/ada/checks.adb index 1b1ff4c5ea5b..d9b1c9a457a9 100644 --- a/gcc/ada/checks.adb +++ b/gcc/ada/checks.adb @@ -2531,6 +2531,10 @@ package body Checks is Chars => Name_Check, Expression => Expr))); + -- The check is enabled unconditionally + + Set_Is_Checked (Prag); + -- Add a message unless exception messages are suppressed if not Exception_Locations_Suppressed then @@ -2588,9 +2592,12 @@ package body Checks is if Is_Scalar_Type (Typ) then Nam := Name_Valid; - -- For any non-scalar with scalar parts, generate 'Valid_Scalars test + -- For non-scalars with scalar parts, generate 'Valid_Scalars test, + -- except for unchecked unions since we cannot know where they are. - elsif Scalar_Part_Present (Typ) then + elsif Scalar_Part_Present (Typ) + and then not Is_Unchecked_Union (Typ) + then Nam := Name_Valid_Scalars; -- No test needed for other cases (no scalars to test) @@ -2682,8 +2689,7 @@ package body Checks is return; end if; - -- Inspect all the formals applying aliasing and scalar initialization - -- checks where applicable. + -- Apply scalar initialization checks to formals where applicable Formal := First_Formal (Subp); while Present (Formal) loop diff --git a/gcc/testsuite/gnat.dg/unchecked_union4.adb b/gcc/testsuite/gnat.dg/unchecked_union4.adb new file mode 100644 index 000000000000..268c99abd6d9 --- /dev/null +++ b/gcc/testsuite/gnat.dg/unchecked_union4.adb @@ -0,0 +1,19 @@ +-- { dg-do compile } +-- { dg-options "-gnateV" } + +procedure Unchecked_Union4 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; + + function F (Message : R) return Integer is (0); + +begin + null; +end;
